模拟退火,求解函数的最小值。
函数
function result=func(x)
result=3*cos(x(1)*x(2))+x(1)+x(2)^2;
end
算法部分
clear; clc; close all;
Xmax=5; Xmin=-5;
Ymax=5; Ymin=-5;
L=200; %马尔科夫链长度
K=0.999; %衰减参数
S=0.02; %步长因子
T=100; %初始温度
YZ=1e-8; %容差
P=0;
Prex=rand*(Xmax-Xmin)+Xmin;
Prey=rand*(Ymax-Ymin)+Ymin;
PreBestx=Prex;
PreBesty=Prey;
Prex=rand*(Xmax-Xmin)+Xmin;
Prey=rand*(Ymax-Ymin)+Ymin;
Bestx=Prex; Besty=Prey;
delta=abs(func(Bestx,Besty)-func(PreBestx,PreBesty));
while delta>YZ && T>0.001
T=K*T;
for i=1:L
p=0;
while p==0
Nextx=Prex+S*(rand*(Xmax-Xmin)+Xmin);
Nexty=Prey+S*(rand*(Ymax-Ymin)+Ymin);
if Nextx>=Xmin && Nextx<=Xmax && Nexty>=Ymin && Nexty<=Ymax
p=1;
end
end
if func(Bestx,Besty)>func(Nextx,Nexty)
PreBestx=Bestx;
PreBesty=Besty;
Bestx=Nextx;
Besty=Nexty;
end
if func(Prex,Prey)>func(Nextx,Nexty)
Prex=Nextx;
Prey=Nexty;
P=P+1;
else
changer=-1*(func(Nextx,Nexty)-func(Prex,Prey))/T;
p1=exp(changer);
if p1>rand
Prex=Nextx;
Prey=Nexty;
P=P+1;
end
end
trace(P+1)=func(Bestx,Besty);
end
delta=abs(func(Nextx,Nexty)-func(Prex,Prey));
end
disp('最小点');
Bestx
Besty
disp('最小值');
func(Bestx,Besty)
plot(trace(2:end));