Java教程

【TSP】基于matlab灰狼算法求解旅行商问题【含Matlab源码 1327期】

本文主要是介绍【TSP】基于matlab灰狼算法求解旅行商问题【含Matlab源码 1327期】,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、TSP简介

旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。
TSP的数学模型
在这里插入图片描述

二、灰狼算法简介

1 前言:
灰狼优化算法(Grey Wolf Optimizer,GWO)由澳大利亚格里菲斯大学学者 Mirjalili 等人于2014年提出来的一种群智能优化算法。该算法受到了灰狼捕食猎物活动的启发而开发的一种优化搜索方法,它具有较强的收敛性能、参数少、易实现等特点。近年来受到了学者的广泛关注,它己被成功地应用到了车间调度、参数优化、图像分类等领域中。
2 算法原理:
灰狼隶属于群居生活的犬科动物,且处于食物链的顶层。灰狼严格遵守着一个社会支配等级关系。如图:
在这里插入图片描述
社会等级第一层:狼群中的头狼记为 \alpha,\alpha 狼主要负责对捕食、栖息、作息时间等活动作出决策。由于其它的狼需要服从\alpha 狼的命令,所以 \alpha 狼也被称为支配狼。另外, \alpha 狼不一定是狼群中最强的狼,但就管理能力方面来说, \alpha 狼一定是最好的。

社会等级第二层:\beta 狼,它服从于 \alpha 狼,并协助 \alpha 狼作出决策。在 \alpha 狼去世或衰老后,\beta 狼将成为 \alpha 狼的最候选者。虽然 \beta 狼服从 \alpha 狼,但 \beta 狼可支配其它社会层级上的狼。

社会等级第三层:\delta 狼,它服从 \alpha 、\beta 狼,同时支配剩余层级的狼。\delta 狼一般由幼狼、哨兵狼、狩猎狼、老年狼及护理狼组成。

社会等级第四层:\omega 狼,它通常需要服从其它社会层次上的狼。虽然看上去 \omega 狼在狼群中的作用不大,但是如果没有 \omega 狼的存在,狼群会出现内部问题如自相残杀。

GWO 优化过程包含了灰狼的社会等级分层、跟踪、包围和攻击猎物等步骤,其步骤具体情况如下所示。

1)社会等级分层(Social Hierarchy)当设计 GWO 时,首先需构建灰狼社会等级层次模型。计算种群每个个体的适应度,将狼群中适应度最好的三匹灰狼依次标记为 \alpha、\beta 、\delta ,而剩下的灰狼标记为 \omega。也就是说,灰狼群体中的社会等级从高往低排列依次为; \alpha、\beta 、\delta 及 \omega。GWO 的优化过程主要由每代种群中的最好三个解(即 \alpha、\beta 、\delta )来指导完成。

2)包围猎物( Encircling Prey )灰狼捜索猎物时会逐渐地接近猎物并包围它,该行为的数学模型如下:
在这里插入图片描述
式中:t 为当前迭代次数:。表示 hadamard 乘积操作;A 和 C 是协同系数向量;Xp 表示猎物的位置向量; X(t) 表示当前灰狼的位置向量;在整个迭代过程中 a 由2 线性降到 0; r1 和 r2 是 [0,1] 中的随机向量。

3)狩猎( Hunring)

灰狼具有识别潜在猎物(最优解)位置的能力,搜索过程主要靠 \alpha、\beta 、\delta 灰狼的指引来完成。但是很多问题的解空间特征是未知的,灰狼是无法确定猎物(最优解)的精确位置。为了模拟灰狼(候选解)的搜索行为,假设 \alpha、\beta 、\delta 具有较强识别潜在猎物位置的能力。因此,在每次迭代过程中,保留当前种群中的最好三只灰狼( \alpha、\beta 、\delta ),然后根据它们的位置信息来更新其它搜索代理(包括 \omega)的位置。该行为的数学模型可表示如下:
在这里插入图片描述
式中:X_{{\alpha }}、X{{\beta }}、X{{\delta }} 分别表示当前种群中 \alpha、\beta 、\delta 的位置向量;X表示灰狼的位置向量;D{{\alpha }}、D{{\beta }}、D{_{\delta }} 分别表示当前候选灰狼与最优三条狼之间的距离;当|A|>1时,灰狼之间尽量分散在各区域并搜寻猎物。当|A|<1时,灰狼将集中捜索某个或某些区域的猎物。
在这里插入图片描述
从图中可看出,候选解的位置最终落在被 \alpha、\beta 、\delta 定义的随机圆位置内。总的来说, \alpha、\beta 、\delta 需首先预测出猎物(潜
在最优解)的大致位置,然后其它候选狼在当前最优兰只狼的指引下在猎物附近随机地更新它们的位置。

