遗传算法解决TSP问题MATLAB实现(详细)

2023-05-16

问题定义:巡回旅行商问题
给定一组n个城市和俩俩之间的直达距离,寻找一条闭合的旅程,使得每个城市刚好经过一次且总的旅行距离最短。
TSP问题也称为货郎担问题,是一个古老的问题。最早可以追溯到1759年Euler提出的骑士旅行的问题。1948年,由美国兰德公司推动,TSP成为近代组合优化领域的典型难题。
TSP是一个具有广泛的应用背景和重要理论价值的组合优化问题。 近年来,有很多解决该问题的较为有效的算法不断被推出,例如Hopfield神经网络方法,模拟退火方法以及遗传算法方法等。
TSP搜索空间随着城市数n的增加而增大,所有的旅程路线组合数为(n-1)!/2。在如此庞大的搜索空间中寻求最优解,对于常规方法和现有的计算工具而言,存在着诸多计算困难。借助遗传算法的搜索能力解决TSP问题,是很自然的想法。
基本遗传算法可定义为一个8元组:
(SGA)=(C,E,P0,M,Φ,Г,Ψ,Τ)
C ——个体的编码方法,SGA使用固定长度二进制符号串编码方法;
E ——个体的适应度评价函数;
P0——初始群体;
M ——群体大小,一般取20—100;
Ф——选择算子,SGA使用比例算子;
Г——交叉算子,SGA使用单点交叉算子;
Ψ——变异算子,SGA使用基本位变异算子;
Т——算法终止条件,一般终止进化代数为100—500;
问题的表示
对于一个实际的待优化问题,首先需要将其表示为适合于遗传算法操作的形式。用遗传算法解决TSP,一个旅程很自然的表示为n个城市的排列,但基于二进制编码的交叉和变异操作不能适用。
路径表示是表示旅程对应的基因编码的最自然,最简单的表示方法。它在编码,解码,存储过程中相对容易理解和实现。例如:旅程(5-1-7-8-9-4-6-2-3)可以直接表示为(5 1 7 8 9 4 6 2 3)
产生初始种群
一是完全随机产生,它适合于对问题的解无任何先验知识的情况。随机性较强,因而也较公正
二是某些先验知识可转变为必须满足的一组要求,然后在满足这些要求的解中在随机地选取样本。这样选择初始种群可使遗传算法更快的达到最优解。种群有一定的目标性和代表性,但取例不如完全随机的广泛,而且先验知识是否可靠也是一个问题
适应度函数
遗传算法在进化搜索中基本不利用外部信息,仅以适应度函数为依据,利用种群中每个个体的适应度值来进行搜索。TSP的目标是路径总长度为最短,路径总长度的倒数就可以为TSP的适应度函数:
在这里插入图片描述

选择
一般地说,选择将使适应度较大(优良)个体有较大的存在机会,而适应度较小(低劣)的个体继续存在的机会也较小。简单遗传算法采用赌轮选择机制,令Σfi表示群体的适应度值之总和,fi表示种群中第i个染色体的适应度值,它产生后代的能力正好为其适应度值所占份额fi/Σfi。
交叉
基于路径表示的编码方法,要求一个个体的染色体编码中不允许有重复的基因码,也就是说要满足任意一个城市必须而且只能访问一次的约束。基本遗传算法的交叉操作生成的个体一般不能满足这一约束条件。
部分匹配交叉操作要求随机选取两个交叉点,以便确定一个匹配段,根据两个父个体中两个交叉点之间的中间段给出的映射关系生成两个子个体。
在这里插入图片描述
变异
遗传算法解决TSP 问题基于二进值编码的变异操作不能适用,不能够由简单的变量的翻转来实现
在TSP问题中个体的编码是一批城市的序列,随机的在这个序列抽取两个城市,然后交换他们的位置。这样就实现了个体编码的变异,算法如下:
产生两个0到1之间的随机实数;
将这两个随机实数转化为0到n(城市数)-1之间的随机整数;
将这两个随机整数指代的城市进行交换;
流程图
在这里插入图片描述
代码
完整代码参考我的网站:http://www.omegaxyz.com/2019/01/21/matlab-tsp-all/

