背包问题变体 - 将重量和价值最大化到极限

Posted

技术标签:

【中文标题】背包问题变体 - 将重量和价值最大化到极限【英文标题】:Knapsack Problem Variant - Maximizing Weight and Value Up To Limit 【发布时间】:2022-01-18 02:52:42 【问题描述】:

我正在尝试制定一种算法(可能使用 Python 中的 OR 工具)来解决似乎与背包问题有关的问题。

我在位置 A 有一组物品 我想把他们送到位置 B 每件商品都有重量和价值 我只能携带 X 个重量 我怕中途被抢,所以只想携带最多Y个值

如果我正在尝试计划我的第一次从位置 A 到位置 B 的旅行,我该如何选择这样的项目:

我将加载的重量最大化,最大限制为 X(最大程度地减少浪费的重量容量) 我将加载的价值最大化,直到 Y 的限制(最小化浪费的价值容量)

一个人为的例子:

我的限额是 5 公斤和 50 美元 我有 10 个 C 项(重量:0.1 公斤,价值:10 美元) 我有 10 件 D 项(重量:1 公斤,价值:1 美元)

“简单”的解决方案是进行 4 次旅行:

5x C 项(50 美元,0.5 公斤) 5x C 项(50 美元,0.5 公斤) 5x D 项(5 美元,5 公斤) 5x D 项(5 美元,5 公斤)

但更明智的解决方案是只进行 3 次旅行:

4x C 项 + 4x D 项(44 美元,4.4 公斤) 4x C 项 + 4x D 项(44 美元,4.4 公斤) 2x C 项 + 2x D 项(22 美元,2.2 公斤)

我使用过 OR Tools 线性求解器,但仅在具有多个约束的情况下最大化一个值。如何在多个约束条件下最大化多个值(加载重量和加载值)?

【问题讨论】:

目标不是尽量减少出行吗?这是一个单一的目标。 (就像装箱问题:尽量减少箱的数量)。 不完全。我们一次只能计划一次旅行,并且无法计划任何未来的旅行,因为位置 A 的物品集可能会在旅行完成时发生变化。 【参考方案1】:

我相信我找到了解决方案。我所做的是尝试最大化一个同时考虑权重和价值的复合变量。在 Python 中使用 OR 工具:

objective = solver.Objective()

for i, item in enumerate(item_list):
    objective.SetCoefficient(x[i], item['mass']/max_volume + item['value']/max_value)

objective.SetMaximization()

这会将系数设置为同时考虑质量和价值。重要的部分是每个都根据其相关限制进行标准化。该解决方案始终如一地为我提供充分利用重量和价值“空间”的物品集。

【讨论】:

以上是关于背包问题变体 - 将重量和价值最大化到极限的主要内容,如果未能解决你的问题,请参考以下文章

动态规划背包问题

01 背包专业化

动态规划——背包问题

动态规划——背包问题

背包问题

背包九讲