遗传算法种群适应度计算报错:TypeError: object of type 'int' has no len()
问题:遗传算法种群适应度计算报错TypeError: object of type 'int' has no len()
报错详情
TypeError: object of type 'int' has no len()
触发报错的DEAP库源码片段
/usr/local/lib/python3.9/dist-packages/deap/base.py in setValues(self, values) 186 187 def setValues(self, values): 188 assert len(values) == len(self.weights), "Assigned values have not the same length than fitness weights" 189 try: 190 self.wvalues = tuple(map(mul, values, self.weights))
原始适应度计算代码
fitness_set = list(tb.map(tb.evaluate, population)) for ind, fit in zip(population, fitness_set): ind.fitness.values = fit
问题原因
DEAP框架里,ind.fitness.values要求传入可迭代的序列(如元组、列表),但你的tb.evaluate函数返回的是单个整数,赋值时代码尝试对整数调用len(),直接触发报错。这是因为DEAP的Fitness类默认支持多目标优化,哪怕是单目标场景,也需要用长度为1的序列来赋值。
两种修正方案
方案一:修改评估函数
让tb.evaluate返回元组形式的结果,比如原本返回单个分数score,改成返回(score,)。方案二:在赋值时包装结果
不修改评估函数,直接在赋值步骤把单个整数转为元组:fitness_set = list(tb.map(tb.evaluate, population)) for ind, fit in zip(population, fitness_set): ind.fitness.values = (fit,) # 将单个整数包装为长度1的元组
内容的提问来源于stack exchange,提问作者Jess
相关产品推荐
相关产品推荐

