《详解模拟退火算法Matlab实现》原文链接在此:http://t.csdn.cn/zxqK3
最近重新学习了模拟退火算法,对该文章中有误的NewAnswer.m代码进行了补充,新手可将该代码保存成m文件,同上文中的程序放在同一目录。
%NewAnswer 函数-------思小瓜2022-2-23
function [S2] = NewAnswer(S1)
%随机置换旅行的城市顺序,如原顺序7,2,9,10,4变为7,10,9,2,4。2和10调换位置。
%产生随机扰动
[~,n] = size(S1);%n为城市总数
p1=floor(1+n*rand());%随机产生两个城市号。城市序号表示几个到达的城市,n为城市数量,floor是向负无穷方向取整
p2=floor(1+n*rand());
while p1==p2%当随机产生的两个城市序号是相同时,再重新产生,直到两个城市序号不同
p1=floor(1+n*rand());
p2=floor(1+n*rand());
end
tmp = S1(p1); %临时变量tmp表示P1到达的城市的坐标
S1(p1)=S1(p2); %将第P2到达城市的坐标给第P1达到城市的坐标,例如:p1 = 3,p2 = 4.从原来的第3个到武汉,第4个地点去北京,变为第3个地点为北京,第4个地点为武汉
S1(p2)=tmp;
S2 = S1;
end
另外,上文中主程序SA_TSP.m中的“%% IV. 初始化参数”求解Time变量,添加一行代码。因为我用的是matlab 2014a,其他版本不清楚运行状况。
%% IV. 初始化参数
T0 = 1e10; % 初始温度,10的10次方!需要设定一个很大的温度。
Tend = 1e-30; % 终止温度
L = 2; % 各温度下的迭代次数
q = 0.9; %降温速率
syms x
Time = ceil(double(solve(num2str(T0) *(0.9)^x == num2str(Tend),x))); % 计算迭代的次数
% Time = 132;
count = 0; %迭代计数
Obj = zeros(Time,1); %目标值矩阵初始化
track = zeros(Time,N); %每代的最优路线矩阵初始化
各位点个赞再走呀,感激~