当前位置: 首页 > news >正文

旅行推销员问题的遗传算法中的完整子路线顺序交叉

摘要

旅行商问题(TSP)是许多著名的组合问题之一。TSP可以解释为很难找到从第一个城市出发,经过所有城市,然后返回起点的最短距离。在标准问题中,TSP通常用于确定新算法的效率。遗传算法是求解TSP问题的一种成功算法。遗传算法求解效率的关键机制是交叉算子。许多研究提出了新的交叉甚至改进的解决TSP的方法,包括其他相关问题。然而,solution quality是最重要的因素。本文提出了遗传算法的完全子图阶交叉(CSOX)来搜索TSP的解。CSOX采用订单交叉Order crossover(OX)原理,并将交叉扩展到主要涵盖质量解决方案的部分。值得注意的是,一个操作可以生成六个新的解决方案。这一结果增加了问题解决方案的多样性和质量,同时降低了计算时间。从三项研究中,将五种类型的交叉算子与CSOX进行了比较。实验总结结果表明,CSOX在解决方案质量和良好的计算时间方面优于所有方案。

引言

旅行商问题(TSP)是一个常见的组合优化问题,属于NP难问题。TSP问题旨在寻找前往不同城市的最短路径。这个问题的局限性在于每个城市只能访问一次。此外,一旦访问了所有城市,销售人员必须返回出发城市。TSP经常被应用于新算法的性能评估。

遗传算法(GA)是一种受生物启发的进化算法,可以很好地解决TSP问题。遗传算法通过模仿物种的进化和自然选择的思想来工作。因此,例如,身体状况良好的生物更有可能存活下来,并将这些良好的特征传递给下一代[1]。尽管遗传算法已经提出了很长时间,但最近许多研究中开发的新算法都是在遗传算法概念之后原型化的。此外,许多研究已经应用了遗传算法原理,并将其与其他算法相结合来解决一些问题[2]。遗传算法的运作始于以染色体形式表达的群体的一代。每个染色体或个体都包含基因,代表着问题可能解决方案的一个特征。然后,遗传算法评估基因适应度,选择并相应地提高解决方案的质量。

交叉算子是解决方案改进过程中的一个重要机制。交叉通常由两个个体或两个选定的父母的组合产生。重组在父母之间进行信息交换。因此,获得的后代将具有其父母的特征。根据组合技术的不同,每个后代都会有所不同。

保持种群多样性是交叉设计的挑战之一,因为它可以防止过早收敛或陷入局部最优。此外,多样性通常会增加搜索新解决方案空间的可能性,并带来更好的解决方案质量。然而,更高的多样性是浪费时间。因此,交叉算子应该给出适当的分集,以有效地解决过早收敛问题[3]。

目前,GA有许多交叉算子。请注意,部分映射交叉(PMX)和顺序交叉(OX)是各种研究中经常发现的两种算子,用于比较和提高算法性能。PMX是使用最广泛的基于置换的交叉算子。在PMX中,第一个亲本的基因被映射到第二个亲本的遗传基因上,剩下的信息被交换。相比之下,OX通过选择第一个亲本的基因并维持第二个亲本基因的相对顺序来产生后代。尽管一些研究人员指出,PMX比OX表现出更好的解决方案搜索,但它需要更多的计算时间[4][5]。

最佳顺序交叉(BOX)是另一种将双亲和全局最佳个体之间的信息相结合的技术。该技术优于许多现有的置换交叉方案[6]。

改进(IPMX)是对PMX技术的重新设计,以减少计算时间而不影响解决方案质量。IPMX、PMX和另外两种方法进行了并行评估。最佳解决方案来自IPMX[7]。

同时,另一个选择了两个以上父母来增加多样性的运营商被称为多父母交叉。样本是多父部分映射交叉(MPPMX)和多父顺序交叉(MPOX)

因此,本研究提出了一种新的交叉算子,利用双亲产生六个后代,以按时保持种群的多样性。同时,来自父母的优秀信息将被选择传递给后代。

二、GA代表TSP

