clc;
clear;
clf;
%% ------------------------------------------------------------------------
%加载数据
cp_x = load('cp_x.mat');
cp_y = load('cp_y.mat');
vars = load('var.mat');
data = zeros(25,2);
%% ------------------------------------------------------------------------
%模拟退火参数设置
n = size(data,1); %站点数量
indx = 1:n;
T = 100*n; %初始温度
L = 100; %马尔可夫链长度
K = 0.99; %衰减参数
%% ------------------------------------------------------------------------
%站点坐标结构体
varm = vars.var;
cp = struct('x',cp_x.cp_x,'y',cp_y.cp_y);
cpx = cp.x;
cpy = cp.y;
xx = cp.x;
yy = cp.y;
lem = 1; %迭代次数
[tar(lem), len(lem)] = funcp(cpx,cpy,n,varm);
figure('Color','white');
while T > 0.001 %停止迭代温度
%多次迭代扰动,温度降低前多次实验
for cnt = 1:L
%计算原路线距离
[tar1, ~] = funcp(cpx,cpy,n,varm);
%产生随机扰动
%随机置换两个不同站点的坐标
p1 = floor(1+n*rand());
p2 = floor(1+n*rand());
while p1 == p2
p1 = floor(1+n*rand());
p2 = floor(1+n*rand());
end
tmp_cpx = cpx;
tmpx = tmp_cpx(p1);
tmp_cpx(p1) = tmp_cpx(p2);
tmp_cpx(p2) = tmpx;
tmp_cpy = cpy;
tmpy = tmp_cpy(p1);
tmp_cpy(p1) = tmp_cpy(p2);
tmp_cpy(p2) = tmpy;
%% ----------------------------------------------------------------
%计算新路线总距离
[tar2, ~] = funcp(tmp_cpx,tmp_cpy,n,varm);
%% ----------------------------------------------------------------
%新老距离的差值,相当于能量
delta_e = tar2-tar1;
%% ----------------------------------------------------------------
%若新路线好于旧路线,用新路线代替旧路线
if delta_e < 0
cpx = tmp_cpx;
cpy = tmp_cpy;
else
%依概率选择是否接收新解
if exp(-delta_e/T) > rand()
cpx = tmp_cpx;
cpy = tmp_cpy;
end
end
end
lem = lem+1;
%% --------------------------------------------------------------------
%计算新路线距离
[tar(lem), len(lem)] = funcp(cpx,cpy,n,varm);
disp(["优化最短距离:", num2str(len(lem))])
disp(["起点坐标:", num2str([cpx(1), cpy(1)])])
disp(["最后一个站点坐标:", num2str([cpx(n), cpy(n)])])
%温度不断下降
T =T*K;
for jj = 1:n-1
plot([cpx(jj), cpx(jj+1)], [cpy(jj), cpy(jj+1)], "o-","LineWidth", 1.2);
hold on;
end
plot([cpx(n), cpx(1)], [cpy(n), cpy(1)],'r-.',"LineWidth", 1.5);
axis([0,120,-2,58]);
for kk = 1:n
text(xx(kk)+0.5,yy(kk)+0.75,num2str(varm(kk)),'fontsize',10);
text(xx(kk)+0.5,yy(kk)-0.75,num2str(indx(kk)),'fontsize',8);
end
title(['优化最短距离:', num2str(len(lem))]);
hold off;
end
figure('2');
plot(tar, 'LineWidth', 1.1)
axis([0,length(len),floor(min(len)),ceil(max(len))])
xlabel("迭代次数")
ylabel("目标函数值")
title('适应度进行曲线')
disp("优化结束")
%% ------------------------------------------------------------------------
计算目标函数和路线总长度函数
function [tar, len] = funcp(cpx,cpy,n,varm)
tar = 0;
len = 0;
for ii = 1:n-1
tar = tar+sqrt((cpx(ii)-cpx(ii+1))^2+(cpy(ii)-cpy(ii+1))^2)+10*(1000-varm(ii));
len = len+sqrt((cpx(ii)-cpx(ii+1))^2+(cpy(ii)-cpy(ii+1))^2);
end
tar = tar+sqrt((cpx(n)-cpx(1))^2+(cpy(n)-cpy(1))^2)+10*(1000-varm(1));
len = len+sqrt((cpx(n)-cpx(1))^2+(cpy(n)-cpy(1))^2);
end