基于模拟退火与tsp问题的matlab实现

本文已参与「新人创作礼」活动,一起开启掘金创作之路

定义及流程图

模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。 ==这是关于模拟退火的科普网站==模拟退火 模拟退火实现起来主要分为三个部分: 1.加温过程。其目的是增强粒子的热运动,使其偏离平衡位置。当温度足够高时固体将融为液体,从而消除系统原先存在的非均匀状态。 2.等温过程。对于与周围环境交换热量而温度不变的封闭系统,系统状态的自发变化总是朝自由能减少的方向进行的,当自由能最小时,系统达到平衡状态。 3.冷却过程。使粒子热运动减弱,系统能力下降,得到晶体结构。 模拟退火作为智能算法可以用来求一些复杂问题的较优值,比如在tsp问题中就可以很好地运用,接下来笔者对基于模拟退火的tsp问题进行Matlab实现,让读者能更深刻体会模拟退火的过程。 在这里插入图片描述

题目及分析

这里是题目链接tsp例题,题目是英文,读者可以利用百度翻译翻译一下。题目: 在这里插入图片描述

分析:我们首先生成一个矩阵,每个元素为0,除了那些有n个石头的元素位置。而这些非0元素的位置就是我们推土车要移动到的坐标,根据题目的要求有10个非0元素(其他问题类似,改一下数据或其他小细节)。求经过所有点的最短路径,即可以转化为tsp问题,这样就很熟悉了吧。 话不多说,看==Matlab==代码吧:

代码与结果

详细代码请参看我的网站:详细代码

clear
clc
T0 = 1000;      % 起始温度
Tend = 1e-3;    % 终止温度
L = 200;    % 各温度下的迭代次数
q = 0.9;    % 降温速率
position = [2 8
    1 1
    5 9
    10 3
    4 5
    7 1
    3 2
    6 4
    5 5
    9 3];

% 计算各点之间的距离矩阵
[m,n] = size(position);
D = zeros(m);
for i = 1:m
    for j = 1:m
        if i == j
            D(i,j) = 0;
        else
            D(i,j) = sqrt((position(i,1)-position(j,1))^2+(position(i,2)-position(j,2))^2);
        end
    end
end

s1 = randperm(m); % 产生一个解、画图并输出路径
drawpath(s1,position);
disp('一可行解的路径')
outputpath(s1);
r = pathlength(D,s1);
disp(['回路长度为:',num2str(r)]);
count = 0;

% 开始迭代
while T0 > Tend
    temp = zeros(L,m+1);
    count = count + 1;
    for k = 1:L
        s2 = newanswer(s1);
        [s1,r] = metropolis(s1,s2,D,T0);
        temp(k,:) = [s1,r];
    end
    % 记录每次迭代的最优路线
    [~,index] = min(temp(:,end));
    record(count) = temp(index,end);
    track(count,:) = temp(index,1:end-1); 
    T0 = q*T0;
end
% 画图显示结果
[~,tip] = min(record);
drawpath(track(tip,:),position);
hold on 
title('最优路线')
figure
hold on
plot(1:count,record)
xlabel('迭代次数')
ylabel('距离')
title('优化过程')
disp(['最优路径与距离',num2str(record(tip))])
outputpath(track(tip,:));

详细代码请参看我的网站:详细代码 在这里插入图片描述 在这里插入图片描述

在这里插入图片描述 图1是任意解,图2是模拟退火算法寻得的最优解,图3是迭代过程中距离的优化过程。由图可知,最终找到最优解,说明模拟退火是解决此问题的不错的方法。

猜你喜欢

转载自juejin.im/post/7117819043888758797