我尝试解决一个声称只能使用动态编程解决的问题。以下是问题所在。 一个人的总能量为H,他需要覆盖距离D.他希望在最短时间内使用最大能量达到这个距离。他可以运行5种模式。根据5种模式中的一种运行每公里可以覆盖总距离。 这两种模式使用两个已排序的数组进行描述
时间: - ' 5分10秒' 6米11秒' 7米7秒' 8米11秒',' 8米11秒' #39; 9米11秒'
所需能源:-11,9,8,7,6
所以我贪婪的解决方案策略是
使用模式运行下一个km,该模式花费最少的时间并且需要能量< = x
&安培;设置H =模式所需的H-能量
设置D = D-1
转到第1步,直到剩余距离变为0。
我认为这个解决方案可行,但实际上却失败了。我知道如何使用DP解决它,但我想知道它失败的地方。我尝试过很多例子但没有感觉到。我不记得上面两个数组元素,但它们必须按排序顺序。
答案 0 :(得分:1)
原因很简单;您尚未证明您的算法,因此您无法声称它是正确的。就那么简单。您是否知道研究文献中有多少启发式算法"外观"没错,但他们没有正确的证明。因此,为什么他们只是启发式。
您的解决方案是启发式的。举个例子。拿H=100, D=3
。同时将模式设为时间[1,2,3,4,5]
,将相应的能量设为[35,34,32,32,32]
。
您的初始x
是floor(100/3)=33
。能量<=33
的最低时间是3
。选择它。更新H和D,使H=67, D=2
。我们有floor(67/2)=33
。再次,选择时间3
。更新H和D,使H=34, D=1
。最后x=floor(34/1)=34
选择时间2
。因此,覆盖距离的时间列表为[3,3,2]
,总能量为32+32+34=98
,总时间为8
。
然而,我能提出比你贪婪的解决方案更好的解决方案。即[1,3,4]
时间8
单位时间但总能量35+32+32=99
。打败你贪婪的解决方案。
故事的道德?如果你不能证明你的算法,假设它是错误的,或者只是一个启发式算法。