"Runtime error (TypeErrorException): expected index value, got float" obtained in GHPython node

GA_grasshopper.gh (13.8 KB) original.py (3.9 KB)

Dear, I am trying to implement a python 3 genetic algorithm (original attached) for grasshopper (attached as GH_grasshopper) and I have been encountering an error. I believe there is some difference between the python versions (3.x to 2.x) or even a python x ironpython incompatibility. The code is described below. It also follows the error message.

#####Algorithm:

from random import random

class Produto():
def init(self, nome, espaco, valor):
self.nome = nome
self.espaco = espaco
self.valor = valor

class Individuo():
def init(self, espacos, valores, limite_espacos, geracao=0):
self.espacos = espacos
self.valores = valores
self.limite_espacos = limite_espacos
self.nota_avaliacao = 0
self.espaco_usado = 0
self.geracao = geracao
self.cromossomo =

    for i in range(len(espacos)):
        if random() < 0.5:
            self.cromossomo.append("0")
        else:
            self.cromossomo.append("1")
            
def avaliacao(self):
    nota = 0
    soma_espacos = 0
    for i in range(len(self.cromossomo)):
       if self.cromossomo[i] == '1':
           nota += self.valores[i]
           soma_espacos += self.espacos[i]
    if soma_espacos > self.limite_espacos:
        nota = 1
    self.nota_avaliacao = nota
    self.espaco_usado = soma_espacos
    
def crossover(self, outro_individuo):
    corte = round(random()  * len(self.cromossomo))
    
    filho1 = outro_individuo.cromossomo[0:corte] + self.cromossomo[corte::]
    filho2 = self.cromossomo[0:corte] + outro_individuo.cromossomo[corte::]
    
    filhos = [Individuo(self.espacos, self.valores, self.limite_espacos, self.geracao + 1),
              Individuo(self.espacos, self.valores, self.limite_espacos, self.geracao + 1)]
    filhos[0].cromossomo = filho1
    filhos[1].cromossomo = filho2
    return filhos

if name == ‘main’:
#p1 = Produto(“Iphone 6”, 0.0000899, 2199.12)
lista_produtos =
lista_produtos.append(Produto(“Geladeira Dako”, 0.751, 999.90))
lista_produtos.append(Produto(“Iphone 6”, 0.0000899, 2911.12))
lista_produtos.append(Produto("TV 55’ ", 0.400, 4346.99))
lista_produtos.append(Produto("TV 50’ ", 0.290, 3999.90))
lista_produtos.append(Produto("TV 42’ ", 0.200, 2999.00))
lista_produtos.append(Produto(“Notebook Dell”, 0.00350, 2499.90))
lista_produtos.append(Produto(“Ventilador Panasonic”, 0.496, 199.90))
lista_produtos.append(Produto(“Microondas Electrolux”, 0.0424, 308.66))
lista_produtos.append(Produto(“Microondas LG”, 0.0544, 429.90))
lista_produtos.append(Produto(“Microondas Panasonic”, 0.0319, 299.29))
lista_produtos.append(Produto(“Geladeira Brastemp”, 0.635, 849.00))
lista_produtos.append(Produto(“Geladeira Consul”, 0.870, 1199.89))
lista_produtos.append(Produto(“Notebook Lenovo”, 0.498, 1999.90))
lista_produtos.append(Produto(“Notebook Asus”, 0.527, 3999.00))
#for produto in lista_produtos:
# print(produto.nome)

espacos = []
valores = []
nomes = []
for produto in lista_produtos:
    espacos.append(produto.espaco)
    valores.append(produto.valor)
    nomes.append(produto.nome)
limite = 3

individuo1 = Individuo(espacos, valores, limite)
print("\nIndivĂ­duo 1")
for i in range(len(lista_produtos)):
    if individuo1.cromossomo[i] == '1':
        print("Nome: %s R$ %s " % (lista_produtos[i].nome, lista_produtos[i].valor))
individuo1.avaliacao()
print("Nota = %s" % individuo1.nota_avaliacao)
print("Espaço usado = %s" % individuo1.espaco_usado)

individuo2 = Individuo(espacos, valores, limite)
print("\nIndivĂ­duo 2")
for i in range(len(lista_produtos)):
    if individuo2.cromossomo[i] == '1':
        print("Nome: %s R$ %s " % (lista_produtos[i].nome, lista_produtos[i].valor))
individuo2.avaliacao()
print("Nota = %s" % individuo2.nota_avaliacao)
print("Espaço usado = %s" % individuo2.espaco_usado)

individuo1.crossover(individuo2)

#####output

IndivĂ­duo 1

Nome: TV 42’ R$ 2999.0
Nome: Microondas Panasonic R$ 299.29
Nome: Geladeira Brastemp R$ 849.0
Nome: Notebook Lenovo R$ 1999.9
Nota = 6147.19
Espaço usado = 1.3649

IndivĂ­duo 2
Nome: Iphone 6 R$ 2911.12
Nome: TV 55’ R$ 4346.99
Nome: TV 50’ R$ 3999.9
Nome: Microondas Electrolux R$ 308.66
Nome: Microondas LG R$ 429.9
Nome: Notebook Lenovo R$ 1999.9
Nome: Notebook Asus R$ 3999.0
Nota = 17995.47
Espaço usado = 1.8118899
Runtime error (TypeErrorException): expected index value, got float
Traceback:
line 40, in crossover, “”
line 96, in script

You’re probably passing a float to a function that expects an integer. You can use int(yourFloat) to cast the variable.

Edit: Your corte variable here is a float and you’re using that for slicing a list (which requires an integer):

1 Like

Thanks AndersDeleuran,
it solved my problem. When the algorithm is complete I will share it here for everyone.

2 Likes