我遇到了一个算法问题但是我无法找出比蛮力更好的东西或者将其减少到一个更好的已知问题。任何提示?
有N袋可变尺寸和N种物品。每种类型的物品都属于一个袋子。每种类型都有很多项目,每个项目可能有不同的大小。最初,这些物品随机分布在所有行李中。我们必须将物品放在各自的包里。但是,我们只能通过交换物品(尽可能多)并继续进行下一对来一次操作一对行李。 目的是减少对的总数。 编辑:目的是找到一系列转移,最大限度地减少所涉及的行李总数
澄清:
袋子不是任意大的(你可以假设袋子和物品尺寸为0到1000之间的整数,如果有帮助的话)。您经常会遇到这样的情况:由于其中一个行李的容量有限,因此无法更换2个行李之间的所有物品。这是算法需要进行优化的地方。也许,如果首先交换另一对行李,那么当前的交换可以一次完成。为了说明这一点,我们分别考虑包A,B和C以及它们的第1,2,3项。括号中的数字是大小。
A(10):3(8)
B(10):1(2),1(3)
C(10):1(4)
交换订单可以是AB,AC,AB或AC,AB。后者是最优的,因为交换的数量较少。
答案 0 :(得分:2)
由于我无法想出一个总会找到最佳答案的算法,并且解决方案的适应度(交换量)的近似值也很好,我建议使用修剪的随机局部搜索算法。
给定随机启动配置,此算法会考虑所有可能的交换,并根据偶然性做出权衡决策:交换越好,选择的可能性越大。
交换的价值将是商品交易价值的总和,如果商品没有在其所属的包中结束,则为零,如果商品最终在那里,则为正数。随着项目大小的增加,该值会增加(这背后的想法是,与较小的块相比,较大的块 hard 移动很多次)。这种适应度函数可以被任何其他适应度函数替代,在经验显示之前它的效率是未知的。
由于任何配置可能是许多前面交换的结果,我们会跟踪我们之前看到的配置,以及适应性(基于正确包中有多少项目 - 这种适应性与价值无关) (交换)和先前交换的列表。如果配置的适应度函数是其正确包中的项目的总和,则问题中的项目数量是最高适应度(因此标记配置是解决方案)。
如果符合以下条件,则交换
。当我们识别潜在的交换时,我们会查看以前看到的配置列表(使用哈希函数进行O(1)
查找)。然后我们将其先前的掉期设置为我们先前的掉期(如果我们的列表比它更短),或者我们将先前的掉期设置为其列表(如果它的列表比我们的短)。我们可以做到这一点,因为只要交换量尽可能小,我们做的交换并不重要。
如果配置中没有剩余可能的互换,则意味着您被卡住了。本地搜索会告诉您重置'您可以通过各种方式进行,例如: