模拟退火代码实现

   模拟退火是模拟自然界中退火时分子无规则运动的现象,它运用了贪心的思想来找极值。但是贪心算法是短见,有时无法寻找全局最优。在模拟退火中,我们设定了一个概率使其能够跳出局部最优的情况,从而找到全局最优。 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值