主函数代码:

clear;
clc;
tStart = tic; % 算法计时器
%%%%%%%%%%%%自定义参数%%%%%%%%%%%%%
[cityNum,cities] = Read('dsj1000.tsp');
cities = cities';
%cityNum = 100;
maxGEN = 1000;
popSize = 100; % 遗传算法种群大小
crossoverProbabilty = 0.9; %交叉概率
mutationProbabilty = 0.1; %变异概率
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
gbest = Inf;
% 随机生成城市位置
%cities = rand(2,cityNum) * 100;%100是最远距离
% 计算上述生成的城市距离
distances = calculateDistance(cities);
% 生成种群,每个个体代表一个路径
pop = zeros(popSize, cityNum);
for i=1:popSize
pop(i,:) = randperm(cityNum); 
end
offspring = zeros(popSize,cityNum);
%保存每代的最小路劲便于画图
minPathes = zeros(maxGEN,1);
% GA算法
for  gen=1:maxGEN
% 计算适应度的值,即路径总距离
[fval, sumDistance, minPath, maxPath] = fitness(distances, pop);
% 轮盘赌选择
tournamentSize=4; %设置大小
for k=1:popSize
% 选择父代进行交叉
tourPopDistances=zeros( tournamentSize,1);
for i=1:tournamentSize
randomRow = randi(popSize);
tourPopDistances(i,1) = sumDistance(randomRow,1);
end
% 选择最好的,即距离最小的
parent1  = min(tourPopDistances);
[parent1X,parent1Y] = find(sumDistance==parent1,1, 'first');
parent1Path = pop(parent1X(1,1),:);
for i=1:tournamentSize
randomRow = randi(popSize);
tourPopDistances(i,1) = sumDistance(randomRow,1);
end
parent2  = min(tourPopDistances);
[parent2X,parent2Y] = find(sumDistance==parent2,1, 'first');
parent2Path = pop(parent2X(1,1),:);
subPath = crossover(parent1Path, parent2Path, crossoverProbabilty);%交叉
subPath = mutate(subPath, mutationProbabilty);%变异
offspring(k,:) = subPath(1,:);
minPathes(gen,1) = minPath; 
end
fprintf('代数:%d   最短路径:%.2fKM \n', gen,minPath);
% 更新
pop = offspring;
% 画出当前状态下的最短路径
if minPath < gbest
gbest = minPath;
paint(cities, pop, gbest, sumDistance,gen);
end
end
figure 
plot(minPathes, 'MarkerFaceColor', 'red','LineWidth',1);
title('收敛曲线图(每一代的最短路径)');
set(gca,'ytick',500:100:5000); 
ylabel('路径长度');
xlabel('迭代次数');
grid on
tEnd = toc(tStart);
fprintf('时间:%d 分  %f 秒.\n', floor(tEnd/60), rem(tEnd,60));

完整代码参考我的网站:http://www.omegaxyz.com/2019/01/21/matlab-tsp-all/

结果

测试数据:
在这里插入图片描述
初始状态:
在这里插入图片描述
最终状态:
在这里插入图片描述

收敛曲线图:
在这里插入图片描述
总结与观点

难点是交叉算法的设计,由于TSP问题和一般的NP问题不一样,每个个体的每个维度具有唯一性,因此在交叉的时候要注意不能有重复的值。本次实验采用的是部分匹配交叉,先从第一个父代选出一个偏移量,从偏移量后的部分点加入到子代,接下来从第二个父代选择第一代没有选择的部分点移到子代中。
当城市数量较多时,大于50个城市,迭代多次,GA仍然不收敛,可能的问题是陷入了局部最优解,因此对GA算法进行改进怡跳出局部最优解,可以采用类似于PSO或者蚁群算法的思想。

更多内容访问 omegaxyz.com
网站所有代码采用Apache 2.0授权
网站文章采用知识共享许可协议BY-NC-SA4.0授权
© 2020 • OmegaXYZ-版权所有 转载请注明出处

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