本节描述了用于解决TSP问题的遗传算法。本文对遗传算法的每一个过程进行了推广。A.染色体代表一个数字代表每个城市的名字。访问每个城市的路线或顺序是TSP的染色体编码。当一个销售人员访问所有城市时,他必须返回出发城市。路线示例1→2.→3.→4.→1可以用(1,2,3,4)表示,如图1所示。

 B、 遗传算法过程在本文中,可以通过以下步骤定义一个简单的遗传算法。详情如下。第一步,创建一个由n条染色体组成的初始群体。第二步,评估每个染色体的适合度。步骤3,根据最佳适应度值选择n条染色体的群体。步骤4,使用交叉算子随机选择两个亲本来创建后代。步骤5,应用具有低随机概率的变异算子。第6步,将新的后代添加到种群中,然后进入第2步。最后,如果代数满足,则终止。步骤2中的适合度是所有城市之间旅行成本的总和。然而,TSP是一个最小化问题,因此适应度函数为F(x)=1/F(x),其中F(x)是目标函数。步骤4-5中使用的GA运算符将在第四节中讨论。

三、提出的交叉算子

本文针对TSP问题,提出了遗传算法中的完全子任务交叉(CSOX)。CSOX采用订单交叉(OX)原理,并扩展交叉位置以覆盖解决方案的适当组件。此外,还提出了保留基因序列和交换良好信息的建议。然而,CSOX在执行时间合适的情况下最多可以生成六个后代。CSOX程序在算法1中进行了描述。在图2中,OX的原理用于交换基因以产生后代。生成的子代的质量在GA工作周期的同时得到改善。通常,被选为首选旅行目的地的城市有可能提高解决方案的质量,因为这些城市通常位于起点和最后一个城市附近。

 

因此,将选择排名第一和最后的城市,以进一步传播给具有这一概念的后代。

四、实验和结果

在本节中,实验分为四个部分,以评估CSOX与TSP实例中其他交叉的效果。本研究采用了TSPLIB,这是一个著名的TSP实例库(可从http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/)。

实验1-3是与关于解决方案的其他文献相比的CSOX功效评估。 travel  costs函数衡量解决方案的质量,最优解决方案的 travel  costs最低。根据对比研究调整各实验的参数设置。此外,各文献中使用的TSP实例并不相等。只有在所有实例中发现相同的实例才会被选中。例如,eil51、st70,实例名称上的数字表示城市的数量。最后,实验4是与广泛已知的交叉相比的CSOX收敛性评估。所提出的算法用python编程语言实现,并在装有Windows 10操作系统、2.60 GHz Intel i7处理器和8 GB RAM的笔记本电脑上运行。

实验一:

本实验将CSOX的性能与BOX和OX[6]进行了比较。参数设置和比较结果分别如表I-II所示:

 

 从表II可以看出,CSOX在所有情况下都给出了比BOX和OX更好的最佳值、平均值。尽管BOX和OX没有显示最差值,但CSOX的最差值优于BOX和OX的最佳值。

B.实验2

本实验比较了CSOX与PMX和IPMX[7]在解决方案质量和计算时间方面的性能。参数设置和比较结果分别如表III-IV所示。

 

 在表IV中,PMX和IPMX在溶液质量方面表现出相似之处。然而,IPMX工作速度更快,而CSOX提供的解决方案质量比PMX和IPMX更好。在计算时间方面,CSOX比PMX消耗的时间更少,并且提供了更好的解决方案质量。

C.实验3

本实验比较了CSOX与MPPMX和MPOX的性能。不幸的是,对上述发布的实验数据进行了检查。发现数据不准确,并且偏离了TSP实例的标准解,因此无法进行比较。因此,本实验将CSOX与MPPMX[8]进行了比较。参数设置和比较结果分别如表V-VI所示。

 这个实验使用了交换突变以及MMPMX。如表VI所示,基于参考数据,MPPMX疗效测试仅使用了五个实例。CSOX的突变率为0.03,在所有情况下都比MPPMX的结果更好。

D.实验4

最后的实验比较了CSOX、OX和PMX的收敛性。不幸的是,这个实验无法与以前实验中的算法进行比较,以防止结果出现错误。参数设置如下:种群规模=500,交叉率=1.0,突变率=0.0,运行次数=30。

 图3显示了解的收敛性,它对应于TSP实例的生成数量。同样,CSOX的收敛性能优于PMX和OX,包括解决方案质量。CSOX最多可产生六个后代,这对其他运营商来说是有利的,这是一种不公平的测试。因此,执行时间是该测试的度量标准。该实验定义了满足解决方案时的终止条件,以评估执行时间。

