在python和metaheuristics中使用DEAP库实现背包问题的问题

问题描述 投票:0回答:1

我目前正在使用 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)

我的解决方案不遵守重量限制或元素数量限制。

有人可以帮我定义一个更好的评估版本,以便我可以执行这些限制吗?

如果有人感兴趣,我可以发布整个代码

python optimization constraints heuristics deap
1个回答
0
投票

也许是因为你在定义Fitness时写了weights=(1.0, 1.0),但你的目标是利益最大化和偏好最小化。所以,你的代码行应该是:

creator.create("FitnessMulti", base.Fitness, weights=(1.0, -1.0));

另外,你为什么要回来

-benefit
?由于您的目标是最大化该变量,因此使其为负会产生矛盾的效果,因此只需返回收益就足够了。

进行这些更改可以解决您的问题吗?

© www.soinside.com 2019 - 2024. All rights reserved.