Simulated annealing algorithm to solve the TSP problem with a fixed starting point (MATLAB)

(MATLAB) Simulated annealing algorithm solves the TSP problem with a fixed starting point

1. Problem description

Please refer to my blog for problem description and problem-solving ideas:
https://blog.csdn.net/weixin_45727931/article/details/108110323
Copy the stem of the sample
Insert picture description here
question again: This question does not require the starting point of the traveling salesman , Does not meet the actual situation. In fact, what we often encounter is to solve the TSP problem with a fixed starting point, such as drone cruise. For this question, assume that the starting position coordinates of the traveling salesman is [2000,2000].

2. Program modification ideas

In line with the principle of moving as little code as possible, I only modified the distance calculation function func3 and the part of drawing the image.
The modified func3 function is as follows:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%计算路线总长度%%%%%%%%%%%%%%%%%%%%%%%%
function len=func3(start,city,n)
len=0;
for i=1:n-1
    len=len+sqrt((city(i).x-city(i+1).x)^2+(city(i).y-city(i+1).y)^2);
end
len=len+sqrt((city(1).x-start(1))^2+(city(1).y-start(2))^2); 
len=len+sqrt((city(n).x-city(1).x)^2+(city(n).y-city(1).y)^2);
end

In the main function part, enter an additional parameter start for all func3 functions, which represents the starting point coordinates.
The main function part of the code is as follows:

%%%%%%%%%%%%%%%%%%%%%%模拟退火算法解决TSP问题%%%%%%%%%%%%%%%%%%%%%%%

% 如果将该算法改为固定位置,起始位置为[2000,2000]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;                      %清除所有变量
close all;                      %清图
clc;                            %清屏
start=[2000,2000];
C=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;...
    3238 1229;4196 1044;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 2376;...
    3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;...
    2370 2975];                  %31个省会城市坐标
n=size(C,1);                     %TSP问题的规模,即城市数目
T=100*n;                         %初始温度
L=100;                           %马可夫链长度
K=0.99;                          %衰减参数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%城市坐标结构体%%%%%%%%%%%%%%%%%%%%%%%%%%
city=struct([]);                %结构体变量,类似python中的字典
for i=1:n                       %city(i)的值为第i座城市的坐标
    city(i).x=C(i,1);
    city(i).y=C(i,2);
end
l=1;                             %统计迭代次数
len(l)=func3(start,city,n);            %每次迭代后的路线长度
% figure(1); 
while T>0.001                    %停止迭代温度
    %%%%%%%%%%%%%%%%多次迭代扰动,温度降低之前多次实验%%%%%%%%%%%%%%%
    for i=1:L            
        %%%%%%%%%%%%%%%%%%%计算原路线总距离%%%%%%%%%%%%%%%%%%%%%%%%%
        len1=func3(start,city,n);         
        %%%%%%%%%%%%%%%%%%%%%%%%%产生随机扰动%%%%%%%%%%%%%%%%%%%%%%%
        %%%%%%%%%%%%%%%%随机置换两个不同的城市的坐标%%%%%%%%%%%%%%%%%
        q = randi([1,n],1,2);           %这是我改的方法
        while q(1) == q(2)              % q取1到n之间两个不同的数
            q = randi([1,n],1,2);
        end
        tmp_city=city;
        tmp=tmp_city(q(1));
        tmp_city(q(1))=tmp_city(q(2));
        tmp_city(q(2))=tmp;

        %%%%%%%%%%%%%%%%%%%%%%%%计算新路线总距离%%%%%%%%%%%%%%%%%%%%
        len2=func3(start,tmp_city,n);     
        %%%%%%%%%%%%%%%%%%新老距离的差值,相当于能量%%%%%%%%%%%%%%%%%
        delta_e=len2-len1;
        %%%%%%%%%%%%新路线好于旧路线,用新路线代替旧路线%%%%%%%%%%%%%%  
        if delta_e<0        
            city=tmp_city;
        else
            %%%%%%%%%%%%%%%%%%以概率选择是否接受新解%%%%%%%%%%%%%%%%%
            if exp(-delta_e/T)>rand()
                city=tmp_city;      
            end
        end
    end
    l=l+1;
    %%%%%%%%%%%%%%%%%%%%%%%%%计算新路线距离%%%%%%%%%%%%%%%%%%%%%%%%%%
    len(l)=func3(start,city,n); 
    %%%%%%%%%%%%%%%%%%%%%%%%%%%温度不断下降%%%%%%%%%%%%%%%%%%%%%%%%%%
     T=T*K;   
%     for i=1:n-1
%         plot([city(i).x,city(i+1).x],[city(i).y,city(i+1).y],'bo-');
%         hold on;
%     end
%     plot([city(n).x,city(1).x],[city(n).y,city(1).y],'ro-');
%     title(['优化最短距离:',num2str(len(l))]);
%     hold off;
%     pause(0.005);
end
figure(1);

for i=1:n-1
    plot([city(i).x,city(i+1).x],[city(i).y,city(i+1).y],'bo-');
    hold on;
end
plot([city(n).x,start(1)],[city(n).y,start(2)],'ro-');
plot([city(1).x,start(1)],[city(1).y,start(2)],'ko-');
title(['优化最短距离:',num2str(len(l))])
hold off;
figure(2);
plot(len)

xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')

3. Program running results

The fitness evolution curve is as follows:
Insert picture description here
The optimization path is as follows:
Insert picture description here

Guess you like

Origin blog.csdn.net/weixin_45727931/article/details/108111526