前提・実現したいこと
Pythonによる遺伝的アルゴリズムを使ったOneMax問題プログラムを参考書を見ながら打ち込んだのですが、以下のエラーが発生してしましす。
原因は、ToolBoxオブジェクトにIndividualがないということらしいのですが、どう改善したらよいのでしょうか?
発生している問題・エラーメッセージ
AttributeError Traceback (most recent call last) <ipython-input-1-6818f7387b43> in <module> 21 toolbox.register("Individual",tools.initRepeat,creator.Individual,toolbox.attr_bool,num_bits) 22 ---> 23 toolbox.register("population",tools.initRepeat,list,toolbox.individual) 24 toolbox.register("evaluate",eval_func) 25 toolbox.register("mate",tools.cxTwoPoint) AttributeError: 'Toolbox' object has no attribute 'individual'
該当のソースコード
Python
import random from deap import base,creator, tools random.seed(7) num_bits = 75 #----適応度関数(1を75個生成し、そのうち45個を1にすることが目標)---- def eval_func(individual): target_sum = 45 return(len(individual) - abs(sum(individual) - target_sum),) #----適応度関数や個体群(遺伝子)を管理するためのオブジェクト生成---- creator.create("FitnessMax",base.Fitness,weight=(1.0,)) creator.create("Individual",list,fitness=creator.FitnessMax) #----toolboxを作成し、関数を定義しながら格納する---- toolbox = base.Toolbox() toolbox.register("attr_bool",random.randint,0,1) toolbox.register("Individual",tools.initRepeat,creator.Individual,toolbox.attr_bool,num_bits) toolbox.register("population",tools.initRepeat,list,toolbox.individual) toolbox.register("evaluate",eval_func) toolbox.register("mate",tools.cxTwoPoint) #交叉 toolbox.register("mutate",tools.mutFlipBit,indpb=0.05) toolbox.register("select",tools.selTournament,tournsize=3) #----初期個体生成---- population = toolbox.population(n=500) probab_crossing,probab_mutating = 0.5,0.2 num_generations = 60 #----個体評価---- print('\n評価開始') fitnesses = list(map(toolbox.evaluate,population)) for ind,fit in zip(population , fitnesses): ind.fitness.values = fit print('\n評価済み個体 : ',len(population)) for g in range(num_generations): print('\n======第' , g , '世代======') #----新世代作成---- offspring = toolbox.select(population,len(population)) offspring = list(map(toolbox.clone,offspring)) #----交叉---- for child1,child2 in zip(offspring[::2],offspring[1::2]): if random.random() < probab_crossing: toolbox.mate(child1,child2) #適応度をリセットする del child1.fitness.values del child2.fitness.values #----突然変異---- for mutant in offspring: if random.random() < probab_mutating: toolbox.mutate(mutant) del mutant.fitness.values #----リセットされた個体を再評価---- invalid_ind = [ind for ind in offspring if not ind.fitness.valid] fitnesses = map(toolbox.evaluate,invalid_ind) for ind , fit in zip(invalid_ind,fitnesses): ind.fitness.values = fit print('Evaluated',len(invalid_ind),'individuals') #----新世代に置き換える---- population[:] = offspring #----進捗を表示---- fits = [ind.fitness.values[0] for ind in population] length = len(poplulation) mean = sum(fits) / length sum2 = sum(x*x for x in fits) std = abs(sum2 / length - mean**2)**0.5 print('最小 = ', min(fits),' , 最大 = ',max(fits)) print('平均 = ',round(mean,2),' , 標準偏差 = ',round(std,2)) #----最終出力---- print('\n======最終評価======') best_ind = tools.selBest(population,1)[0] print('\n最大となるのは : \n',best_ind) print('\n1の個数 : ',sum(best_ind))
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
まだ回答がついていません
会員登録して回答してみよう