模拟退火算法解决TSP问题

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+
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值