17-2利用模拟退火算法进行路径规划——寻找途径14个城市的最优路线和总距离(附matlab程序)

1.简述

      模拟退火算法来源于固体退火原理,是一种基于概率的算法。模拟退火算法是通过赋予搜索过程一种时变且最终趋于零的概率突跳性,从而可有效避免陷入局部极小并最终趋于全局最优的串行结构的优化算法。

流程图

模拟退火算法:
  模拟退火算法原理是依据金属物质退火过程和优化问题之间的相似性。物质在加热的时候,粒子间的布朗运动增强,到达一定强度后在进行退火,粒子热运动减弱,并逐渐趋于有序,最后达到稳定。
  这段话我的理解是:物体在在加热过程中,粒子之间的运动非常活跃,映射到爬山过程中,就是此时爬山人的能力非常强,能从一个山头跳到另一个山头上,此时可以完美解决爬山算法中陷入局部最优的问题,此时要注意,现在仍然在运行爬山算法的理论,仍然在判断最高的山头,也就是整体的跳跃还是趋于往最高处走的。但太活跃也不好,有可能随便一跳就把最优的山头跳过去了,这怎么办?没关系,这是退火算法,精髓在退火过程中。当物体加热到一定温度之后,开始退火,也就是降温,随着温度下降,粒子间运动减弱,也就是爬山人的的体力慢慢下降,此时跳跃能力减弱,有可能只能从山头跳到半山腰了。这个时候,由于体力下降了,但是在之前整体趋势还是往最高的山头走,那么在某个时刻,一定会找到最高的山头,并且在最高的山头上,跳不出去了(要知道,体力越下降,越跳不动)。直到物质温度降低到粒子间运动可以忽略不记的时候,此时爬山人可能累的只能步行了,此时整个算法就和爬山算法一样了,只能在最高的山头上找局部最优解(但作为最高的山头,局部最优解就是全局最优)。这就是模拟退火算法从退火过程中找到的理论基础。
  上面的解释有个需要思考的地方,物质的粒子间运动能力,是由于温度变化引起的,那么爬山人的体力问题是靠什么引起的?时间?仔细想想这个问题就能发现模拟退火算法提出者的睿智之处。
下面部分讲解参考B站:数学建模清风第二次直播:模拟退火算法
  模拟退火算法中的能力是靠随着时间变化得出的概率从而引起变化的,这句话可以分为两句。第一,靠概率引起变化;第二,概率随时间变化。模拟退火算法试想一下,若爬山人当前处于一个位置,往左走海拔变高,往右走海拔变低,但是通过计算得知,他下一步需要往右走若干米(往右走海拔变低),那么他要往右走么?如果你的答案是拒绝往右走,那么你使用的算法就是爬山算法了,你会大概率陷入局部最优。所以,正确答案是,以一定的概率接受这个结果,那么概率如何算?假设第一种情况:下一步的海拔与当前点的海拔相差无几;第二个情况:下一步的海拔与当前点的海拔相差巨大。你是不是更倾向于接受情况一。把海拔高度还原成函数值,即当前点的函数值(海拔值)f(A),以及下一步的函数值f(B),他俩的差值越小,你接受下一点的概率就越大。
 

2.代码

%% I. 清空环境变量
clear all
clc

%% II. 导入城市位置数据
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];

%% III. 计算距离矩阵
D = Distance(X);  %计算距离矩阵   对角线上为0
N = size(D,1);    %城市的个数

%% IV. 初始化参数
T0 = 1e10;   % 初始温度
Tend = 1e-30;  % 终止温度
L = 2;    % 各温度下的迭代次数,没有用到
q = 0.9;    %降温速率
Time = ceil(double(solve([num2str(T0) '*(0.9)^x = ',num2str(Tend)])));  % 计算迭代的次数
% Time = 132;
count = 0;        %迭代计数
Obj = zeros(Time,1);         %目标值矩阵初始化
track = zeros(Time,N);       %每代的最优路线矩阵初始化

%% V. 随机产生一个初始路线
S1 = randperm(N);
DrawPath(S1,X)
disp('初始种群中的一个随机值:')
OutputPath(S1);
Rlength = PathLength(D,S1);
disp(['总距离:',num2str(Rlength)]);

%% VI. 迭代优化
while T0 > Tend
    count = count + 1;     %更新迭代次数
    temp = zeros(L,N+1);
    %%
    % 1. 产生新解  增加一个扰动
    S2 = NewAnswer(S1);
    %%
    % 2. Metropolis法则判断是否接受新解
    [S1,R] = Metropolis(S1,S2,D,T0);  %Metropolis 抽样算法
    %%
    % 3. 记录每次迭代过程的最优路线
    if count == 1 || R < Obj(count-1)
        Obj(count) = R;           %如果当前温度下最优路程小于上一路程则记录当前路程
    else
        Obj(count) = Obj(count-1);%如果当前温度下最优路程大于上一路程则记录上一路程
    end
    track(count,:) = S1;
    T0 = q * T0;     %降温
end

%% VII. 优化过程迭代图
figure
plot(1:count,Obj)
xlabel('迭代次数')
ylabel('距离')
title('优化过程')

%% VIII. 绘制最优路径图
DrawPath(track(end,:),X)

%% IX. 输出最优解的路线和总距离
disp('最优解:')
S = track(end,:);
p = OutputPath(S);
disp(['总距离:',num2str(PathLength(D,S))]);
 

3.运行结果

 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

素馨堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值