遗传算法解决TSP问题MATLAB实现(详细) 的相关文章

  • 在 MATLAB 中绘制圆

    我被要求找到在 MATLAB 中绘制圆的不同方法 看起来很无聊 不过我可以想出一些想法 有些可能效率低下 Method 1 ezpolar x 1 Method 2 t linspace 0 2 pi 100 plot sin t cos
  • MATLAB:解包函数

    我正在与 Mathworks 的某人讨论 unwrap http www mathworks com access helpdesk help techdoc ref unwrap html函数中对于 以外的跳跃容差有一个 bug 并且希望
  • 如何从 Matlab 在 vi​​rtualenv 中执行 Python 代码

    我正在创建一个用于研究的 Matlab 工具箱 我需要执行 Matlab 代码 但也需要执行 Python 代码 我想允许用户从 Matlab 执行 Python 代码 问题是 如果我立即执行此操作 我将必须在 Python 环境中安装所有
  • 在Matlab中使用中心切片定理实现滤波反投影算法

    我正在研究一种使用中心切片定理的滤波反投影算法作为家庭作业 虽然我理解纸上的理论 但在 Matlab 中实现它时遇到了问题 我得到了一个可以遵循的框架 但我认为我可能误解了一个步骤 这是我所拥有的 function img sampleFB
  • 如何将向量标准化/非标准化到范围 [-1;1]

    我怎么能够正常化到范围的向量 1 1 我想使用函数norm 因为它会更快 也让我知道我该怎么做非规范化之后的向量正常化 norm对向量进行归一化 使其平方和为 1 如果要对向量进行归一化 使其所有元素都在 0 和 1 之间 则需要使用最小值
  • 正确重载 stringbuf 以替换 MATLAB mex 文件中的 cout

    MathWorks 目前不允许您使用cout当 MATLAB 桌面打开时 从 mex 文件中读取 因为它们已重定向 stdout 他们当前的解决方法是提供一个函数 mexPrintf 他们要求你改用 http www mathworks c
  • MATLAB:生成给定三种颜色的颜色图

    我正在尝试在 MATLAB 中生成给定三种颜色 最高值 零值和最低值 的颜色图 我的思维过程是从最高端到中间循环 并将每个步骤存储到一个 3xN 第一列是 R 第二列是 G 第三列是 B 矩阵 所以我正在使用 fade from high
  • 带 if 语句的可向量化 FIND 函数 MATLAB

    我有一个矩阵u 我想遍历所有行和所有列并执行以下操作 如果元素非零 我返回行索引的值 如果元素为零 则查找该元素之后的下一个非零元素的行索引 我可以使用两个带有 find 函数的 for 循环轻松完成此操作 但我需要多次执行此操作 不是因为
  • Matlab 中 interp2 的类似 OpenCV Api

    有没有类似的功能 其工作原理与 interp2 x y frame z xd yd linear 0 在 OpenCV 中 功能cv remap 几乎可以满足您的要求 请参阅文档here http docs opencv org modul
  • 是否有一个函数可以将两个元胞数组“压缩”在一起? [复制]

    这个问题在这里已经有答案了 假设我有一个元胞数组A and B as so A A B C D B 1 2 3 4 我想创建元胞数组C通过将 A 和 B 压缩 在一起 如下所示 C zip A B C A 1 B 2 C 3 D 4 这样的
  • 如何检测图像中对象的实例?

    我有一张包含几个特定对象的图像 我想检测这些物体在该图像中的位置 为此 我有一些模型图像 其中包含我想要检测的对象 这些图像在我想要检测的对象实例周围得到了很好的裁剪 这是一个例子 在这张大图里 我想检测此模型图像中表示的对象 自从你最初发
  • 图像增强 - 从书写中清除给定图像

    我需要清理这张照片 删除 清理我 的字样并使其变亮 作为图像处理课程作业的一部分 我可能会使用 matlab 函数 ginput 来查找图像中的特定点 当然 在脚本中您应该对所需的坐标进行硬编码 您可以使用 conv2 fft2 ifft2
  • 如何选择部分密集数据集的均匀分布子集?

    P是一个 n d 矩阵 持有nd 维样本 P某些地区的密度是其他地区的几倍 我想选择一个子集P其中任意样本对之间的距离大于d0 并且我需要将其传播到整个区域 所有样本都具有相同的优先级 无需优化任何内容 例如覆盖面积或成对距离之和 这是执行
  • 使用 java 执行 Matlab 函数

    我正在编写一个应用程序 它使用 matlab 进行图像处理 然后使用 Java 接口显示结果 由于某些原因 我必须同时使用 Java 和 Matlab 如何在java中使用matlab函数 如何创建和访问界面 MATLAB控制 http m
  • Matlab 编辑器不使用 emacs 快捷方式

    Is there some way I can make the matlab integrated editor not use emacs shortcut but use more normal shortcuts such that
  • 如何获取活动对象 MATLAB GUI 的句柄

    我正在尝试使用 MATLAB GUI 创建日历 我有两个Edit Text对象 edittext1 and edittext2 我想做这个 我把光标放在edittext1然后在日历中选择日期 它会进入文本字段edittext1 同样对于ed
  • 将组合字符串和数字输入的元胞数组写入文本文件

    考虑以下 DateTime 2007 01 01 00 00 2007 02 01 00 00 2007 03 01 00 00 Headers Datetime Data Dat 100 200 300 Data DateTime num
  • 是否有一个函数可以检查矩阵是否对角占优(行占优)

    矩阵是对角占优 http en wikipedia org wiki Diagonally dominant matrix 按行 如果对角线处的值在绝对意义上大于该行中所有其他绝对值的总和 对于列也是如此 只是相反 matlab中有没有函数
  • python 正弦和余弦精度

    如何提高Python正弦和余弦精度 例如 我想使用以下代码 只需计算随机复向量 x 的 y cos acos x import numpy as np N 100000 x np zeros N 1j np zeros N for k in
  • MATLAB 图中轴标签与轴之间的距离

    我正在使用 MATLAB 绘制一些数据 我想调整轴标签与轴本身之间的距离 但是 只需向标签的 位置 属性添加一点即可使标签移出图窗窗口 是否有 保证金 属性或类似的东西 在上图中 我想增加数字和标签 Time s 之间的距离 同时自动扩展数

