Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 最高的箱子堆(算法)_Algorithm_Sorting - Fatal编程技术网

Algorithm 最高的箱子堆(算法)

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,无穷大,空)。此外,对于任何桩状态,我们需要一个上限,即我们可以在该桩上放置多少个箱。计算该上限的一种方法是使用桩的强度和(不在该桩上的箱的)最小箱重的商.为了有效地

我对这项任务有很大的问题:

你有一个n(n=y1

x3>=y1+y2

xk>=y1+y2+…+y(k-1)


你知道如何解决这个问题吗?我听说我们必须对这些箱子进行分类,这样我们才能把箱子(a1,a2,…ak)堆起来然后总是a1因为最低的框必须支持最大的重量,所以你需要最强的框作为最低的框。同样的道理,你需要在to上使用wekaest框p

因此,用“强度”作为排序键对你的箱子进行排序,将最强的放在底部,最弱的放在顶部

现在,计算每个长方体在其当前位置支持的重量

如果某个箱子的重量超过了它所能承受的重量,则移除该箱子上方最重的箱子

重复此操作,直到堆中剩余的所有箱子都正常

编辑

此解决方案不正确(请参阅注释)
我把它放在这里作为参考。

这里有一个从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难的)它与此类似。然而,启发式将算法引导到正确的方向,因此我们不必像回溯那样分析所有路径。