模拟退火算法学习

新的学期,新的征程!

先附上退火算法的原理——http://www.cnblogs.com/heaad/archive/2010/12/20/1911614.html
退火算法简单概括就是尽量跳出局部最优解,寻找全局最优解。
下面附上晚上写的代码,用的问题是教程中的旅游最短路线问题。

clear all
% 导入城市坐标数据
X = [16.4700   96.1000;
     16.4700   94.4400;
     20.0900   92.5400;
     22.3900   93.3700;
     25.2300   97.2400;
     22.0000   96.0500;
     20.4700   97.0200;
     17.2000   96.2900;
     16.3000   97.3800;
     14.0500   98.1200;
     16.5300   97.3800;
     21.5200   95.5900;
     19.4100   97.1300;
     20.0900   92.5500];
%  计算距离矩阵
dis=zeros(length(X));
for i=1:length(X)
    dis(i,:)=sqrt(sum((X-X(i,:)).^2,2));
end
T0=1e10;% 初始温度
Trend=1e-30; % 终止温度
q=0.9; % 降温速率
syms x;
Time = ceil(solve(T0 *(0.9).^x==Trend,x));  % 计算迭代次数
count=0; % 迭代计数
s1=randperm(length(X));% 初始化路径
s1_distance=0; 
for i=1:length(X) % 初始化路径总距离
    s1_distance=s1_distance+dis(s1(i),s1(rem(i,length(X))+1));
end
%本次算法通过随机交换路线中两个城市来获得新的路线
while count<=Time
    T0=T0*0.9;
    rand_city=round(rand(1,2)*(length(X)-1)+1);
    s2=s1;
    w=s2(rand_city(1));
    s2(rand_city(1))=s2(rand_city(2));
    s2(rand_city(2))=w;
    s2_distance=0;
    for i=1:length(X) % 计算改变路线后的总距离
        s2_distance=s2_distance+dis(s2(i),s2(rem(i,length(X))+1));
    end
    ds=s1_distance-s2_distance;
    if ds>0 % 选择两个方案的最优解
        s1=s2;
        s1_distance=s2_distance;
    elseif exp(ds/T0)>=rand % 如新的值为非最优解,依靠概率判断是否接受非最优解
        s1=s2;
        s1_distance=s2_distance;
    end
    count=count+1;
end
disp(s1)
注意:模拟退火算法是一种随机算法,并不一定能找到全局的最优解,但是可以比较快的找到近似最优解。 如果参数设置得当,模拟退火算法搜索效率比穷举法要高。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值