Algorithm 最高的箱子堆(算法)
我对这项任务有很大的问题: 你有一个n(n=y1 x3>=y1+y2 xk>=y1+y2+…+y(k-1)Algorithm 最高的箱子堆(算法),algorithm,sorting,Algorithm,Sorting,我对这项任务有很大的问题: 你有一个n(n=y1 x3>=y1+y2 xk>=y1+y2+…+y(k-1) 你知道如何解决这个问题吗?我听说我们必须对这些箱子进行分类,这样我们才能把箱子(a1,a2,…ak)堆起来然后总是a1。结果桩的强度将是 min(S1-W2,S2)< /代码> 我们从空桩状态开始(高度、强度、箱)=(0,无穷大,空)。此外,对于任何桩状态,我们需要一个上限,即我们可以在该桩上放置多少个箱。计算该上限的一种方法是使用桩的强度和(不在该桩上的箱的)最小箱重的商.为了有效地
你知道如何解决这个问题吗?我听说我们必须对这些箱子进行分类,这样我们才能把箱子(a1,a2,…ak)堆起来然后总是a1
我把它放在这里作为参考。这里有一个从A*方法改编而来的想法。然而,我们不想找到最小长度路径,而是想找到最大高度的桩
我们先从理论上分析。考虑一下,我们已经有了一个强度为“代码> S1 < /代码>的堆,我们把另一个盒子放在上面,用重量<代码> W2和强度<代码> S2< /代码>。结果桩的强度将是<代码> min(S1-W2,S2)< /代码>
我们从空桩状态开始(高度、强度、箱)=(0,无穷大,空)
。此外,对于任何桩状态,我们需要一个上限,即我们可以在该桩上放置多少个箱。计算该上限的一种方法是使用桩的强度和(不在该桩上的箱的)最小箱重的商.为了有效地计算该启发式,首先需要按照箱子的重量对箱子进行排序
剩下的是a*算法的简单应用。从可用集合中的所有状态中,选择具有最高期望堆的状态(=高度+启发式)。如果此桩高于当前最高桩,请保存此状态。计算尚未在桩上的每个框的结果桩状态,并从可用集中删除当前状态。然后迭代
如果可用集合中的所有桩状态的预期桩高均不高于当前最高桩,则已找到最高桩
这种方法可以让您忽略显然不能很早形成最高堆的堆状态。由于一个堆状态只能从另一个堆状态到达,因此您不需要处理打开和关闭列表中的状态。您可以改变从a开始的第二步)用最低的b)和最高的框来查看哪个策略会导致更高的堆。这是不正确的。考虑一个非常坚固和沉重的盒子。还有一个稍微结实但很轻的盒子。显然,最好将第一个框放在第二个框的下面,因为你可以将更多的框放在第二个框的上面。这是一个贪婪的算法,它给你一个“正确的解决方案”,但不是最优的。一个反例是三个盒子
B1(w=5,k=2)
,B2(w=8,k=7)
,B3(w=1,k=9)
,在这个例子中,最佳的B2 B3 B1
,但将最强的盒子B3放在底部将产生B3 B2
或B3 B1
。好的,我明白了,所以你应该在底部放一个较重的箱子,因为这个重量不需要任何其他箱子来支撑。其他部分的任何反例(不包括最低的方框)?上述情况相同,如果您的方框B
中的任意位置的当前k
为10,且高于2个方框B1(k=7,w=6)
和B2(k=1,w=5)
,则需要删除B1
或B2
。最好的选择是删除B2
,因为B2
仅使用B1
,您的k
值仍为4,但使用B2
您的k
值为1。不幸的是,使用您的算法(删除最重的框),B1
将被删除。我认为这是解决问题的一个非常好的方法,但我认为应该改进启发式,以获得一个tigher界限(也许您可以尽可能多地放置框,而不考虑它们的强度,而不是使用最小的框)霍尔特:是的,我也想过。但我不确定这个更昂贵的启发式算法是否足够紧凑,以提高性能。是否要在算法中找到节点最多的路径?这怎么比回溯更好?(假设在图中寻找最长路径是NP难的)它与此类似。然而,启发式将算法引导到正确的方向,因此我们不必像回溯那样分析所有路径。