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