模拟退火是模拟自然界中退火时分子无规则运动的现象,它运用了贪心的思想来找极值。但是贪心算法是短见,有时无法寻找全局最优。在模拟退火中,我们设定了一个概率使其能够跳出局部最优的情况,从而找到全局最优。
clear;
clc;
tmp=1e5; %温度可以先进行一个升温的过程,直到所有尝试运动都被接受即可设置为最初温度
k=0.98; %降温系数
count=0; %迭代次数
l=0;
u=9; %函数的定义域
draw_f(); %画函数
tmp_txt=text(0,0,'0 0'); %这是温度的文本初始化
endcount=10000; %等温情况最大迭代次数
endtmp=1e-3; %终止温度
x_old=(u-l)*rand()+l;
f_old=f(x_old);
x_new=x_old;
f_new=f_old;
cost=0;
while tmp>endtmp
delt=(rand-0.5)*3; %扰动
x_new=x_old+delt;
if(x_new<l||x_new>u) %防止越界
x_new=x_new-2*delt;
end
f_new=f(x_new);
cost=f_old-f_new; %新的cost
flag=0;
if(cost < 0)
flag = 1;
else
d = exp(-(cost / tmp)); %0-1之间的随机数 exp 就是e
if(d > rand) %以一定的概率跳出局部最优
flag = 1;
else
flag = 0;
end
end
if flag==1
x_old=x_new;
f_old=f_new;
end
if cost<0 %当花费更小时降温度
delete(tmp_txt); %温度文本
hold on; scatter(x_old,f_old); %画点
hold on; tmp_txt=text(0.3,21,['tmp:',num2str(tmp)]); %温度文本
pause(0.001);
tmp=tmp*k; %退火
else
count=count+1;
end
if(count>endcount)
break;
end;
end
function [y]=f(x)
y = x + 10 * sin(5 * x) + 7 * cos(4 * x);
end
function draw_f()
x=0:0.1:9;
val=f(x);
plot(x,val);
end