1.问题描述
旅行商问题(Travelling Salesman Problem, 简记TSP,亦称货郎担问题):设有n个城市和距离矩阵D=[dij],其中dij表示城市i到城市j的距离,i,j=1,2 … n,则问题是要找出遍访每个城市恰好一次的一条回路并使其路径长度为最短。
2.算法设计
首先计算距离矩阵,假设任意两个城市的距离为其直线距离,并且任意两个城市之间都存在道路。
然后初始化一系列参数,设置概率控制参数T=100,设置每个概率尝试次数L=20000
任意初始化一个序列,从0出发经过所有点回到0即可,对于每个序列都存在一个总的路径长度,这个路径长度为所有路程之和,作为退火算法中的温度状态。
通过二变法随意找到另外一个序列,计算新序列的路径长度,并且计算转移概率,根据此概率决定是否转移。
以此类推。直到发生两次对应控制参数T变化后,均没有发生转移时,算法退出。
3.程序流程
4.核心伪代码
> Procedure TSP_USE_SIMULATED_ANNEALING; begin INITIALIZE; {
初始化i0= π1
> … πn, t0=100, L= 20000 } randomize; {
初始化随机数种子 } Repeat
> bChange:=0;
> for l:=1 to L do
> begin
> GENERATE; {
采用2变换法产生新的路径 }
> CALCULATE(df); {
计算 df = f(j)-f(i) 的值 }
> if ACCEPT(t, df) then {
根据Metropolis准则判断是否接受新的路径 }
> begin
> f: = f + df; {
计算已接受的路径的长度 }
> bChange := 1;
> end;
> end;
> t:=t * 0.9; {
衰减函数 α(t)=0.9 * t }
> if (bChange = 0) then s:=s+1