@[TOC](单目标多变量模拟退火算法)
%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
D=3; %变量维数
lb=[75 255 14]; %下界
ub=[90 300 20]; %上界
%%%%%%%%%%%%%%%%%%%%%冷却表参数%%%%%%%%%%%%%%%%%%%%
L=20; %马尔科夫链长度
K=0.998; %衰减参数
S=0.01; %步长因子
T=100; %初始温度
YZ=1e-8; %容差
P=0; %Metropolis过程中总接受点
%%%%%%%%%%%%%%%%%%%%%随机选点初值设定%%%%%%%%%%%%%%%%%%%%
for i=1:D
PreX(i)=rand*(ub(i)-lb(i))+lb(i);
PreBestX=PreX;
Prex(i)=rand*(ub(i)-lb(i))+lb(i);
BestX=Prex;
end
%%%%%%%%%%%%%%%%%每迭代一次退火一次,直到满足迭代条件%%%%%%%%%%%%%%%%
deta=abs(Fitness_Function(BestX)-Fitness_Function(PreBestX));
while (deta>YZ) && (T>0.001)
T=K*T;
%%%%%%%%%%%%%%%%%%%%%在当前温度T下迭代次数%%%%%%%%%%%%%%%%%%%%%
for i=1:L
%%%%%%%%%%%%%%%%%%%%%在此点附近随机选下一点%%%%%%%%%%%%%%%%%%%%%
for j=1:D
NextX(j)=PreX(j)+S*(rand*(ub(j)-lb(j))+lb(j));
end
%%%%%%%%%%%%%%%%%%%%%边界条件处理%%%%%%%%%%%%%%%%%%%%%
for jj=1:D
if NextX(jj)>ub(j) || NextX(jj)<lb(j)
NextX(jj)=PreX(jj)+S*(rand*(ub(j)-lb(j))+lb(j));
end
end
%%%%%%%%%%%%%%%%%%%%%是否全局最优解%%%%%%%%%%%%%%%%%%%%%
if (Fitness_Function(BestX)>Fitness_Function(NextX))
%%%%%%%%%%%%%%%%保留上一个最优解%%%%%%%%%%%%%%%%
PreBestX=BestX;
%%%%%%%%%%%%%%%%此为新的最优解%%%%%%%%%%%%%%%%
BestX=NextX;
end
%%%%%%%%%%%%%%%%%%%%%Metropolis过程%%%%%%%%%%%%%%%%%%%%%
if (Fitness_Function(PreX)-Fitness_Function(NextX)>0)
%%%%%%%%%%%%%%%%接受新解%%%%%%%%%%%%%%%%
PreX=NextX;
P=P+1;
else
changer=-1*(func1(NextX)-func1(PreX))/T;
p1=exp(changer);
%%%%%%%%%%%%%%%%接受较差的解%%%%%%%%%%%%%%%%
if p1>rand
PreX=NextX;
P=P+1;
end
end
trace(P+1)=Fitness_Function(BestX);
end
deta=abs(Fitness_Function(BestX)-Fitness_Function(PreBestX));
end
disp('最小值在点:');
BestX
disp('最小值为:')
func1(BestX)
figure
plot(trace(2:end))
xlabel('迭代次数')
ylabel('目标函数值')
迭代结果图
参考文献
智能优化算法及其MATLAB实例(第2版)包子阳等