装箱/背包优化问题设计



我有一个场景,我需要一些帮助来制定问题,这样我就可以正确地实现优化方法。我希望有人能给我一点指导,表面上看起来很简单,但我很难弄清楚如何正确编码变量、约束等。

场景是这样的:

  • 需要将多个物品放入箱子/背包中
  • 每件物品都有两个因素,在包装时必须考虑
  • 我有几种可以用来包装的箱子/背包
  • 箱子/背包的供应量是无限的
  • 每个箱子/背包对物品的每个值都有约束,因此物品的值以累积的方式相加,但不能超过箱子/背包上的任何约束
  • 每个箱子/背包的使用成本(价格)不同
  • 无论箱子/背包里有什么物品,都有一个可放入箱子/背包的物品数量上限

示例:

每个项目有两个值的矢量:

项目=[[7,6]、[14,2]、[27,23]、[5,15]]

一个箱子/背包的向量,第一个值是它可以接受的物品第一个值的上限。第二个值相同,但适用于箱子/背包中每个物品的第二个数值。第三个值是箱子/背包可以容纳的最大物品数量。最后一个值是箱子/背包的价格/成本。

BinOptions=[[64000145035022000],[8000450,648000]]

目标是以最有效的方式包装所有物品,以提供最低的成本(使用箱子/背包的价格)。

我在考虑两种解决问题的方法:

  • OR采用MILP方法的工具
  • OR工具与背包解算器

我不一定拘泥于OR Tools,这只是我一直在玩的东西,从我看到的报告来看,它似乎可以很好地跨不同的语言工作。如果能够对此进行建模,然后稍后再选择一种语言,那就太好了。

有一件事可能并不明显,那就是可用垃圾箱品种的数量发生了变化。有时我会有两三个可供选择,有时甚至更多,可能多达一百个。要打包的收到物品的数量也会根据当天的不同而变化。

如果有人能为解决这个问题提供一些指导,我将不胜感激。

干杯

青蛙

背包解算器不能解决您的问题,因为它是一个纯1背包解算程序。

您可以使用MILP解算器或CP-SAT。

我建议使用bin包装示例作为解决此问题的模板。它使用SCIP解算器。

solver = pywraplp.Solver.CreateSolver('SCIP')

在该示例中,目标是尽量减少用于包装所有物品的箱子数量。我认为这适用于你的情况,尤其是在垃圾箱数量未知的情况下。显然,对于n个物品,所需的最大箱子数量为n,因为最大数量的箱子将导致一个物品被放置在自己的箱子中。

#> Constraints:
## Each item must be packed once
for i in data['items']:
solver.Add(sum(x[i, j] for j in data['bins']) == 1)
## The sum of each weight type cannot exceed the capacity for that bin
## You have two weight types, k.
for k in range(2):
for j in data['bins']:
solver.Add(
sum(x[(i, j)] * data['weights'][k][i] for i in data['items']) <= y[j] *
data['bin_capacity'][k])
## The number of items cannot exceed the numerical capacity of each bin
## Let's assume this capacity is element 2 of data['bin_capacities']
for j in data['bins']:
solver.Add(
sum(x[(i, j)] for i in data['items']) <= y[j] * data['bin_capacity'][2])
#> Objective:
## The original objective function used in the example.
solver.Minimize(solver.Sum([y[j] for j in data['bins']]))
## With the addition of a variable cost for a bin, you may need the following.
solver.Minimize(solver.Sum([y[j] * data['bin_cost'] for j in data['bins']]))

最新更新