我有一组许多(10000 多个)项目,我必须从中选择 20 个项目。我只能选择每个项目一次。我的项目有利润和成本,以及几个布尔属性(例如颜色)。
我已经阅读并完成了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。
我想选择价值最高的 20 个最便宜的项目,其中 5 个的属性标志设置为 1。
我无法使用谷歌或工具来制定这个。
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 的项目。
在制定约束和目标方面的任何帮助都会非常有帮助。谢谢!