(转载)基于遗传算法的TSP算法(matlab实现)

news2024/11/25 20:20:10
1 理论基础
        TSP(traveling salesman problem,旅行商问题)是典型的NP完全问题,即其最坏情况下的时间复杂度随着问题规模的增大按指数方式增长,到目前为止还未找到一个多项式时间的有效算法。
TSP问题可描述为:已知n个城市相互之间的距离,某一旅行商从某个城市出发访问每个城市一次且仅一次,最后回到出发城市,如何安排才使其所走路线最短。简言之,就是寻找一条最短的遍历n个城市的路径,或者说搜索自然子集X={1,2,…,n}(X的元素表示对n个城市的编号)的一个排列π(X)={V1,V2,…,Vn},使
取最小值,其中d(Vi,Vi+1)表示城市Vi到城市Vi+1的距离。
        TSP问题并不仅仅是旅行商问题,其他许多的NP完全问题也可以归结为TSP问题,如邮路问题、装配线上的螺母问题和产品的生产安排问题等,使得TSP问题的有效求解具有重要的意义。

2 案例背景

2.1 问题描述

        本案例以14个城市为例,假定14个城市的位置坐标如表4-1所列。寻找出一条最短的遍历14个城市的路径。

2.2 解决思路及步骤

        1.算法流程
        遗传算法TSP问题的流程图如图4-1所示。
        2.遗传算法实现
        (1)编 码
        采用整数排列编码方法。对于n个城市的TSP问题,染色体分为n段,其中每一段为对应城市的编号,如对10个城市的TSP问题{1,2,3,4,5,6,7,8,9,10},则|1|10|2|4|5|6|8|7|9|3就是一个合法的染色体。
        (2)种群初始化
        在完成染色体编码以后,必须产生一个初始种群作为起始解,所以首先需要决定初始化种群的数目。初始化种群的数目一般根据经验得到,一般情况下种群的数量视城市规模的大小而确定,其取值在50~200之间浮动。
        (3)适应度函数
        设k1|k2I…|ki|…|kn|为一个采用整数编码的染色体,Dkikj为城市ki到城市kj的距离,则该个体的适应度为

 

         即适应度函数为恰好走遍n个城市,再回到出发城市的距离的倒数。优化的目标就是选择适

应度函数值尽可能大的染色体,适应度函数值越大的染色体越优质,反之越劣质。
        (4)选择操作
        选择操作即从旧群体中以一定概率选择个体到新群体中,个体被选中的概率跟适应度值有关,个体适应度值越大,被选中的概率越大。
        (5)交叉操作
        采用部分映射杂交,确定交叉操作的父代,将父代样本两两分组,每组重复以下过程(假定城市数为10):
        ①产生两个[1,10]区间内的随机整数r1和r2,确定两个位置,对两位置的中间数据进行交叉,如r1=4,r2=7
        ②交叉后,同一个个体中有重复的城市编号,不重复的数字保留,有冲突的数字(带*位置)采用部分映射的方法消除冲突,即利用中间段的对应关系进行映射。结果为

        (6)变异操作
        变异策略采取随机选取两个点,将其对换位置。产生两个[1,10]范围内的随机整数r1和 r2,确定两个位置,将其对换位置,如r1=4,r2=7
        (7)进化逆转操作
        为改善遗传算法的局部搜索能力,在选择、交叉、变异之后引进连续多次的进化逆转操作。这里的“进化”是指逆转算子的单方向性,即只有经逆转后,适应度值有提高的才接受下来,否则逆转无效。产生两个[1,10]区间内的随机整数r1和r2,确定两个位置,将其对换位置,如r1=4, r2=7

        对每个个体进行交叉变异,然后代入适应度函数进行评估,x选择出适应值大的个体进行下一代的交叉和变异以及进化逆转操作。循环操作:判断是否满足设定的最大遗传代数MAXGEN,不满足则跳入适应度值的计算;否则,结束遗传操作。

3 MATLAB程序实现

         完整代码可以从下面的链接中获取

基于遗传算法的TSP算法(matlab代码)

4 结果分析

        优化前的一个随机路线轨迹图如图4-2所示。

图4-2 随机路线 

 优化后的路线如图4-3所示:

图4-3 优化后的线路

 迭代过程如图4-4所示:

图4-4 迭代过程

5 延伸阅读

5.1 应用扩展

        以下问题都与TSP问题一致,都可以使用上述方法解决。
        1.装配线上的螺母问题
        在一条装配线上用一个机械手去紧固待装配部件上的螺母问题。机械手由其初始位置(该位置在第一个要紧固的螺母的上方)开始,依次移动到其余的每一个螺母,最后返回到初始位置。机械手移动的路线就是以螺母为结点的一条周游路线。一条最小成本周游路线将使机械手完成工作所用的时间取最小值。注意:只有机械手移动的时间总量是可变化的。
