#必要なライブラリ,モジュールのインポートーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー import random import random import numpy from deap import algorithms from deap import base from deap import creator from deap import tools #適応度の定義ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー creator.create("FitnessMax", base.Fitness, weights=(1.0,)) #個体の定義ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー """元々遺伝子を保存している個体listに,適応度fitnessというメンバ変数を追加してIndividualクラスを作成""" creator.create("Individual", numpy.ndarray, fitness=creator.FitnessMax) toolbox = base.Toolbox() #1,個体の取りうる値の範囲ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー n_gene = 100 #個体内の遺伝子の個数 min_ind = numpy.ones(n_gene) * -1.0 #取りうる範囲のmax max_ind = numpy.ones(n_gene) * 1.0 #min #個体を生成する関数の定義ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー def create_ind_uniform(min_ind, max_ind): ind = [] for min, max in zip(min_ind, max_ind): ind.append(random.uniform(min, max)) return ind #遺伝子,固体,世代を設定する関数の作成ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー toolbox.register("create_ind", create_ind_uniform, min_ind, max_ind) toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.create_ind) toolbox.register("population", tools.initRepeat, list, toolbox.individual) #2,目的関数の設定ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー def evalOneMax(individual): return sum(individual) #交叉関数の再定義ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー def cxTwoPointCopy(ind1, ind2): size = len(ind1) cxpoint1 = random.randint(1, size) cxpoint2 = random.randint(1, size - 1) if cxpoint2 >= cxpoint1: cxpoint2 += 1 else: # Swap the two cx points cxpoint1, cxpoint2 = cxpoint2, cxpoint1 ind1[cxpoint1:cxpoint2], ind2[cxpoint1:cxpoint2] = ind2[cxpoint1:cxpoint2].copy(), ind1[cxpoint1:cxpoint2].copy() return ind1, ind2 #突然変異関数の再定義ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー def mutUniformDbl(individual, min_ind, max_ind, indpb): size = len(individual) for i, min, max in zip(xrange(size), min_ind, max_ind): if random.random() < indpb: individual[i] = random.uniform(min, max) return individual, #目的関数,交叉,突然変異,選択を求める関数を読み替えるーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー toolbox.register("evaluate", evalOneMax) toolbox.register("mate", cxTwoPointCopy) toolbox.register("mutate", mutUniformDbl, min_ind=min_ind, max_ind=max_ind, indpb=0.05) toolbox.register("select", tools.selTournament, tournsize=3) #3,メイン関数ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー def main(): random.seed(64) pop = toolbox.population(n=300) hof = tools.HallOfFame(1, similar=numpy.array_equal) stats = tools.Statistics(lambda ind: ind.fitness.values) stats.register("avg", numpy.mean) stats.register("std", numpy.std) stats.register("min", numpy.min) stats.register("max", numpy.max) algorithms.eaSimple(pop, toolbox, cxpb=0.5, mutpb=0.2, ngen=40, stats=stats,halloffame=hof) return pop, stats, hof #ここがおかしい?? if __name__ == "__main__": main() --------------------------------------------------------------------------- TypeError Traceback (most recent call last) C:\Users\hashimoto\Anaconda3\lib\site-packages\deap\base.py in setValues(self, values) 184 try: --> 185 self.wvalues = tuple(map(mul, values, self.weights)) 186 except TypeError: TypeError: 'numpy.float64' object is not iterable During handling of the above exception, another exception occurred: TypeError Traceback (most recent call last) <ipython-input-1-b85bc257b291> in <module> 92 93 if __name__ == "__main__": ---> 94 main() <ipython-input-1-b85bc257b291> in main() 87 stats.register("max", numpy.max) 88 ---> 89 algorithms.eaSimple(pop, toolbox, cxpb=0.5, mutpb=0.2, ngen=1000, stats=stats,halloffame=hof) 90 91 return pop, stats, hof C:\Users\hashimoto\Anaconda3\lib\site-packages\deap\algorithms.py in eaSimple(population, toolbox, cxpb, mutpb, ngen, stats, halloffame, verbose) 150 fitnesses = toolbox.map(toolbox.evaluate, invalid_ind) 151 for ind, fit in zip(invalid_ind, fitnesses): --> 152 ind.fitness.values = fit 153 154 if halloffame is not None: C:\Users\hashimoto\Anaconda3\lib\site-packages\deap\base.py in setValues(self, values) 191 "fitness with weights %s." 192 % (self.__class__, values, type(values), --> 193 self.weights)).with_traceback(traceback) 194 195 def delValues(self): C:\Users\hashimoto\Anaconda3\lib\site-packages\deap\base.py in setValues(self, values) 183 def setValues(self, values): 184 try: --> 185 self.wvalues = tuple(map(mul, values, self.weights)) 186 except TypeError: 187 _, _, traceback = sys.exc_info() TypeError: Both weights and assigned values must be a sequence of numbers when assigning to values of <class 'deap.creator.FitnessMax'>. Currently assigning value(s) -1.3549805685970155 of <class 'numpy.float64'> to a fitness with weights (1.0,).
長文失礼します.プログラムが何故か動きません.おそらく最後の二行に問題があると思うのですがどなたか助けていただけないでしょうか.
回答2件
あなたの回答
tips
プレビュー