【发布时间】:2014-05-28 21:57:01
【问题描述】:
我遇到了一个问题,即寻找一种算法来优化将一段管道切割成更小、不同的长度。 例如,您有 10 米的标准管道,您需要切割以下几块: 4片0.7米 3片2.1米 7 米 5 米 等等 目标是不断找到最佳的切割顺序,从而将浪费降至最低。
我有一个解决方案,但我不确定它是否是最好的。 首先,我制作了一个包含所有长度的堆栈(stack1),按大小排序,顶部的值较大。 我定义了一个空的辅助堆栈 stack2 数组 pipe[n][m] 存储结果。 n 是管道编号,m 是要从该管道切割的长度。 然后我执行以下过程(这是伪代码):
i=0
j=0
while(stack1 in not empty or stack2 is not empty)
a=pop(stack1)
if(a==null)
push(stack2,stack1) ;push stack2 into stack1
sort(stack1)
i=i+1
j=0
a=pop(stack1)
if(a fits in pipe[i])
pipe[i][j++]=a ;this just means that 'a' will be cut from this pipe
else
push(a,stack2) ;if it doesnt fit, save it for later
总而言之:它总是尝试尽可能切割最大的请求部分。当它不能时,它会转到下一个项目,依此类推。当它用完要尝试的项目时,它会从一个新的“原始”标准管道长度开始。
这似乎可行,但我想知道它是否可以改进。有没有办法确定最好的解决方案是什么?
【问题讨论】:
-
这听起来很像背包问题(计算机科学中的一个 NP 难题)。
-
如果上述代码有效并且您正在寻找优化它的方法,那么您的问题可能更适合Code Review。
-
更新:我尝试了一种变体,如果超出值不为零,则尝试重复操作,稍后省略第二大块,如果它仍然大于零,则省略第三块最大的,等等。这给出了不同的分布,但总是完全相同的整体性能(除了需要更长的计算时间)。