我目前正在使用 libray DEAP 在 python 中实现背包问题。我必须最大化利益并最小化偏好。该问题的 knapsak 内的元素不能多于选定的数量。
我生成了以下函数:
def evaluate(individual):
weight = sum(individual[i] * weights[i] for i in range(len(individual)))
benefit = sum(individual[i] * benefits[i] for i in range(len(individual)))
preference = sum(individual[i] * preferences[i] for i in range(len(individual)))
nTotal=sum(individual)
if weight > max_weight:
return -benefit + (weight - max_weight)*10000, preference+10
elif nTotal > nMax:
return -benefit + (nTotal - nMax)*10000, preference+10
else:
return -benefit, preference
旁边
creator.create("FitnessMulti", base.Fitness, weights=(1.0, 1.0))
creator.create("Individual", list, fitness=creator.FitnessMulti)
toolbox = base.Toolbox()
toolbox.register("attr_bool", random.randint, 0, 1)
toolbox.register("individual", generate_individual)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
toolbox.register("evaluate", evaluate)
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)
toolbox.register("select", tools.selNSGA2)
我的解决方案不遵守重量限制或元素数量限制。
有人可以帮我定义一个更好的评估版本,以便我可以执行这些限制吗?
如果有人感兴趣,我可以发布整个代码
也许是因为你在定义Fitness时写了weights=(1.0, 1.0),但你的目标是利益最大化和偏好最小化。所以,你的代码行应该是:
creator.create("FitnessMulti", base.Fitness, weights=(1.0, -1.0));
另外,你为什么要回来
-benefit
?由于您的目标是最大化该变量,因此使其为负会产生矛盾的效果,因此只需返回收益就足够了。
进行这些更改可以解决您的问题吗?