是否可以修改1-0背包算法以优化包中物品的最终总重量作为首选(并且值作为第二选择) ,保持相同的算法复杂度?
我正在研究this java implementation(在文章的最后)。
更具体地说,我正在考虑更改这段代码
if (wt[item-1]<=weight){
V[item][weight]=Math.max (val[item-1]+V[item-1][weight-wt[item-1]], V[item-1][weight]);
}else{
V[item][weight]=V[item-1][weight];
}
还有一些其他条件,首先控制重量是否接近添加此项目的阈值,如果重量没有变化,则表示该值是否更好。
你是否知道如何在不改变复杂性的情况下做到这一点?
谢谢
EDIT “首先控制重量是否接近增加此项目的阈值”我的意思是达到背包的重量限制。换句话说,“最大化我可以随身携带的重量”而不会破坏它
答案 0 :(得分:4)
您是否尝试执行以下操作?选择项目以使重量最大化,同时仍然遵守重量限制。如果有多个最优解决方案,每个解决方案都达到最大可能的权重,那么通过选择总价值最大的解决方案来选择它们。
如果是这样,那么我建议如下。 (我正在考虑背包问题本身而不是你的Java实现。)
让M
=所有项目中的最大值[已编辑],N
=项目数。用权重+值/ MN
替换每个值(在目标函数中)。
然后模型将最大化总重量,同时仍然尊重重量限制。如果有多个具有相同最佳权重的解决方案,它将选择具有最大值的解决方案。除以MN
可以确保您永远不会选择价值更高的解决方案,而代价是重量更轻。
答案 1 :(得分:2)
我终于找到了一个专门针对我的问题的解决方案。
我已经使用了问题中链接的算法(this),但我没有考虑项目的值,而是将权重最大化(我将权重作为权重和值使用) 。所以他的背包算法优化了包中的重量,而没有考虑任何值。
为了最大化值,在计算算法的矩阵之前,我已经按照desc顺序对项目进行了排序,从更大的值到更低的值,并且在相同值的情况下(在我的情况下是他的重量)我做不更改项目组成,因为第一项具有更大的值,因此第一组项目具有更大的值。
它可能不是最好的解决方案,但似乎效果很好(在我的情况下)。 希望可以帮助
答案 2 :(得分:1)
优化最终重量意味着什么?对我来说,优化的重量似乎是一个空洞的包。
所以是的,它会使复杂性变为O(1),使其变得微不足道。
你能说出你的目标吗?
== EDIT ==
嗨,如果你想要达到同时最大化你的体重,我们似乎正在谈论dual problem
。您可以研究线性规划和双重单纯形算法(参见Wiki)