这是一个优化算法,找到使目标输出最好的那个输入,很多优化算法的区别就在于他是按照什么思路寻找,即按照什么方式来改变输入,而sa则模拟了退火的过程来调整自己的输入。
1.算法函数
function[output]=SA(sample,m,minT,k)
%%我对模拟退火算法的理解是这样的:已知样本集sample,其中有许多的输入向量与输出向量;
%%我们按照广泛意义的SA算法不断改变输入,寻找那个使得目标函数最小的输出,在寻找的...
%%过程中有minT和k作为终止条件,把最后找到的最小目标函数的输入输出作为output
%sample是一个N*(m+n)的矩阵,N为样本总数,m为输入向量长度,n为输出向量长度
%minT与样本中输出的单位一致,k为正数,当:输出<minT 或者 寻找次数>k时刻,停止寻找
%output是长度为(m+n)的行向量,表示找到的最小目标函数的样本
[N,col]=size(sample);%n=col-m;
pos=1;
Wo=sample(pos,1:m);%输入
To=sample(pos,m+1:col);%输出
Jo=To;%目标函数,此处设为输出,意在找到输出中的最小值,可以根据需要改变
for i=1:1:k %%k<=N-1
if To<minT
break;
end
pos=pos+1;
Wn=sample(pos,1:m);
Tn=sample(pos,m+1:col);
Jn=Tn;
delta=Jn-Jo;
if delta<=0
Wo=Wn;
To=Tn;
Jo=Jn;
else
if exp(-delta/sqrt(To*To'))>rand()
Wo=Wn;
To=Tn;
Jo=Jn;
end
end
end
output=[Wo,To];
2.算法实例
找到一条曲线中的最低点
x=-2:0.1:2;
y=power(x,2)-sin(x);
figure
plot(x,y);
sample=[x',y'];
[output]=SA(sample,1,0,40);
hold on
plot(output(1,1),output(1,2),'ro');
hold off
%%让minT=0,找到的样本是红色圆圈
[output]=SA(sample,1,-1,40);
hold on
plot(output(1,1),output(1,2),'go');
hold off
%%让minT=-1,找到的样本是绿色圆圈