function [BestShortcut,theMinDistance]=SimulateAnneal4(dislist,Clist,cnod)
%TSP问题的模拟退火算法malab程序
clc;
close all;
% clear all;
f=inf;
% dislist=[f 2 3 2 f f f f f;
% 2 f 2 3 3 f f f f;
% 3 2 f 2 1 f f 1 f;
% 2 3 2 f f 3 f 4 f;
% f 3 1 f f f 3 2 f;
% f f f 3 f f 2 2 4;
% f f f f 3 2 f 2 3;
% f f 1 4 2 2 2 f 3;
% f f f f f 4 3 3 f];
% Clist=[0 1;0 0;1 0;1 1;1 -1;2 1;2 -1;1.5 0;3 0];
NodeNum=size(Clist,1);%TSP问题的规模,即城市数目
n=size(Clist,1);
d=dislist;
q=zeros(n,n);
for j=1:n
q(:,j)=j;
end
for k=1:n
for i=1:n
for j=1:n
if d(i,j)>d(i,k)+d(k,j)
d(i,j)=d(i,k)+d(k,j);
q(i,j)=q(i,k);
end
end
end
end
for j=1:n
d(j,j)=0;
end
x=[2:NodeNum];
need=3-mod((NodeNum-1),3);
x=[x,zeros(1,need)];
circlenum=floor((NodeNum-1)/3);
x=x(randperm(length(x)));
for i=1:circlenum
x=[x(1:4*i-1),1,x(4*i:length(x))];
end
x=[1,x];
x(x==0)=[];
NodeNum=length(x);
%d=rand(100,100);
[~,n]=size(d);
t0=100; %t0初始温度=100K
t=t0;
tf=1; %tf最终温度=100K
%x=randperm(n); %领域初始解表示第i个人做i个事
xbest=x;
xrealbest=x; %领域最优解
c=1;
fmin=fun(d,x);
frealmin=fun(d,x);%将初始可行解下的目标函数设为当前最优目标值
num=1;
figure(1);
stop = uicontrol('style','toggle','string'...
,'stop','background','white');
tic;
cc=0;
while t>tf && num<2000
for k=1:500; %内循环停止准则5000次
fx=fun(d,x); %计算新解的函数值。
fb=fx-frealmin;
if fb<=0 && cc<=3
xbest=x;
fmin=fx;
xrealbest=x;
frealmin=fx;%无条件跳转,取最优值与最优解。
elseif fb>0
p=exp(-fb/t);
if p>rand
xbest=x;
fmin=fx; %有条件跳转,取最优值与最优解。
elseif p<=rand
x=x; %不处理
end
end
x=[2:n];
need=3-mod((n-1),3);
x=[x,zeros(1,need)];
circlenum=floor((n-1)/3);
x=x(randperm(length(x)));
for i=1:circlenum
x=[x(1:4*i-1),1,x(4*i:length(x))];
end
x=[1,x];
x(x==0)=[];
%以下是添加约束:到c点路程不能超过3,cc为s到c的路程
cc=0;
snod=1;
add1=find(x==snod);
add2=find(x==cnod);
cha=add2-add1;
cha=cha(cha>0);
i=1;
while i<=min(cha)
if i==n
cc=cc+d(x(i),x(1));
i=1;
else
cc=cc+d(x(i),x(i+1));
i=i+1;
end
end
end
t=0.997*t; %模拟退火操作
BestL=frealmin;
ArrBestL(num)=BestL;
NodeNum=n;
BSF=xrealbest;
ArrBestL(num)=BestL;
for i=1:NodeNum-1
plot([Clist(BSF(i),1),Clist(BSF(i+1),1)],[Clist(BSF(i),2),Clist(BSF(i+1),2)],'bo-');
hold on;
end
plot([Clist(BSF(NodeNum),1),Clist(BSF(1),1)],[Clist(BSF(NodeNum),2),Clist(BSF(1),2)],'ro-');
title(['迭代次数:',int2str(num),' 优化最短距离:',num2str(BestL)]);
hold off;
pause(0.005);
if get(stop,'value')==1
break;
end
%存储中间结果为图片
% if (p==1||p==5||p==10||p==20||p==60||p==150||p==400||p==800||p==1500||p==2000)
% filename=num2str(p);
% fileformat='jpg';
% saveas(gcf,filename,fileformat);
% end
num=num+1; %迭代次数加1
end
len=length(BSF);
add=find(BSF==cnod);
bs=BSF(add:len);
bs=[bs,BSF(1:add-1)];
BSF=bs;
add=find(BSF==snod, 1, 'last' );
bs=BSF(add:len);
bs=[bs,BSF(1:add-1)];
BSF=bs;
toc %用来保存完成时间
BestShortcut=BSF; %最佳路线
theMinDistance=BestL; %最佳路线长度
set(stop,'style','pushbutton','string','close', 'callback','close(gcf)');
figure(2);
plot(ArrBestL,'b');
xlabel('迭代次数');
ylabel('目标函数值');
title('适应度进化曲线');
grid;
hold on;
% function fmin=fun(d,x)
% fmin=0;
% n=length(x);
% for i=1:n
% fmin=fmin+d(i,x(i)); %计算第i个人做x(i)任务时总时间。
% end
function fmin=fun(d,x)
fmin=0;
n=length(x);
for i=1:n-1
fmin=fmin+d(x(i),x(i+1)); %计算第i个人做x(i)任务时总时间。
end
fmin=fmin+d(x(n),x(1));
小波思基
- 粉丝: 88
- 资源: 1万+
最新资源
- mCloud_11.3.5_24113518_1282.apk
- 三相PWM整流器闭环仿真,电压电流双闭环控制,输出直流电压做外环 模型中包含主电路,坐标变,电压电流双环PI控制器,SVPWM控制,PWM发生器 matlab simulink模型 功率因数1,低TH
- 算法题解与优化基础教程
- 数据结构与算法基础教程
- GA-PID,采用遗传算法优化PID参数,或者叫PID参数整定 matlab代码 PID和被控对象部分采用simulink搭建的
- 计算机考试习题基础教程:从入门到精通
- 数据集构建与分析基础教程
- 基于无权重系数占空比模型预测转矩永磁同步电机控制,主体采用matlab function模块编程,与c语言接近,便于实物移植 【提供参考lunwen】 相比于传统模型预测转矩控制性能提高很多 可赠
- 欧拉法仿真铺粉元素偏移, 里面包含高斯移动热源,温度梯度设置,以及元素偏析模拟和四种元素的铺粉定向能量沉积模型以及全视频讲解,包含完整的仿真模型以及自定义编程代码和讲解视频(反冲与元素基本模型三维)
- 10位100M,SAR ADC完整电路,包括仿真测试代码,建模代码,电路文件,奈奎斯特频有效位数9.8
- 电阻炉温度仿真, 模糊PID控制电阻炉温度仿真, 其中包括量化因子,比例因子的设定, 以及全篇介绍文档 拿来就可以用
- 分布式电源风机与光伏的并网Matlab Simulink仿真,包含两种风机与光伏类型,附带参考文献 直驱:机侧最佳叶尖速比控制,网侧双闭环控制,额定功率300kW,并网等级690V 双馈:机侧转速
- e2studio开发RA0E1(10)-TAU配置One-Shot模式生成固定数量PWM
- MATLAB 代码:考虑阶梯式碳机制与电制氢的综合能源系统热电优化 关键词:碳 电制氢 阶梯式碳 综合能源系统 热电优化 参考文档:《考虑阶梯式碳机制与电制氢的综合能源系统热电优化》基本复现 仿
- 简单质量添加单层以及多层 里面包含简单的三维质量源项以及移动高斯热源,并且可以进行多层熔覆模拟,包含完整的仿真模型以及自定义编程代码和讲解视频
- 大厂量产的PCS储能源代码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