定义操作员遇到的终止条件,以评估执行时间。终止条件是三个运算符的最低平均解,即PMX。

 

从图4中可以看出,对于eil51、st70、pr76和lin105,CSOX和OX的执行时间相似。相比之下,d198和lin318的OX执行时间更短。PMX在所有实例中具有最多的执行时间。

V.结论

CSOX是一种基于遗传算法的新阶交叉算子,用于求解TSP问题。就解决方案质量而言,CSOX可以比其他交叉运营商产生更好的结果。最重要的是,在任何实验中都没有使用突变算子。尽管CSOX最多能产生六个后代,但计算时间并不高。此外,CSOX在其他TSP实例中进行了测试,并在许多实例中表现良好

相关文章:

旅行推销员问题的遗传算法中的完整子路线顺序交叉

摘要 旅行商问题(TSP)是许多著名的组合问题之一。TSP可以解释为很难找到从第一个城市出发,经过所有城市,然后返回起点的最短距离。在标准问题中,TSP通常用于确定新算法的效率。遗传算法是求解TSP问题的一种成功算法。…...

Python实现词频统计

词频统计是自然语言处理的基本任务,针对一段句子、一篇文章或一组文章,统计文章中每个单词出现的次数,在此基础上发现文章的主题词、热词。 1. 单句的词频统计 思路:首先定义一个空字典my_dict,然后遍历文章&#xf…...

微信小程序面试题(day08)

文章目录微信小程序自定义组件的使用?微信小程序事件通道的使用?微信小程序如何使用vant组件库?微信小程序自定义组件父传子子传父?微信小程序自定义组件生命周期有哪些?微信小程序授权登录流程?web-view。…...

最强的Python可视化神器,你有用过么?

数据分析离不开数据可视化,我们最常用的就是Pandas,Matplotlib,Pyecharts当然还有Tableau,看到一篇文章介绍Plotly制图后我也跃跃欲试,查看了相关资料开始尝试用它制图。 1、Plotly Plotly是一款用来做数据分析和可视…...

Ubuntu使用vnc远程桌面【远程内网穿透】

文章目录1.前言2.两台互联电脑的设置2.1 Windows安装VNC2.2 Ubuntu安装VNC2.3.Ubuntu安装cpolar3.Cpolar设置3.1 Cpolar云端设置3.2.Cpolar本地设置4.公网访问测试5.结语1.前言 记得笔者刚刚开始接触电脑时,还是win95/98的时代,那时的电脑桌面刚迈入图形…...

【C++】map、set、multimap、multiset的介绍和使用

我讨厌世俗&#xff0c;也耐得住孤独。 文章目录一、键值对二、树形结构的关联式容器1.set1.1 set的介绍1.2 set的使用1.3 multiset的使用2.map2.1 map的介绍2.2 map的使用2.3 multimap的使用三、两道OJ题1.前K个高频单词&#xff08;less<T>小于号是小的在左面升序&…...

css学习14(多媒体查询)

目录 多媒体查询 语法 示例代码 通用媒体查询 媒体功能参考列表 多媒体查询 CSS的媒体查询是一种CSS的技术&#xff0c;它可以根据不同的设备类型、屏幕尺寸、方向、分辨率等条件来应用不同的CSS样式&#xff0c;从而为不同的设备和屏幕提供最佳的浏览体验。这样&#xff…...

【C++进阶】C++11(中)左值引用和右值引用

文章目录左值引用左值引用的概念左值引用的使用右值引用右值引用的概念右值引用的使用左右值相互引用左值引用对右值进行引用右值引用对左值进行引用右值引用使用场景和意义左值引用的优势左值引用的短板右值引用的优势完美转发模板万能引用完美转发实际运用场景左值引用 左值…...

Python中的生成器【generator】总结,看看你掌握了没?

人生苦短&#xff0c;我用python python 安装包资料:点击此处跳转文末名片获取 1.实现generator的两种方式 python中的generator保存的是算法&#xff0c; 真正需要计算出值的时候才会去往下计算出值。 它是一种惰性计算&#xff08;lazy evaluation&#xff09;。 要创建一个…...

MD5加密竟然不安全,应届生表示无法理解?

