模拟退火算法


目录:
1.基本背景
2.原理及求解思路
3.利用matlab实现


一、基本背景

1.原始物理模型
退火是指将物体加热到足够高的温度,物体的微观分子呈现随机排布,最后温度降低时,分子排列趋于整齐有序的稳定状态。
1)退火的三种状态
a.加温过程—增强粒子的热运动,消除系统原先可能存在的非均匀态。
b.等温过程—对于与环境换热而温度不变的封闭系统,系统状态的自发变化总是朝着自由能减少的方向进行,系统达到平衡态。
c.冷却过程—使得粒子热运动减弱并且渐趋有序,系统能量下降,从而获得低能的晶体结构。
2)Metropolis准则(有概率选择当前非最优解的法则)
a.基本参数
设定粒子有两个状态特征:
    旧能量状态:E(old)
     新能量状态:E(new)
因此对于新旧状态的变化的接受概率P,有以下表示方法:
在这里插入图片描述
b.判断准则
  ①当E(old )>E(new)时
      old=new
  ②当E(old )<E(new)时
  判断相应的概率P与随机数进行比较,P>rand 则选择:
              old=new
  反之,则old保持不变。


二、原理及求解思路
它的跳出循环就是判断温度是否降低到最低以及和给定的迭代次数共同决定的,但是我个人还不是非常理解其本质原因


三、利用matlab实现TSP问题
解决TSP问题

clear all;close all;clc
n=20;                   %城市个数
temperature=100*n;      %初始温度
iter=100;               %内部蒙特卡洛循环迭代次数
%随机初始化城市坐标
city=struct([]);
for i=1:n
    city(i).x=floor(1+100*rand()); 
    city(i).y=floor(1+100*rand());
end
l=1;                            %统计迭代次数
len(l)=computer_tour(city,n);   %每次迭代后的路线长度  
netplot(city,n);                %初始旅行路线,用于连线的图,是顺序的
while temperature>0.001     %停止迭代温度
    
    for i=1:iter     %多次迭代扰动,一种蒙特卡洛方法,温度降低之前多次实验,迭代次数
        len1=computer_tour(city,n);         %计算原路线总距离
        tmp_city=perturb_tour(city,n);      %产生随机扰动,随机置换两个城市的坐标
        len2=computer_tour(tmp_city,n);     %计算新路线总距离
        
        delta_e=len2-len1;  %新老距离的差值,相当于能量
        if delta_e<0        %新路线好于旧路线,用新路线代替旧路线
            city=tmp_city;
        else                        %温度越低,越不太可能接受新解;新老距离差值越大,越不太可能接受新解
            if exp(-delta_e/temperature)>rand() %以概率选择是否接受新解
                city=tmp_city;      %可能得到较差的解
            end
        end        
    end
    l=l+1;
    len(l)=computer_tour(city,n);   %计算新路线距离
    temperature=temperature*0.99;   %温度不断下降
  
end  
figure;
netplot(city,n);    %最终旅行路线
figure;
plot(len)```
函数实现




function city=perturb_tour(city,n)  
       %随机置换两个不同的城市的坐标
    %产生随机扰动
    p1=floor(1+n*rand());%floor为取整函数
    p2=floor(1+n*rand());
    while p1==p2
        p1=floor(1+n*rand());
        p2=floor(1+n*rand());    
    end
    tmp=city(p1);
    city(p1)=city(p2);
    city(p2)=tmp;
end


function netplot(city,n)        %连线各城市,将路线画出来
    hold on;
    for i=1:n-1
        plot(city(i).x,city(i).y,'r*');  
        line([city(i).x city(i+1).x],[city(i).y city(i+1).y]);  %只连线当前城市和下家城市     
    end
    plot(city(n).x,city(n).y,'r*');  
    line([city(n).x city(1).x],[city(n).y city(1).y]);     %最后一家城市连线第一家城市
    hold off;
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值