随机推荐

  • 基于拥挤距离与变异支配的多目标PSO算法

    这一篇是Xue Bing在一区cybernetics发的论文 xff0c 里面提出了两个多目标PSO特征选择算法 xff0c 一个是NSPSO另一个是CMDPSO 其中NSPSO是参考了NSGA2的框架和思想 下面具体说说CMDPSO CM
  • Cohen-Sutherland算法概述

    思想 通过对于任一端点 x y xff0c 根据其坐标所在的区域 xff0c 赋予一个4位的二进制码 xff0c 判断图形元素是否落在裁剪窗口之内并通过求交运算找出其位于内部的部分 编码方式 注意 xff1a l为left xff0c r为
  • 人机交互的形式

    命令行交互 优点 xff1a 专家用户使用命令行能够更加快速地完成任务 较图形界面更加节约系统资源 对用户而言是开放的 xff0c 不存在图形界面中不能动态配置用户可操作选项的问题 键盘操作方式较鼠标操作更加精确 xff0c 对应用的掌控力
  • canvas 报错记录 (一)

    在执行下面代码的时候报错 var can 61 document getElementById 34 can 34 var ctx 61 can getContext ctx content cfillRect 500 500 200 20
  • 进化计算中基于分类的预处理代理模型

    问题提出 代理模型的构造较复杂 xff0c 作者希望构造一个更为简单的廉价 xff08 cheap xff09 的代理模型来评估子集的质量 因此作者提出了一个叫做CPS xff08 classification based preselec
  • Python利用Graphviz画图

    Graphviz的是AT amp T Labs Research开发的图形绘制工具软件 Graphviz的是AT amp T Labs Research开发的图形绘制工具 他可以很方便的用来绘制结构化的图形网络 支持多种格式输出 生成图片的
  • Java-Web项目总结

    使用jetbrain的idea创建Java Web项目 链接地址 xff1a http www omegaxyz com 2018 10 04 intellij idea java web Java MVC模式概述 链接地址 xff1a h
  • 基于WMD(词移距离)的句子相似度分析简介

    word2vec word2vec是只有一个隐层的全连接神经网络 对语料中的所有词汇进行训练并生成相应的词向量 xff08 Word Embedding xff09 WI 的大小是VxN V是单词字典的大小 每次输入是一个单词 N是设定的隐
  • Android 使用字符串动态获取资源ID

    android文件中每个文件都有一个ID xff0c 如下图所示 xff0c 左边的0x7f060000即是文件的ID xff1a 如果我们想在代码中获取这个文件的ID应该使用高效率的反射机制 xff0c 可以新建一个Java类代码如下 x
  • wxpython画表格代码

    wxPython是Python语言的一套优秀的GUI图形库 允许Python程序员很方便的创建完整的 功能键全的GUI用户界面 wxPython是作为优秀的跨平台GUI库wxWidgets的Python封装和Python模块的方式提供给用户
  • 数据库c3p0配置SQL Server与MySQL

    C3P0是一个开源的JDBC连接池 xff0c 它实现了数据源和JNDI绑定 xff0c 支持JDBC3规范和JDBC2的标准扩展 目前使用它的开源项目有Hibernate xff0c Spring等 SQL Server配置 xff1a
  • JSP连数据库登录检查用户名和密码模板

    JSP全名为Java Server Pages xff0c 中文名叫java服务器页面 xff0c 其根本是一个简化的Servlet设计 xff0c 它是由Sun Microsystems公司倡导 许多公司参与一起建立的一种动态网页技术标准
  • 基于移动设备与CNN的眼动追踪技术简介

    眼动追踪是一项科学应用技术 xff0c 用户无需与交互设备物理接触即可发送信息与接收反馈 从原理上看 xff0c 眼动追踪主要是研究眼球运动信息的获取 建模和模拟 xff0c 用途颇广 而获取眼球运动信息的设备除了红外设备之外 xff0c
  • 递归下降实现LL(1)文法分析C语言与Python实现

    对文法G的句子进行确定的自顶向下语法分析的充分必要条件是 xff0c G的任意两个具有相同左部的产生式A gt 满足下列条件 xff1a xff08 1 xff09 如果 均不能推导出 xff0c 则 FIRST FIRST 61 xff0
  • Ubuntu下gcc的安装

    sudo apt get build dep gcc
  • PyTorch入门

    PyTorch入门 PyTorch 是一个建立在 Torch 库之上的 Python 包 xff0c 旨在加速深度学习应用 PyTorch 提供一种类似 NumPy 的抽象方法来表征张量 xff08 或多维数组 xff09 xff0c 它可
  • 华氏451

    2015年12月21日 xff0c 因特网工程指导组 IETF 批准了全新HTTP状态错误代码 451 xff0c 这个代码的官方释义为 由于法律原因而不可用 451 数字来源于 1953 年由美国作家雷 布莱伯利所著的反乌托邦小说 华氏
  • 蚁群算法最短路径规划多出口情况及问题答疑

    最近好多人问我蚁群算法最短路径规划如何设置多出口情况 xff0c 原来2019年美赛D题 拯救卢浮宫 需要用到 本人没有看过美赛的题目 xff0c 下面给出一些不成熟的代码 蚁群算法简介 xff1a 蚁群算法最早是由Marco Dorigo
  • 反世代距离评价指标IGD

    反世代距离评价指标 Inverted Generational Distance IGD 是一个综合性能评价指标 它主要通过计算每个在真实 Pareto前沿面上的点 个体 到算法获取的个体集合之间的最小距离和 xff0c 来评价算法的收敛性
  • 遗传算法解决TSP问题MATLAB实现(详细)

    问题定义 xff1a 巡回旅行商问题 给定一组n个城市和俩俩之间的直达距离 xff0c 寻找一条闭合的旅程 xff0c 使得每个城市刚好经过一次且总的旅行距离最短 TSP问题也称为货郎担问题 xff0c 是一个古老的问题 最早可以追溯到17