SA模拟退火算法

这是一个优化算法,找到使目标输出最好的那个输入,很多优化算法的区别就在于他是按照什么思路寻找,即按照什么方式来改变输入,而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,找到的样本是绿色圆圈


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值