gpt4 book ai didi

python - 使用谷歌运筹学工具进行约束优化

转载 作者:太空狗 更新时间:2023-10-29 20:28:01 25 4
gpt4 key购买 nike

我有一组很多(10000 多个)项目,我必须从中选择恰好 20 个项目。每个项目我只能选择一次。我的元素有利润和成本,以及几个 bool 属性(如颜色)。

我已在 https://developers.google.com/optimization/mip/integer_opt_cp 阅读并完成教程和 https://developers.google.com/optimization/mip/integer_opt ,但我的约束条件与此处介绍的约束条件略有不同。

每个项目都表示为一个元组:

item = ('item name', cost, profit, is_blue)

举个例子

vase = ['Ming Vase', 1000, 10000, 0]

plate = ['China Plate', 10, 5, 1]

并且项目的总集合是列表的列表:

items = [item1, item2, ..., itemN].

我的利润和成本也是列表:

profits = [x[2] for x in items]
costs = [x[1] for x in items]

对于每个选择的项目,它需要有一个最小值,并且至少有 5 个项目必须将属性 (is_blue) 标志设置为 1。

我想选择值(value)最高的 20 件最便宜的元素,其中 5 件的属性标志设置为 1。

我在使用 google OR 工具制定这个时遇到了问题。

from ortools.linear_solver import pywraplp

solver = pywraplp.Solver('SolveAssignmentProblemMIP',
pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING)

x = {}

for i in range(MAX_ITEMS):
x[i] = solver.BoolVar('x[%s]' % (i))

#Define the constraints
total_chosen = 20
solver.Add(solver.Sum([x[i] for i in range(MAX_ITEMS)]) == total_chosen)

max_cost = 5.0

for i in range(num_recipes):
solver.Add(x[i] * cost[i] <= max_cost)

solver.Maximize(solver.Sum([profits[i] * x[i] for i in range(total_chosen)]))
sol = solver.Solve()

我可以获得我选择的项目集:

for i in range(MAX_ITEMS):
if x[i].solution_value() > 0:
print(item[i].item_name)

这很好用 - 它选择了 20 个项目的集合,这些项目在成本约束下最大化利润,但我一直在研究如何将其扩展到选择属性 (is_blue) 设置为 true 或 false 的项目。

在制定约束和目标方面的任何帮助都会非常有帮助。谢谢!

最佳答案

我不明白为什么要最小化值 (cfg['items'][i][2] = value)。你想要最高的值(value)。

您的模型类似于背包。只有你会为成本(小于总成本)和标志(总标志大于 5)添加额外的约束。另外,你说你会选择20个项目。但是您的约束限制为 15 个项目(最大项目)。

OR 工具页面在 bin packing 标题下有背包问题的详细解释。

我想你编辑了你的问题。“is_blue”属性只需要一个约束。但是现在你的模型有不同的问题。

  1. 如果成本的列表名称是“成本”,则您的约束必须更改,因为您使用“成本”命名的列表。

    我在范围内(num_recipes): solver.Add(x[i] * costs[i] <= max_cost)另外,我从这个约束中了解到 max_cost 是为每个项目定义的,而不是为成本总和定义的。

  2. 这是您的目标函数。

    solver.Maximize(solver.Sum([profits[i] * x[i] for i in range(total_chosen)])) 

    但是您只将前 20 项添加到目标函数。您需要将 total_chosen 更改为 MAX_ITEMS。如:

    solver.Maximize(solver.Sum([profits[i] * x[i] for i in range(MAX_ITEMS)]))
  3. 最后一个 is_blue 约束。我了解到您想选择至少 5 个蓝色项目。

    blues = [x[3] for x in items]
    solver.Add(solver.Sum([blues[i] * x[i] for i in range(MAX_ITEMS)]) >= 5)

关于python - 使用谷歌运筹学工具进行约束优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52278594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com