-
Notifications
You must be signed in to change notification settings - Fork 0
/
scratch.py
116 lines (90 loc) · 3.41 KB
/
scratch.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import random
# inicializacao de variaveis (tbm para que sejam globais)
QuantidadeItens = 0
TAM_POP = 0
QTD_ITE = 0
intervalo = 0
TAXA_MUTACAO = 0
CAPACIDADE_MOCHILA = 0
PESO_OBJ_MAX = 0
PESO_OBJ_MIN = 0
VALOR_OBJ_MAX = 0
VALOR_OBJ_MIN = 0
class Item(object):
def __init__(self, v, p):
self.valor = v
self.peso = p
def geraPopulacaoinicial(tamanhodapop, qtdItens):
return [geraCromossomo(qtdItens) for x in range (0, tamanhodapop)]
def geraCromossomo(qtdItens):
return [random.randint(0, 1) for x in range(0, qtdItens)]
def geraItens():
ITEMS = [Item(random.randint(VALOR_OBJ_MIN, VALOR_OBJ_MAX), random.randint(PESO_OBJ_MIN, PESO_OBJ_MAX)) for x in range(0, QuantidadeItens)]
return ITEMS
def main():
QuantidadeItens = int(input('Insira qual deve ser a quantidade de itens: '))
TAM_POP = int(input('Insira qual deve ser o tamanho da população: '))
QTD_ITE = int(input('Insira qual deve ser o numero de iteracoes: '))
intervalo = int(input('Insira qual deve ser o intervalo de geracoes: '))
TAXA_MUTACAO = int(input('Insira qual deve ser a taxa de mutacoes: '))
CAPACIDADE_MOCHILA = int(input('Insira qual deve ser o peso maximo da mochila: '))
PESO_OBJ_MAX = int(input('Insira qual deve ser o peso maximo dos objetos: '))
PESO_OBJ_MIN = int(input('Insira qual deve ser o peso minimo dos objetos '))
VALOR_OBJ_MAX = int(input('Insira qual deve ser o valor maximo dos objetos: '))
VALOR_OBJ_MIN = int(input('Insira qual deve ser o valor minimo dos objetos: '))
geracao = 1
populacao = geraPopulacaoinicial(TAM_POP, QuantidadeItens) #gera nova população
for g in range(0, QTD_ITE):
# A linha abaixo organiza a população colocando os individuos com fitness mais alto antes
populacao = sorted(populacao, key=lambda x: fitness(x), reverse=True)
for i in populacao:
print('{} fitness: {}'.format(str(i), fitness(i)))
populacao = evolutiva(populacao)
geracao += 1
print(populacao)
def fitness():
indice = 0
for i in target:
if indice >= QuantidadeItens11:
break
if (i == 1):
valor_total += ITEMS[indice].valor
peso_total += ITEMS[indice].peso
indice += 1
if peso_total > CAPACIDADE_MOCHILA:
return 0 #se o peso total for maior que a capacidade da mochila fitness = 0
else:
return valor_total
def evolutiva(populacao_):
tamanhoPais = int(intervalo*TAM_POP)
pais = populacao_[:tamanhoPais]
naoPais = populacao_[tamanhoPais:]
#TODO Roleta dos pais
for np in naoPais:
if 0.5 > random.random():
pais.append(np)
#TODO Roleta da mutacao
for p in pais:
if TAXA_MUTACAO > random.random():
mutacao(p)
#TODO Crossover
filhos = []
tamanho = TAM_POP - tamanhoPais
while len(filhos) < tamanho:
cromossomo1 = populacao_[random.randit(0,len(pais))]
cromossomo2 = populacao_[random.randit(0,len(pais))]
aux = len(cromossomo1)//2
filho = cromossomo1[:aux] + cromossomo2[aux:]
if TAXA_MUTACAO > random.random():
mutacao(filho)
filhos.append(filho)
pais.extend(filhos)
return filhos
#TODO funcao de mutacao
def mutacao(individuo):
r = random.randint(0,len(individuo)-1)
if individuo[r] == 1:
individuo[r] = 0
else:
individuo[r] = 1
main()