当前位置: 首页 > 知识库问答 >
问题:

箱包/背包优化问题设计

江新
2023-03-14

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

情况是这样的:

  • 需要将多个物品放入箱子/背包中

例:

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

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

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

双选项=[[64000145035022000],[8000450,648000]]

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

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

  • 使用MILP方法的OR-工具
  • 带有背包求解器的OR-工具

我不一定会被OR-Tools卡住,它只是我一直在玩的东西,从我看到的报告来看,它似乎在不同的语言之间运行得很好。如果能够对此建模,然后在以后选择一种语言,那就太好了。

有一件事可能不太明显,那就是可用垃圾箱品种的数量会发生变化。有时我会有两三个可供选择,有时会更多,可能多达一百个。要打包的来料数量也会根据日期而变化。

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

干杯

青蛙

共有2个答案

颜功
2023-03-14

我建议使用装箱示例作为这个问题的模板。它使用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']]))
司空锋
2023-03-14

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

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

 类似资料:
  • 主要内容:动态规划解决01背包问题,01背包问题的具体实现商店的货架上摆放着不同重量和价值的商品,一个小偷在商店行窃,他携带的背包只能装固定重量的商品。装哪些商品才能获得最大的收益呢?在限定条件内找到最佳的物品组合,这样的问题统称为背包问题。 根据限定的条件不同,背包问题还可以细分: 部分背包问题:所有物品是可再分的,即允许将某件物品的一部分(例如 1/3)放入背包; 0-1 背包问题:所有物品不可再分,要么整个装入背包,要么放弃,不允许出现“仅选择物品

  • 本文向大家介绍小背包问题,包括了小背包问题的使用技巧和注意事项,需要的朋友参考一下 列出了物品列表,每件物品都有自己的值和重量。物品可以放在最大重量限制为W的背包中。问题是要找到小于或等于W的重量,并且值要最大化。 背包问题有两种。 0 – 1背包 小背包 对于0 – 1背包,不能将物品分成小块,对于小背包,可以将物品分成小块。 在这里,我们将讨论分数背包问题。 该算法的时间复杂度为O(n Log

  • 主要内容:贪心算法解决部分背包问题在限定条件下,如何从众多物品中选出收益最高的几件物品,这样的问题就称为背包问题。   图 1 背包问题 举个简单的例子,商店的货架上摆放着不同重量和价值的商品,一个小偷在商店行窃,他携带的背包只能装固定重量的商品,选择哪些商品才能获得最大的收益呢?这个问题就属于背包问题,限定条件是背包的承重,最终目标是令背包中存放的物品的总收益最高。 根据不同的限定条件,背包问题还可以有更细致的划分: 0-1 背

  • 我试图解决一个优化问题,它非常类似于背包问题,但不能用动态规划来解决。我想解决的问题与这个问题非常相似:

  • 问题 你面前摆放着 n 个珠宝(共 n 种,每种 1 个),已知珠宝 s_i 的价值是 v_i ,重量是 w_i 。给你一个背包,你可以自由挑选珠宝装到背包中,但背包可以装载的最大重量为 t 。求背包能够装载珠宝的最大价值 v 。 解法 设 f(i,j) 为背包中放入前 i 件物品,重量不大于 j 的最大价值,其中 i in [1,n] , j in [0,t] 。有如下状态转移方程: f(i,j

  • 问题 你面前摆放着 n 个珠宝(共 n 种,每种 1 个),这些珠宝被分成 m 个组(显然 n geq m )。已知珠宝 s_i 的价值是 v_i ,重量是 w_i 。给你一个背包,你可以挑选珠宝装到背包中,但背包可以装载的最大重量为 t ,并且同一个组的珠宝至多只能选择 1 个。求背包能够装载珠宝的最大价值 v 。 该问题与01背包的区别就是,对珠宝进行了分组,并且一个组内的珠宝互斥。 解法 设