【GA MTSP】遗传算法求解多旅行商问题(同起点不同终点)【含Matlab源码 1325期】

在这里插入图片描述

⛄一、获取代码方式

获取代码方式1:
完整代码已上传我的资源:【MTSP】基于matlab遗传算法求解多旅行商问题【含Matlab源码 1325期】

获取代码方式2:
付费专栏Matlab路径规划(初级版)

备注:
点击上面蓝色字体付费专栏Matlab路径规划(初级版),扫描上面二维码,付费29.9元订阅海神之光博客付费专栏Matlab路径规划(初级版),凭支付凭证,私信博主,可免费获得1份本博客上传CSDN资源代码(有效期为订阅日起,三天内有效);
点击CSDN资源下载链接:1份本博客上传CSDN资源代码

⛄二、TSP简介

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

⛄三、遗传算法简介

1 引言
在这里插入图片描述
在这里插入图片描述
2 遗传算法理论
2.1 遗传算法的生物学基础
在这里插入图片描述
在这里插入图片描述
2.2 遗传算法的理论基础
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.3 遗传算法的基本概念
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.4 标准的遗传算法
在这里插入图片描述
在这里插入图片描述
2.5 遗传算法的特点
在这里插入图片描述
在这里插入图片描述
2.6 遗传算法的改进方向
在这里插入图片描述
3 遗传算法流程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4 关键参数说明
在这里插入图片描述

⛄四、案例及部分源代码

1 案例
35个城市,5个旅行商。找到最小路径。

2 部分源代码

