【发布时间】:2015-01-13 17:39:37
【问题描述】:
我目前正在调查一个路线问题(在不超过最长旅行时间的情况下找到我想去的地方的子集 [每个都有一定的分数]),并提出了 1/0 背包问题的变体:似乎解决了我原来的问题。
根据维基百科,1/0 背包被描述为:
给定一组项目,每个项目都有一个质量和一个值,确定要包含在集合中的每个项目的数量,以便总重量小于或等于给定限制,并且总值与可能。
因此,对于每个项目,都有一个固定的重量(质量),可以在尝试解决问题时轻松使用,例如使用动态规划。
但是,如果特定物品的重量取决于包的先前内容怎么办?换句话说(并且以更一般的方式):让我们考虑以下完整的图表:
每个节点 (A,B,C,D,E) 代表我可能想要放入背包的物品。让我们假设每个节点也有一个特定的 value 分配给它(图中省略)。我仍然希望有一个最佳背包,因此是具有最高分数的节点的子集,但是这次权重(或将特定节点添加到我当前的背包的成本)没有分配给节点本身,而是分配给边缘导致它。
这意味着添加节点的成本取决于背包的先前内容(例如,通过使用任何已包含节点中成本最低的边)。例如,如果我当前的背包由 {A,C} 组成,则添加 B 的成本为 2(取 A->B 或 C->B)。如果我当前的背包由 {D,E} 组成,则添加 B 的成本改为 3。
不幸的是,我真的想不出一个好的算法来解决这个问题。 经典的背包 DP 方法在这里实际上并不适用,因为您可以轻松地构造它不返回最佳解决方案的情况。例如,如果您开始使用“错误”节点构建您的背包,则添加一个非常好的节点(应该包含在最佳解决方案中但尝试很晚)的成本可能会超过容量。
我是否采取了完全错误的方法来解决问题?你认为有更好的算法来解决这个问题吗?
【问题讨论】:
标签: algorithm graph knapsack-problem