我正在编写代码来解决护士恢复问题
我已经实施了模拟退火,我有兴趣将结果与延迟接受爬坡进行比较
我找到了一些用于延迟接受的伪代码,但需要一些帮助才能用Java编写它:
Produce an initial solution s
Calculate initial cost function C(s)
Set the initial number of steps I=0
For all k in ( 0.. L-1 ) C_hat[k]=C(s)
Do until a stopping condition
Construct a candidate solution s*
Calculate its cost function C(s*)
v = I mod L
If C(s*) <= C_hat[v]
Then accept s*
Insert cost value into the list C_hat[v] = C(s)
Increment a number of steps I=I+1
End do
我真的不明白这一点:For all k in ( 0.. L-1 ) C_hat[k]=C(s)
答案 0 :(得分:1)
我正在为&#34;&#34;元素编写in
。关于C的关系和C_hat[k]
与&#34; hat&#34;在顶部和下标k上,因为这些东西不能以这种格式显示出来。
For all k in ( 0.. L-1 ) C_hat[k]=C(s)
此行的目的是在算法的其余部分中,您假设您可以在v
到0
的范围内取任何值L-1
并测试{{1} }}。除非If C(s*) <= C_hat[v]
已经定义,否则这没有意义。上面引用的行确保在您尝试使用该值之前,每个此类C_hat[v]
都有一个明确定义的值。
这也意味着你永远不会接受任何比你尝试的第一个更差的解决方案。
顺便说一句,我怀疑在源文档中写入以下行的方式:
C_hat[v]
基于源文档中算法的格式,我得出结论,无论新解决方案是否被接受,都将在循环的每次迭代中执行此操作。下一次索引Insert cost value into the list C_hat[v] = C(s)
出现时,最新的解决方案只需要比先前为索引v
尝试的解决方案更好,即使提出的解决方案非常糟糕。这似乎不对。我想知道该行是否实际上应该是v
子句的一部分,只有在接受解决方案时才会执行。