前言 近日公司的一个应届生问我&#xff0c;他做的一个毕业设计密码是MD5加密存储的&#xff0c;为什么密码我帮他调试的时候&#xff0c;我能猜出来明文是什么&#xff1f; 第六感&#xff0c;是后端研发的第六感&#xff01; 正文 示例&#xff0c;有个系统&#xff0c;前…...

【Linux】虚拟地址空间

进程地址空间一、引入二、虚拟地址与物理内存的联系三、为什么要有虚拟地址空间一、引入 对于C/C程序&#xff0c;我们眼中的内存是这样的&#xff1a; 我们利用这种对于与内存的理解看一下下面这段代码&#xff1a; 运行结果&#xff1a; 观察父子进程中 val 变量的值&…...

四平方和题解(二分习题)

四平方和 暴力做法 Y总暴力做法&#xff0c;蓝桥云里能通过所有数据 总结&#xff1a;暴力也分好坏&#xff0c;下面这份代码就是写的好的暴力 如何写好暴力:1. 按组合枚举 2. 写好循环结束条件&#xff0c;没必要循环那么多次 #include<iostream> #include<cmath>…...

一篇文章搞定js正则表达式

我们测试正则表达式是否正确的方法有很多&#xff0c;例如通过正则表达式找到拼配的字符串&#xff1a; 在vscode编辑器中点击搜索框中的第三个按钮就可以实现&#xff1a; 或者 在浏览器中的控制台也可以实现&#xff1a; 我们可以通过下面的在线网站来测试你写的正则是否正确…...

[数据结构] 用两个队列实现栈详解

文章目录 一、队列实现栈的特点分析 1、1 具体分析 1、2 整体概括 二、队列模拟实现栈代码的实现 2、1 手撕 队列 代码 queue.h queue.c 2、2 用队列模拟实现栈代码 三、总结 &#x1f64b;‍♂️ 作者&#xff1a;Ggggggtm &#x1f64b;‍♂️ &#x1f440; 专栏&#xff1…...

官宣|Apache Flink 1.17 发布公告

Apache Flink PMC&#xff08;项目管理委员&#xff09;很高兴地宣布发布 Apache Flink 1.17.0。Apache Flink 是领先的流处理标准&#xff0c;流批统一的数据处理概念在越来越多的公司中得到认可。得益于我们出色的社区和优秀的贡献者&#xff0c;Apache Flink 在 Apache 社区…...

动态内存管理+动态通讯录【C进阶】

文章目录为什么存在动态内存分配❓&#x1f449;动态内存函数&#x1f448;malloc&freecallocrealloc❌常见的动态内存错误❌练习题&#x1fae0;C/C程序的内存开辟&#x1f914;柔性数组柔性数组的特点柔性数组的优势:star:动态通讯录:star:初始化添加销毁为什么存在动态内…...

基于pytorch+Resnet101加GPT搭建AI玩王者荣耀

本源码模型主要用了SamLynnEvans Transformer 的源码的解码部分。以及pytorch自带的预训练模型"resnet101-5d3b4d8f.pth"本资源整理自网络&#xff0c;源地址&#xff1a;https://github.com/FengQuanLi/ResnetGPT注意运行本代码需要注意以下几点 注意&#xff01;&a…...

多线程控制讲解与代码实现

多线程控制 回顾一下线程的概念 线程是CPU调度的基本单位&#xff0c;进程是承担分配系统资源的基本单位。linux在设计上并没有给线程专门设计数据结构&#xff0c;而是直接复用PCB的数据结构。每个新线程&#xff08;task_struct{}中有个指针都指向虚拟内存mm_struct结构&am…...

清晰概括:进程与线程间的区别的联系

相关阅读&#xff1a; &#x1f517;通俗简介&#xff1a;操作系统之进程的管理与调度&#x1f517;如何使用 jconsole 查看Java进程中线程的详细信息&#xff1f; 目录 一、进程与线程 1、进程 2、线程 二、进程与线程之间的区别和联系 1、区别 2、联系 一、进程与线程 …...

自定义类型 (结构体)

文章目录&#x1f4ec;结构体的声明&#x1f50e;1.结构的基础知识&#x1f50e;2.结构的声明&#x1f50e;3.特殊的声明&#x1f50e;4.结构的自引用&#x1f50e;5.结构体变量的定义和初始化&#x1f50e;6.结构体内存对齐&#x1f50e;7.修改默认对齐数&#x1f50e;8.结构体…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...