Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 重复约束优化_Python_Or Tools - Fatal编程技术网

Python 重复约束优化

Python 重复约束优化,python,or-tools,Python,Or Tools,我有一组(10000+个)项目,我必须从中选择正确的k项目。我只能根据顺序限制多次选择每个项目:如果我在位置1选择一个项目,我在位置21之前无法选择它。我的物品有利润,也有成本 每个项都表示为一个元组: item = ('item name', cost, profit) 例如 vase = ['Ming Vase', 1000, 10000] plate = ['China Plate', 10, 5] 项目的总集是一个列表: items = [item1, item2, ..., it

我有一组(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个最便宜、价值最高的项目,但我很难确定它

我很难用谷歌或其他工具来描述这一点。下面只得到最佳的
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()
在制定约束条件和目标方面的任何帮助都会非常有用。谢谢

solver.Add(x[i] * cost[i] <= max_cost)
如果没有其他限制,该目标要求选择最佳项目
total_selected
次数。但我们不能重复太多的项目。因此,我们需要20个成本低于
max\u cost
的最佳项目,并重复它们
total\u selected/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])
导入numpy
最大项目数=10000
成本=numpy.random.randint(1100个,最多个项目)
利润=numpy.random.randint(1100个,最大项)
所选总数=100
重复=20次
最大成本=5.0

便宜=[i for i in range(MAX_ITEMS)如果花费[i]一个想法,如果你为前20个对象创建了一个最佳解决方案,你能重复这个模式直到序列结束吗


如果是,请按20个最佳值对项目进行排序,然后重复该顺序。

首先,您需要严格地制定“k个最便宜的项目,具有最高值”。因为有十几个数学公式。您可以尝试优化总和、最大/最小值、顺序,对总和或最大/最小值施加约束,对每个标准计算relative值划分标准等。似乎您可以从表单中排除重复约束。乍一看,如果您可以重复某个项目,则必须重复。因此,您只需要分配前19(20?)个项目,以后(最佳)序列应复制前19个。对于范围内的i(num_配方):解算器。添加(x[i]*成本[i]
Sum([profits[i] * x[i])
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])
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])