我有一个场景,我需要一些帮助来制定问题,这样我才能正确地实施优化方法。我希望有人能给我一些指导,表面上看起来很简单,但我很难弄清楚如何正确编码变量、约束等。
情况是这样的:
例:
每个项目有两个值的向量:
项目=[[7,6],[14,2],[27,23],[5,15]]
箱子/背包的向量,第一个值为物品第一个值可接受的上限。第二个值相同,但适用于箱子/背包中每个物品的第二个值。第三个值是箱子/背包可以容纳的最大物品数。最后一个值是箱子/背包的价格/成本。
双选项=[[64000145035022000],[8000450,648000]]
目标是以最有效的方式包装所有物品,以提供最低成本(使用箱子/背包的价格)。
我在考虑两种解决问题的方法:
我不一定会被OR-Tools卡住,它只是我一直在玩的东西,从我看到的报告来看,它似乎在不同的语言之间运行得很好。如果能够对此建模,然后在以后选择一种语言,那就太好了。
有一件事可能不太明显,那就是可用垃圾箱品种的数量会发生变化。有时我会有两三个可供选择,有时会更多,可能多达一百个。要打包的来料数量也会根据日期而变化。
如果有人能为解决这个问题提供一些指导,我将不胜感激。
干杯
青蛙
我建议使用装箱示例作为这个问题的模板。它使用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']]))
背包解算器不能解决你的问题,因为它是一个纯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背包的区别就是,对珠宝进行了分组,并且一个组内的珠宝互斥。 解法 设