4)攻击猎物(Attacking Prey)构建攻击猎物模型的过程中,根据2)中的公式,a值的减少会引起 A 的值也随之波动。换句话说,A 是一个在区间[-a,a](备注:原作者的第一篇论文里这里是[-2a,2a],后面论文里纠正为[-a,a])上的随机向量,其中a在迭代过程中呈线性下降。当 A 在[-1,1]区间上时,则捜索代理(Search Agent)的下一时刻位置可以在当前灰狼与猎物之间的任何位置上。

5)寻找猎物(Search for Prey)灰狼主要依赖 \alpha、\beta 、\delta 的信息来寻找猎物。它们开始分散地去搜索猎物位置信息,然后集中起来攻击猎物。对于分散模型的建立,通过|A|>1使其捜索代理远离猎物,这种搜索方式使 GWO 能进行全局搜索。GWO 算法中的另一个搜索系数是C。从2)中的公式可知,C向量是在区间范围[0,2]上的随机值构成的向量,此系数为猎物提供了随机权重,以便増加(|C|>1)或减少(|C|<1)。这有助于 GWO 在优化过程中展示出随机搜索行为,以避免算法陷入局部最优。值得注意的是,C并不是线性下降的,C在迭代过程中是随机值,该系数有利于算法跳出局部,特别是算法在迭代的后期显得尤为重要。

3 VRP问题描述:
假设在一个供求关系系统中,车辆从货源取货,配送到对应的若干配送点。车辆存在最大载货量,且配送可能有时间限制。需要合理安排取货时间,组织适当的行车路线,使用户需求得到满足,同时使某个代价函数最小,比如总工作时间最少、路径最短等。

可以看出TSP问题是VRP问题的一种简单特殊形式。因此,VRP也是一种NP hard 问题。

三、部分源代码

clc;
clear;

%% TSP问题设置
% 产生问题模型
model = CreateModel('Oliver30.txt');    
% 城市分布图
figure(1);
plot(model.x, model.y, 'ms', 'LineWidth', 2, 'MarkerEdgeColor', 'k', 'MarkerFaceColor', 'g')
legend('城市位置')
title('城市分布图', 'fontsize', 12)
xlabel('km', 'fontsize', 12)
ylabel('km', 'fontsize', 12)
grid on
% 适应度函数句柄
Fun = @(tour) TourLength(tour, model); 
% TSP参数
M = model.n;                % 城市个数     
% GWO参数
N = 50;       % 灰狼个数
Max_iter = 1000;            % 最大迭代次数
lb = -10;   % Lower Bound
ub = 10;   % Upper Bound
dim = M;                        % 维数

% 初始化alpha, beta, and delta_pos
Alpha_pos = zeros(1,dim);
Alpha_score = inf; 

Beta_pos = zeros(1,dim);
Beta_score = inf; 

Delta_pos = zeros(1,dim);
Delta_score = inf; 
% 初始化种群位置
Positions = rand(N, dim).*(ub-lb)+lb;

Length_best = zeros(1, Max_iter);
Length_ave = zeros(1, Max_iter);

l = 1;   % 迭代计数器

