こちらのコード(遺伝的アルゴリズムを用いたOneMax問題)なのですが、
#エリートを選択の部分で
elites = eva[:int(len(pop)*elite_rate)]
という一次元配列を作成しているにも関わらず、
#突然変異、交叉の部分では
child = mutate(elites[m][1])
や、
child = two_point_crossover(elites[m1][1], elites[m2][1])
と、二次元配列の扱いをしていることが理解できません。
どういうことなのでしょうか。
エラー発生しません。
python
1import random 2import copy 3 4# パラメータ 5gene_length = 10 # 遺伝子長 6individual_length = 10 # 個体数 7generation = 20 # 世代数 8mutate_rate = 0.1 # 突然変異の確率 9elite_rate = 0.2 # エリート選択の割合 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 two_point_crossover(parent1, parent2): 28 r1 = random.randint(0, gene_length-1) 29 r2 = random.randint(r1, gene_length-1) 30 child = copy.deepcopy(parent1) 31 child[r1:r2] = parent2[r1:r2] 32 return child 33 34 35def mutate(parent): 36 r = random.randint(0, gene_length-1) 37 child = copy.deepcopy(parent) 38 child[r] = 1 if child[r]==0 else 0 39 return child 40 41 42def main(): 43 # 初期個体生成 44 pop = evaluate([(fitness(p), p) for p in get_population()]) 45 print('Generation: 0') 46 print('Min : {}'.format(pop[-1][0])) 47 print('Max : {}'.format(pop[0][0])) 48 print('--------------------------') 49 50 for g in range(generation): 51 print('Generation: ' + str(g+1)) 52 53 # エリートを選択 54 eva = evaluate(pop) 55 elites = eva[:int(len(pop)*elite_rate)] 56 57 # 突然変異、交叉 58 pop = elites 59 while len(pop) < individual_length: 60 if random.random() < mutate_rate: 61 m = random.randint(0, len(elites)-1) 62 child = mutate(elites[m][1]) 63 else: 64 m1 = random.randint(0, len(elites)-1) 65 m2 = random.randint(0, len(elites)-1) 66 child = two_point_crossover(elites[m1][1], elites[m2][1]) 67 pop.append((fitness(child), child)) 68 69 # 評価 70 eva = evaluate(pop) 71 pop = eva 72 73 print('Min : {}'.format(pop[-1][0])) 74 print('Max : {}'.format(pop[0][0])) 75 print('--------------------------') 76 print('Result : {}'.format(pop[0])) 77 78 79if __name__ == '__main__': 80 main() 81
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。