2.产品的生产安排问题
假设要在同一组机器上制造n种不同的产品,生产是周期性进行的,即在每一个生产周期
这n种产品都要被制造。要生产这些产品有两种开销,一种是制造第i种产品时所耗费的资
金(1≤i≤n),称为生产成本;另一种是这些机器由制造第i种产品变到制造第j种产品时所
耗费的开支C;,称为转换成本。显然,生产成本与生产顺序无关。于是,希望找到一种制造这
些产品的顺序,使得制造这n种产品的转换成本和为最小。

5.2 遗传算法的改进

上述程序中,对遗传算法做了以下两处改进。
1.使用精英策略
子代种群中的最优个体永远不会比父代最优的个体差,这样使得父代的好的个体不至于
由于交叉或者变异操作而丢失。
        2.使用进化逆转操作
        在本文的编码中,每一个染色体即对应一个TSP环游,如果染色体码串的顺序发生变化,则环游路径也随之改变。因此,TSP问题解的关键地方就是码串的顺序。对照文中的交叉算子,可以发现,纵使两个亲代完全相同,通过交叉,仍然会产生不同于亲代的子代,且子代的码串排列顺序与亲代有较大的差异。交叉算子的这种变异效果所起的作用有两个方面,一方面它能起到维持群体内一定的多样性的作用,避免陷入局部最优解;但是另一方面,它却不利于子代继承亲代的较多信息,特别是当进化过程进入到后期,群体空间中充斥着大量的高适应度个体,交叉操作对亲代的较优基因破坏很大,使子代难以继承到亲代的优良基因,从而使交叉算子的搜索能力大大降低。
        同交叉算子相比较,逆转算子能使子代继承亲代的较多信息。假设码串为123456789,在2和3,6和7之间发生两处断裂再逆转插入,则新码串为12-6543-789,此时子代中12段、6543段、789段与亲代对应片段顺序完全一样(6543与3456顺序对于环游路径长度来说是等价的),只是在断裂点的两端环游次序发生了变化,而且本文中逆转是单方向的,即只接受朝着好的方向的逆转,因此它搜索最优解的能力强于交叉算子。

5.3 算法的局限性

        针对问题规模n比较小时,得到的一般都是最优解;当规模比较大时,一般只能得到的近似解。这时可以通过增大种群大小和增加最大遗传代数使得优化值更接近最优解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/578672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5月份读书学习好文记录

学好C可以采取以下几个步骤: 掌握基本语法:C的语法对于初学者来说可能是一件比较难的事情,所以需要花时间掌握C的语言基础和语法规则,例如数据类型、流程控制、函数等。 学会面向对象编程(OOP):C是一种面向对象的编程…

RNN Seq2Seq

Feedforward v.s. Recurrent Feedforward network does not have input at each stepFeedforward network has different parameters for each layer 双向RNN 双向递归层可以提供更好的识别预测效果,但却不能实时预测,由于反向递归的计算需要从最末时刻…

第18章 JQuery DataTables初始化渲染显示与排序