%% 迭代寻优
while l < Max_iter+1
    for i = 1:N
       	% 边界处理
        Flag4ub = Positions(i, :) > ub;
        Flag4lb = Positions(i, :) < lb;
        Positions(i, :) = (Positions(i, :).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;             
        % 按行升序排列产生城市序列
        [~, sol] = sort(Positions, 2);      
        
        % 计算目标函数值(即路径距离)
        fitness = Fun(sol(i, :));
        Length_ave(l) = Length_ave(l)+fitness;
        % 更新Alpha, Beta, and Delta
        if fitness < Alpha_score 
            Alpha_score = fitness; 
            Alpha_pos = Positions(i, :);
        end
        
        if fitness > Alpha_score && fitness < Beta_score 
            Beta_score = fitness; 
            Beta_pos = Positions(i, :);
        end
        
        if fitness > Alpha_score && fitness > Beta_score && fitness < Delta_score 
            Delta_score = fitness; 
            Delta_pos = Positions(i, :);
        end
    end
    
    
    a = 2-l*((2)/Max_iter); % a从2线性减到0
    
    % 更新所有个体位置
    for i = 1:N
        for j = 1:dim 
                       
            r1 = rand(); % r1 is a random number in [0,1]
            r2 = rand(); % r2 is a random number in [0,1]
            
            A1 = 2*a*r1-a;        % Equation (3.3)
            C1 = 2*r2;              % Equation (3.4)
            
            D_alpha = abs(C1*Alpha_pos(j)-Positions(i, j)); % Equation (3.5)-part 1
            X1 = Alpha_pos(j)-A1*D_alpha; % Equation (3.6)-part 1
                       
            r1 = rand();
            r2 = rand();
            
            A2 = 2*a*r1-a;    % Equation (3.3)
            C2 = 2*r2;          % Equation (3.4)
            
            D_beta = abs(C2*Beta_pos(j)-Positions(i, j));   % Equation (3.5)-part 2
            X2 = Beta_pos(j)-A2*D_beta;                        % Equation (3.6)-part 2       
            
            r1 = rand();
            r2 = rand(); 
            
            A3 = 2*a*r1-a;      % Equation (3.3)
            C3 = 2*r2;             % Equation (3.4)
            
            D_delta = abs(C3*Delta_pos(j)-Positions(i, j));      % Equation (3.5)-part 3
            X3 = Delta_pos(j)-A3*D_delta;                            % Equation (3.5)-part 3             
            
    
    l = l + 1;
    
    [~, BestSol] = sort(Alpha_pos);
    figure(2);
    PlotSolution(BestSol, model, Alpha_score);
    pause(0.01); 
end

%% 进化曲线
figure(3);
function model = CreateModel(FileName)
% 加载文件数据
data = load(FileName);
% 获取城市坐标矩阵
cityCoor = [data(:, 2) data(:, 3)];        
% 城市序号
id = data(:, 1);
% 横坐标
x = cityCoor(:, 1);
% 纵坐标
y = cityCoor(:, 2);
% 城市个数
n = numel(x);
%% 计算两两城市间距离
d = zeros(n, n);
for i = 1:n-1
    for j = i+1:n
        d(i, j) = sqrt((x(i)-x(j))^2+(y(i)-y(j))^2);
        d(j, i) = d(i, j);
    end
end
%% 保存
model.id = id;
model.n = n;
model.x = x;
model.y = y;
model.d = d;
end
%% 画图函数
function PlotSolution(sol, model, Shortest_Length)   
    tour = sol;
    tour = [tour tour(1)];
    % 画路径轨迹图
    plot(model.x(tour), model.y(tour), 'k-o', ...
        'MarkerSize', 8,...
        'MarkerFaceColor', 'r',...
        'LineWidth', 1.5);
    xlabel('x'); ylabel('y');
    axis equal; grid on;
    % 标记城市序号
    for i = 1:size(sol, 2)
        text(model.x(sol(i)), model.y(sol(i)),['   ' num2str(model.id(sol(i)))]);
    end
    text(model.x(sol(1)), model.y(sol(1)),'       起点');
    text(model.x(sol(end)), model.y(sol(end)),'       终点');
    title(['基于灰狼优化算法优化TSP路径(最短距离:' num2str(Shortest_Length) ')'])
end

四、运行结果

在这里插入图片描述
在这里插入图片描述

五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

这篇关于【TSP】基于matlab灰狼算法求解旅行商问题【含Matlab源码 1327期】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!