トーナメントのようなものを実装したいのですが、for文の範囲がうまくいかず
list index out of range がスローされます。どこが悪いのでしょうか。
問題のコードとエラー、試したこと、全体のコードを記載します。
<問題のコード>
python
1#トーナメント選択 2def select(eva): 3 random.shuffle(eva) 4 tournament = [()] 5 while len(eva) > 1: 6 if len(eva) % 2 != 0: 7 for i in range(1,len(eva),1): 8 if eva[i] < eva[i+1]: 9 tournament.append(eva[i]) 10 else: 11 tournament.append(eva[i+1]) 12 eva = tournament 13 else: 14 for i in range(0,len(eva),1): 15 if eva[i] < eva[i+1]: 16 tournament.append(eva[i]) 17 else: 18 tournament.append(eva[i+1]) 19 eva = tournament 20 return tournament
エラー
python
1 38 else: 2 39 for i in range(0,len(eva),1): 3---> 40 if eva[i] < eva[i+1]: 4 41 tournament.append(eva[i]) 5 42 else: 6 7IndexError: list index out of range 8
<試したこと>
for i in range(0,len(tournament),1):
を、
for i in range(0,len(tournament)-1,1):
for i in range(0,len(tournament)-2,1):
for i in range(0,len(tournament),2):
など、終了条件を-1や-2にするなど、ステップを1から2にするなどしましたが同じエラーのままです。
<全体のコード>
python
1import random 2import copy 3 4random.seed(1870258) 5gene_length = 10 6# 遺伝子長 7individual_length = 10 # 個体数 8generation = 30 # 世代数 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): 28 random.shuffle(eva) 29 tournament = [()] 30 while len(eva) > 1: 31 if len(eva) % 2 != 0: 32 for i in range(1,len(eva),1): 33 if eva[i] < eva[i+1]: 34 tournament.append(eva[i]) 35 else: 36 tournament.append(eva[i+1]) 37 eva = tournament 38 else: 39 for i in range(0,len(eva),1): 40 if eva[i] < eva[i+1]: 41 tournament.append(eva[i]) 42 else: 43 tournament.append(eva[i+1]) 44 eva = tournament 45 return tournament 46 47 48#一点交叉 49def one_point_crossover(parent1, parent2): 50 r1 = random.randint(0, gene_length-1) 51 child1 = copy.deepcopy(parent1) 52 child2 = copy.deepcopy(parent2) 53 child1[r1:gene_length-1] = parent2[r1:gene_length-1] 54 child2[r1:gene_length-1] = parent1[r1:gene_length-1] 55 return child1,child2 56 57 58def main(): 59 # 初期個体生成 60 pop = evaluate([(fitness(p), p) for p in get_population()]) 61 print('Generation: 0') 62 print('Min : {}'.format(pop[-1][0])) 63 print('Max : {}'.format(pop[0][0])) 64 print('--------------------------') 65 66 for g in range(generation): 67 if 10 != pop[0][0] or 10 != pop[-1][0]: 68 69 g += 1 70 print('Generation: ' + str(g)) 71 72 73 eva = evaluate(pop) 74 tournament = select(eva) 75 pop = tournament 76 77 while len(pop) < individual_length: 78 m1 = random.randint(0, len(tournament)-1) 79 m2 = random.randint(0, len(tournament)-1) 80 child1,child2 = one_point_crossover(tournament[m1][1], tournament[m2][1]) 81 pop.append((fitness(child1), child1)) 82 pop.append((fitness(child2), child2)) 83 84 print('Min : {}'.format(pop[-1][0]),' Result : {}'.format(pop[-1])) 85 print('Max : {}'.format(pop[0][0]),' Result : {}'.format(pop[0])) 86 print('--------------------------') 87 else: 88 break 89 90 91 92 print('\n--------------------------End of evolution--------------------------') 93 print('Generation: ' + str(g)) 94 print('Min : {}'.format(pop[-1][0]),' Result : {}'.format(pop[-1])) 95 print('Max : {}'.format(pop[0][0]),' Result : {}'.format(pop[0])) 96 97 98 99if __name__ == '__main__': 100 main()
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。