我们要求此代价函数的最小值。
新解的产生随机产生1和n之间的两相异数k和m,若k<m,则将
(w1,w2,…,wk,wk 1,…,wm,…,wn)
变为:
(w1,w2,…,wm,wm-1,…,wk 1,wk,…,wn).
如果是k>m,则将
(w1,w2,…,wk,wk 1,…,wm,…,wn)
变为:
(wm,wm-1,…,w1,wm 1,…,wk-1,wn,wn-1,…,wk).
上述变换方法可简单说成是“逆转中间或者逆转两端”。
也可以采用其他的变换方法,有些变换有独特的优越性,有时也将它们交替使用,得到一种更好方法。
代价函数差设将(w1,w2,……,wn)变换为(u1,u2,……,un),则代价函数差为:
根据上述分析,可写出用模拟退火算法求解TSP问题的伪程序:
ProcedureTSPSA:
begin
init-of-T;{T为初始温度}
S={1,……,n};{S为初始值}
termination=false;
whiletermination=false
begin
fori=1toLdo
begin
generate(S′formS);{从当前回路S产生新回路S′}
Δt:=f(S′))-f(S);{f(S)为路径总长}
IF(Δt<0)OR(EXP(-Δt/T)>Random-of-[0,1])
S=S′;
IFthe-halt-condition-is-TRUETHEN
termination=true;
End;
T_lower;
End;
End
模拟退火算法的应用很广泛,可以较高的效率求解最大截问题(MaxCutProblem)、0-1背包问题(ZeroOneKnapsackProblem)、图着色问题(GraphColouringProblem)、调度问题(SchedulingProblem)等等。
3 模拟退火算法的参数控制问题
模拟退火算法的应用很广泛,可以求解NP完全问题,但其参数难以控制,其主要问题有以下三点:
(1)温度T