1 System.Linq.AsyncIEnumerableExtensions (Data\Extensions\AsyncIEnumerableExtensions.cs) namespace System.Linq { /// <summary> /// 【异步枚举数扩展--类】 /// <remarks> /// 摘要&#xff1a; /// 该类通过对System.Linq.Async中方法的自定义扩展…

开启php8的JIT及时编译,超级详细 照抄即可

JIT时php8的重要功能之一&#xff0c;可以极大的提高性能&#xff1b; JIT编译器集成在了Opcache插件中&#xff0c;仅在启动Opcache插件才有效 Opcache将 PHP 脚本编译后的字节码存储到内存中&#xff0c;以避免每次执行脚本时重新解析和编译&#xff0c;从而提高 PHP 应用程…

English Learning - L3 综合练习 4 VOA-Food 2023.05.24 周三

English Learning - L3 综合练习 4 VOA-Food 2023.05.24 周三 句 1句 2Support 拓展养家&#xff0c;养家之人 句 3mustard 芥末expect 扩展 句 4句 5句 6句 7颁奖句 8句 9句 10句 11句 12句 13句 14好声音比赛 句 1 句 2 Support 拓展 Support 作动词时&#xff1a; Support …

Loki 日志收集系统

一.系统架构 二.组成部分 Loki 的日志堆栈由 3 个组件组成&#xff1a; promtail&#xff1a;用于采集日志、并给每条日志流打标签&#xff0c;每个节点部署&#xff0c;k8s部署模式下使用daemonset管理。 loki&#xff1a;用于存储采集的日志&#xff0c; 并根据标签查询日志流…

Windows 10搭建SFTP服务器【公网远程访问】

相较比高效率的FTP协议而言&#xff0c;SFTP默认只占用一个TCP端口 22端口&#xff0c;采用的是SSH加密隧道&#xff0c;理论上会比FTP更安全&#xff0c;更稳定些。 搭建SFTP服务器&#xff0c;这里我们用freesshd来实现&#xff1b;而在服务器搭建成功后&#xff0c;要实现公…

mysql详细优化建议(谈谈你的SQL优化经验)

sql语句规范 MySQL在Linux系统下数据库名&#xff0c;表名&#xff0c;存储过程名&#xff0c;函数名称&#xff0c;触发器名称等区分大小写&#xff0c;列名不区分大小写&#xff0c;原因是这些操作系统下文件名称区分大小写。 MySQL在Windows系统下全部不区分大小写&#x…

Jenkins使用Maven构建Java应用程序

本教程将向你展示如何使用Jenkins编排并构建一个使用Maven管理的简单Java应用程序。 如果你是使用Maven的Java开发人员&#xff0c;并且对CI/CD概念不熟悉&#xff0c;或者你可能熟悉这些概念&#xff0c;但不知道如何使用Jenkins实现构建应用程序&#xff0c;那么本教程适合你…

C语言数据存储 — 整型篇

C语言数据存储 — 整型篇 前言1. 数据类型介绍1.1 类型的基本分类 2. 整型在内存中的存储2.1 原码、反码、补码2.1.1 为什么数据存放在内存中存放的是补码 2.2 大小端介绍2.2.1 什么是大小端&#xff1f;2.2.2 为什么有大端和小端&#xff1f;2.2.3 一道百度系统工程师笔试题 3…

Linux之环境变量

文章目录 前言一、环境变量1.概念2.运行程序3.windows下的环境变量4.常见的环境变量 二、系统调用获取环境变量1.getenv2.演示1.标识当前的Linux用户2. 判断当前用户是否为root 三、设置环境变量1.关于变量的命令1.echo2.export3.env4.unset5.set 2.子进程继承3.PWD1. 概念2.实…

手摸手教你用AI生成PPT(本文不卖课)

今天再和大家分享一个AI实践&#xff1a; 如何借力AI帮我制作PPT&#xff1f; 上篇和大家安利了目前不用魔法上网&#xff0c;且不用翻墙的最强AI工具&#xff0c;假设我今天要给大家做一个分享&#xff0c;来介绍Claude&#xff0c;如何搞定PPT呢&#xff1f; 当然是直接问Cla…

如何在华为OD机试中获得满分?Java实现【放苹果】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

SpringBoot——原理(自动配置+原理分析-源码跟踪)

源码跟踪 从Springboot的启动类进入&#xff0c;进行分析. 源码跟踪技巧 在以后接触各种框架的时候&#xff0c;如果需要查看源码&#xff0c;需要找到关键点和核心流程&#xff0c;先在宏观对整个原理和流程有一个认识&#xff0c;之后再去了解其中的细节。 按住Ctrl左键进…

[机缘参悟-98] :层次不同、维度不同、视角不同、结论不同

目录 全局VS具备&#xff0c; 总体V部分 认知的六个认知层次&#xff1a; 认知的六个立体化维度&#xff1a; 0、维空间&#xff0c;点思维 1、一维空间&#xff0c;直线思维 2、二维空间&#xff0c;平面思维 3、三维空间&#xff1a;立体思维。 4、四维空间&#xff…

(0)调优

文章目录 前言 1 调优过程说明 2 设置飞机进行调优 3 任务规划器助手 4 初始调优飞行 5 评估飞机的调优 6 手动调优 7 自动调优 8 输入整形 9 基于发射器的调优 10 配置Notch滤波器 11 配置飞行中的FFT 前言 在默认的 PID 设置下&#xff0c;ArduPilot 可以在开箱…

Windows PyCharm 2022/2023 使用Centos7 的虚拟环境 venv 实现文件实时同步 代码代码Git自动识别 解决 Samba Cannot Save File 的问题

前期准备 git报错 fatal: unsafe repository 解决方法 因为是远程文件夹&#xff0c;老版本时没这个问题&#xff0c;新版本git或者pycharm有这个限制&#xff0c;不能自动识别更改的代码&#xff0c;报unsafe.directory的问题&#xff0c;直接暴力解决&#xff0c;加* git c…

美债死期推迟

* * * 原创&#xff1a;刘教链 * * * 号外&#xff1a;今天在小号“刘教链Pro”发表了一篇《链上投票是社会契约的一种存证》&#xff0c;探讨未来组织和DAO的治理问题&#xff0c;欢迎关注“刘教链Pro”并阅读。 * * * 隔夜比特币略有回升&#xff0c;从26.5k下方来到了26.5k…

风辞远的科技茶屋:可怖的AI

大家好&#xff0c;我是脑极体的风辞远。一直以来我们都在写大块文章&#xff0c;很少有机会跟大家聊天。时间长了&#xff0c;总觉得这种方式有一点冷漠感&#xff0c;不够轻松&#xff0c;加上往往每篇文章只聚焦一个话题&#xff0c;而我们产能有限&#xff0c;就会有很多值…

[创业之路-71] :创业思维与打工思维的区别

其实打工思维和创业思维最核心的本质区别是你是否愿意去尝试。 很多时候我打工的时候老板没发现我的潜质&#xff0c;所以我去创业了&#xff0c;这个没有&#xff0c;你打工的时候一定有一项极其长的长项&#xff0c;只不过当时你可能也没意识到&#xff0c;老板没意识到。 …