pythonで遺伝的アルゴリズムを使い、OneMax問題を解くプログラムを作成したいのですが、一様交叉の部分がうまくいっていません。エラーは起きていないのですが、配列に変化が起きていないので交叉の部分がよくないと考えているのですが、原因がわかりません。
何が悪いのか、これを試してはという意見がありましたら教えていただきたいです。
python3
1import random 2import copy 3 4random.seed(1870258) 5gene_length = 10 # 遺伝子長 6individual_length = 10 # 個体数 7generation = 30 # 世代数 8elite_rate = 0.2 # エリート選択の割合 9 10#個体生成 11def get_population(): 12 population = [] 13 for i in range(individual_length): #遺伝子長 14 population.append([random.randint(0,1) for j in range(gene_length)]) #個体数 15 return population 16 17#適応度 18def fitness(pop): 19 return sum(pop) 20 21#評価 22def evaluate(pop): 23 pop.sort(reverse=True) 24 return pop 25 26#エリート選択 27def select(eva,pop): 28 elites = eva[:int(len(pop)*elite_rate)] 29 return elites 30 31#一様交叉 32def cxUniform(parent1, parent2): 33 for i in range(len(parent1)): 34 if random.random() < 0.5: 35 parent1[i], parent2[i] = parent2[i], parent1[i] 36 return random.choice([parent1,parent2]) 37 38def main(): 39 # 初期個体生成 40 pop = evaluate([(fitness(p), p) for p in get_population()]) 41 print('Generation: 0') 42 print('Min : {}'.format(pop[-1][0])) 43 print('Max : {}'.format(pop[0][0])) 44 print('--------------------------') 45 46 for g in range(generation): 47 if 10 != pop[0][0] and 10 != pop[-1][0]: 48 49 g += 1 50 print('Generation: ' + str(g)) 51 52 #選択 53 eva = evaluate(pop) 54 elites = select(eva,pop) 55 56 #交叉 57 new_pop = elites 58 while len(new_pop) < individual_length: 59 m1 = random.randint(0, len(elites)-1) 60 m2 = random.randint(0, len(elites)-1) 61 child = cxUniform(elites[m1][1], elites[m2][1]) 62 new_pop.append((fitness(child), child)) 63 64 new_pop = evaluate(new_pop) 65 66 print('Min : {}'.format(pop[-1][0]),' Result : {}'.format(pop[-1])) 67 print('Max : {}'.format(pop[0][0]),' Result : {}'.format(pop[0])) 68 print('--------------------------') 69 else: 70 break 71 72 73 74 print('\n--------------------------End of evolution--------------------------') 75 print('Generation: ' + str(g)) 76 print('Min : {}'.format(pop[-1][0]),' Result : {}'.format(pop[-1])) 77 print('Max : {}'.format(pop[0][0]),' Result : {}'.format(pop[0])) 78 79 80 81if __name__ == '__main__': 82 main()
実行結果:
Generation: 0
Min : 2
Max : 8
Generation: 1
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 1, 1, 1, 1, 0, 1, 1, 1])
Generation: 2
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 0, 1, 1, 1])
Generation: 3
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 1, 1, 1, 1])
Generation: 4
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 1, 1, 1, 1, 0, 1, 1, 1])
Generation: 5
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 1, 1, 1, 1, 1, 1, 1, 1])
Generation: 6
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 0, 1, 1, 1, 0, 1, 1, 1])
Generation: 7
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 1, 0, 1, 1, 1, 1, 1, 1])
Generation: 8
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 1, 1, 1, 1])
Generation: 9
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 1, 0, 1, 1, 1, 1, 1, 1])
Generation: 10
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 1, 0, 1, 1, 1, 1, 1, 1])
Generation: 11
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 1, 1, 1, 0, 1, 1, 1])
Generation: 12
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 1, 0, 1, 1, 0, 1, 1, 1])
Generation: 13
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 0, 1, 1, 1])
Generation: 14
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 1, 0, 1, 1, 1, 1, 1, 1])
Generation: 15
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 0, 0, 1, 1, 1, 1, 1, 1])
Generation: 16
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 1, 1, 1, 0, 1, 1, 1])
Generation: 17
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 0, 1, 1, 1])
Generation: 18
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 1, 1, 1, 1, 1, 1, 1, 1])
Generation: 19
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 0, 0, 1, 1, 0, 1, 1, 1])
Generation: 20
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 1, 1, 1, 0, 1, 1, 1])
Generation: 21
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
Generation: 22
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 1, 1, 1, 1])
Generation: 23
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 1, 1, 1, 1])
Generation: 24
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 0, 1, 1, 1, 1, 1, 1, 1])
Generation: 25
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 0, 0, 1, 1, 0, 1, 1, 1])
Generation: 26
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 1, 0, 1, 1, 0, 1, 1, 1])
Generation: 27
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 1, 0, 1, 1, 0, 1, 1, 1])
Generation: 28
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 0, 0, 0, 1, 1, 0, 1, 1, 1])
Generation: 29
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 0, 1, 1, 1])
Generation: 30
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 0, 1, 1, 1])
--------------------------End of evolution--------------------------
Generation: 30
Min : 2 Result : (2, [1, 0, 0, 0, 0, 0, 1, 0, 0, 0])
Max : 8 Result : (8, [1, 1, 0, 0, 1, 1, 0, 1, 1, 1])
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。