gpt4 book ai didi

python - 使用重复项约束优化

转载 作者:行者123 更新时间:2023-12-01 08:51:49 25 4
gpt4 key购买 nike

我有一组许多(10000+)个项目,我必须从中选择k个项目。我只能多次选择每个项目,但受到排序限制:如果我选择位置 1 的项目,则直到位置 21 才能选择它。我的项目有利润和成本。

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

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

举个例子

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

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

总的项目集是列表的列表:

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

我的利润和成本也列出了:

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

对于选择的每个项目,它需要有一个最小值,并且该项目不能在接下来的 19 个项目中重复使用。我想在这个约束下选择 k 个最便宜且值(value)最高的商品,但我很难制定它。

我在使用 google OR 工具来制定此内容时遇到问题。下面的代码只得到最好的k(在本例中为100),没有任何额外的约束

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 = 100
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)

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

最佳答案

solver.Add(x[i] * cost[i] <= max_cost)

这个限制意味着我们根本不想拿昂贵的元素。接下来,我们可以在优化之前排除 cost[i] > max_cost 的项目。

Sum([profits[i] * x[i])

如果没有其他限制,该目标要求采用最佳项目 total_chosen 次。但我们不能太频繁地重复项目。因此,我们需要 20 个成本低于 max_cost 的最佳项目,并重复它们 total_chosen/20 次。

import numpy

MAX_ITEMS = 10000

cost = numpy.random.randint(1, 100, MAX_ITEMS)
profits = numpy.random.randint(1, 100, MAX_ITEMS)

total_chosen = 100
repeat = 20
max_cost = 5.0

cheap = [i for i in range(MAX_ITEMS) if costs[i] <= max_cost]
chosen = sorted(cheap, key=lambda i: profits[i], reverse=True)[:repeat]

for _ in range(total_chosen/repeat):
for i in chosen:
print(i, costs[i], profits[i])

使用 OR 工具,它看起来像

import numpy
from ortools.linear_solver import pywraplp

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

MAX_ITEMS = 10000

costs = numpy.random.randint(1,100,MAX_ITEMS)
profits = numpy.random.randint(1,100,MAX_ITEMS)

total_chosen = 100
repeat = 20

max_cost = 5.0

x = {}

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

solver.Add(solver.Sum([x[i] for i in range(MAX_ITEMS)]) == repeat)

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

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

for i in range(MAX_ITEMS):
if x[i].solution_value() > 0:
print(i, profits[i], costs[i])

关于python - 使用重复项约束优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53064675/

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