模拟退火算法以及解决TSP问题matlab代码实现

算法背景:

使用模拟退火思想解决TSP问题

整体思想:

一开始先随机生成一个解,然后随着每次降温,进行解的更新(在每个温度下,可以设置搜索解的次数,也就是链长。),一定概率的接受效果差的解,最后当温度降到最低温度,即停止解的搜索。

注意:对于新解的产生一定要有合适的方法(一开始的实现里面,每次都让随机产生新的解,效果不好,没能用到上一次解的信息。又改进了一点,采用交换两个随机位置的方式产生新解,效果好了些),否则效果不好。

matlab实现TSP问题主要代码如下:

clear;
clc;
%% 使用模拟退火思想解决旅行商问题
%基本思想,先随机产生一个解决方案(遍历路径),然后进行下一个方案的产生,保留优秀的,以一定的概率保留不好的
% f1,f2,df,r;%初始目标函数值f1,新解的目标函数值f2,df两者之差;r用于控制降温的快慢,0到1之间的一个随机数
%城市坐标数据(本质上是n*2的一个数组)
city_pos=[1304 2312;
3639 1315;
4177 2244;
3712 1399;
3488 1535;
3326 1556;
3238 1229;
4196 1004;
4312 790;
4386 570;
3007 1970;
2562 1756;
2788 1491;
2381 1676;
1332 695;
3715 1678;
3918 2179;
4061 2370;
3780 2212;
3676 2578;
4029 2838;
4263 2931;
3429 1908;
3507 2367;
3394 2643;
3439 3201;
2935 3240;
3140 3550;
2545 2357;
2778 2826;
2370 2975];
T=50000;%系统的温度
q=0.88;%退火系数
T_min=1e-8;%先随便设置了一个值
m=size(city_pos,1);
path0=randperm(m);%产生一个随机的解
path1 = path0;
path=path0;
% distance=[];  %用来记录总路程的变化情况
t=0;
while T>T_min
    %每个温度时迭代次数,即链长
    for i=1:1000
        f1 = SumDistance(city_pos,path1);
%         path2=randperm(m);%产生一个新的解,暂时使用随机的方式(这样随机的方式,完全用不到上一次解的有效信息,结果不好)
        path2=newPath(path1);%根据先前的解,产生一个新解
        f2=SumDistance(city_pos,path2);
        def=f2-f1;      %目标函数值直接用路径长度代替了,越小越好
        path=path1;
        if def<0 
            path=path2;
            if exp(def/T) > rand(1)
                path=path1; %保留原来的解(以一定的概率保留较差的解)
            end
        end
        path1=path; 
    end
    T=T*q;
    t=t+1;
    distance(t) = SumDistance(city_pos,path );%观察总路径变化情况
   
end

lie=distance';
%% 绘制结果图
x=city_pos(:,1);
y=city_pos(:,2);
figure(1)
plot(x,y,'pentagram','MarkerSize',10);
hold on; 
plot(x,y,'--c','LineWidth',1);
hold on; 
plot([x(m),x(1)],[y(m),y(1)],'--c','LineWidth',1);
title('路线图')
xlabel('城市地理位置横坐标');
ylabel('城市地理位置纵坐标');

% %%绘制变化趋势图
figure(2)
plot(1:1:size(distance,2),distance);
title('总路径变化趋势图')
xlabel('次数');
ylabel('总路径数');

fprintf('最后获得的路径为(城市序列):');
fprintf('%d;',path);
fprintf('%d',path(1));%首尾相接
fprintf('。\n');
fprintf('最后路径长度为:%d\n',SumDistance( city_pos,path ))

其他几个小方法GetDistance,newPath,SumDistance就不往上贴了,根据名字就能知道相应方法的用途,简单自己写一下就好。

结果:

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值