n = 35; %设置城市个数
xy = 10*rand(n,2); %随机产生城市的坐标,实际应用中可以自己输入坐标。主要用以画图,真正起作用的是距离矩阵啦。
salesmen = 5; %设置旅行商的人数
min_tour = 3; %设置每个旅行商至少走过三个城市(除去起始点和终止点的话就是一个城市)
pop_size = 80; %设置种群的个数,必须是8的倍数,因为代码中以 8 做为步骤 2 的分组个数
num_iter = 5e3; %设置迭代总次数, i.e. 5000次
a = meshgrid(1:n); %用以计算距离矩阵。
dmat = reshape(sqrt(sum((xy(a,:)-xy(a’😅).^2,2)),n,n); %计算距离矩阵(欧式距离),可以自己输入。
[opt_rte,opt_brk,min_dist] = mtspof_ga(xy,dmat,salesmen,min_tour, …
pop_size,num_iter,1,1); %运行代码
function varargout = mtspofs_ga(xy,dmat,salesmen,min_tour,pop_size,num_iter,show_prog,show_res)
% MTSPOFS_GA Fixed Start Open Multiple Traveling Salesmen Problem (M-TSP) Genetic Algorithm (GA)
% Finds a (near) optimal solution to a variation of the “open” M-TSP by
% setting up a GA to search for the shortest route (least distance needed
% for each salesman to travel from the start location to unique individual
% cities without returning to the starting location)
%
% Summary:
% 1. Each salesman starts at the first point, but travels to a unique
% set of cities after that (and none of them close their loops by
% returning to their starting points)
% 2. Except for the first, each city is visited by exactly one salesman
%
% Note: The Fixed Start is taken to be the first XY point
%
% Input:
% xy (float):城市坐标,可以 2 维或者 3 维。
% dmat (float) 距离矩阵 N X N 维
% salesman (scalar integer) 旅行商个数。
% min_tour (scalar integer) 不包含起始点,每个旅行商最少应该 travel 的数量。
% pop_size (scalar integer) 遗传算法中个体的数量。
% num_iter (scalar integer) 算法一共迭代的次数
% show_prog (scalar logical) 如果等于1,就将迭代过程画出来
% show_res (scalar logical) 如果等于1,就将算法最后的结果展示出来
%
% Output:
% opt_rte (integer array) 输出最优个体的路径基因型
% opt_brk (integer array) 输出最优个体的中断点基因型
% min_dist (scalar float) 最有个体代表的所有旅行商的距离之和。
%
%
% Author: Joseph Kirk
% Email: jdkirk630@gmail.com
% Release: 1.3
% Release Date: 6/2/09
% commenter: zhuo

%检测输入参数,如果某些参数没有输入,那么改段代码就自动帮你加了。
nargs = 8;
for k = nargin:nargs-1
switch k
case 0
xy = 10*rand(40,2); % 设置城市坐标的默认值为 40 个,随机产生 2 维坐标
case 1
N = size(xy,1); %设置城市数目 N = size(xy,1)
a = meshgrid(1:N);
dmat = reshape(sqrt(sum((xy(a,:)-xy(a’😅).^2,2)),N,N); %产生相应的距离矩阵。
case 2
salesmen = 5; %旅行商个数的默认值为 5 个。
case 3
min_tour = 2; %默认每个旅行商至少走 2 个城市
case 4
pop_size = 80;
case 5
num_iter = 5e3;
case 6
show_prog = 1;
case 7
show_res = 1;
otherwise
end
end

%验证输入是否可行,验证原理为城市个数 N 是否和 距离矩阵的 size相等
[N,dims] = size(xy);
[nr,nc] = size(dmat);
if N ~= nr || N ~= nc
error(‘Invalid XY or DMAT inputs!’)
end
n = N - 1; % 除去了起始点

% Sanity Checks 还是验证输入:可以不看
salesmen = max(1,min(n,round(real(salesmen(1)))));
%验证输入的旅行商个数是不是大于1,并且是整数,否则帮你四舍五入改了
min_tour = max(1,min(floor(n/salesmen),round(real(min_tour(1)))));
%验证输入的minTour是不是大于1,并且是整数,否则帮你四舍五入改了
pop_size = max(8,8*ceil(pop_size(1)/8));
%验证输入的个体数是否为8的整数(因为后面的分组8个为一组),否则帮你用ceil函数改了
num_iter = max(1,round(real(num_iter(1))));
%验证输入的迭代次数是否大于1,否则帮改了
show_prog = logical(show_prog(1));
%验证是否为1或0,不然帮你改了,下同。
show_res = logical(show_res(1));

num_brks = salesmen-1; % 设置中断点的个数,下面可以不看。
dof = n - min_tour*salesmen;
addto = ones(1,dof+1);
for k = 2:num_brks
addto = cumsum(addto);
end
cum_prob = cumsum(addto)/sum(addto);

% Initialize the Populations
pop_rte = zeros(pop_size,n); % 所有个体的路径基因型
pop_brk = zeros(pop_size,num_brks); % 所有个体的中断点基因型
for k = 1:pop_size
pop_rte(k,:) = randperm(n)+1; %初始化所有个体的路径基因型。
%这里为什么加 1 呢?因为我们 n=N-1=34 ,因此产生的路径基因型必须在[2,35]中产生。
pop_brk(k,:) = randbreaks(); %产生中断点,函数代码在下方(子函数)
end

% 选择画图时的颜色(不同旅行商的路径画在图上要用不同颜色呀)
clr = [1 0 0; 0 0 1; 0.67 0 1; 0 1 0; 1 0.5 0];
if salesmen > 5
clr = hsv(salesmen);
end

% Run the GA
global_min = Inf;
total_dist = zeros(1,pop_size); %每个个体的总距离构成的 1X80 维的向量
dist_history = zeros(1,num_iter); %每一次迭代个数中最优个体的总距离构成的 1X5000 维的向量。
tmp_pop_rte = zeros(8,n); %暂时变量,用完就丢。用于产生新个体的,(路径的基因型)
tmp_pop_brk = zeros(8,num_brks); %同上,用于产生新的中断点的基因型
new_pop_rte = zeros(pop_size,n); %新生代的路径基因型,为一个 80X34 的矩阵,每一行代表每一个个体。
new_pop_brk = zeros(pop_size,num_brks); %同上,用于中断点基因型 80X4 的矩阵。
if show_prog
pfig = figure(‘Name’,‘MTSPOFS_GA | Current Best Solution’,‘Numbertitle’,‘off’);
end
for iter = 1:num_iter %计算一次迭代过程中,每一个个体的总距离
for p = 1:pop_size
d = 0;
p_rte = pop_rte(p,:);
p_brk = pop_brk(p,:);
rng = [[1 p_brk+1];[p_brk n]]';
for s = 1:salesmen
d = d + dmat(1,p_rte(rng(s,1))); % 加上起点到第二个城市的距离

        %计算路径中城市的总距离:
        for k = rng(s,1):rng(s,2)-1
            d = d + dmat(p_rte(k),p_rte(k+1));
        end
    end
    total_dist(p) = d;  %将每一个个体的距离存入到矩阵中。
end

⛄五、运行结果

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

⛄六、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]程荣.遗传算法求解旅行商问题[J].科技风. 2017,(16)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
旅行问题(Multi Traveling Salesman Problem,MTSP)是旅行问题(Traveling Salesman Problem, TSP)的扩展。在MTSP中,有多个旅行,每个旅行需要访问一组给定的城市,并且每个城市只能被访问一次。现在需要利用灰狼算法(Grey Wolf Optimizer, GWO)来解决MTSP问题。 首先,需要基于matlab编写一个灰狼算法求解函数。该函数包括灰狼的初始化、目标函数的计算、灰狼的适应度更新、灰狼位置的更新等步骤。 然后,需要进行MTSP问题的建模。将每个旅行的路径表示为一个解向量,其中每个元素表示访问的城市顺序。通过将每个旅行的路径连接起来,构成一个整体的解。 接下来,利用灰狼算法求解MTSP问题。初始化一群灰狼,并随机生成它们的初始位置。根据目标函数的值来计算灰狼的适应度,选择适应度最高的灰狼作为全局最优解。 然后,通过更新灰狼的位置,利用优化策略逐步优化解。其中包括利用alpha、beta和delta等参数来调整灰狼的位置。经过多次迭代,得到最优解。 最后,将最优解解码为每个旅行的路径,即为MTSP问题的解。将结果输出并进行评估。 综上所述,基于matlab的灰狼算法可以用来求解旅行问题。通过灰狼算法的迭代优化策略,可以得到近似最优解。这种方法具有较高的搜索能力和全局优化能力,在实际应用中具有一定的实用性和效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Matlab领域

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

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

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

打赏作者

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

抵扣说明:

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

余额充值