MTSP问题的简单介绍

1. TSP问题与MTSP问题

1.1 TSP与MTSP问题的介绍:

  • TSP:是指旅行家(1名)要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的 路程最短

MTSP问题的简单介绍

TSP问题(图片来自网络)

  • MTSP:m个旅行商_去旅游 n个城市_,规定都必须从同一个出发点出发,而且返回原出发点,需要将所有的城市遍历完毕,每个城市只能游历一次,但是为了路径最短可以路过这个城市多次。这个就是多旅行商问题。是在TSP问题的基础上进行了扩展。

MTSP问题的简单介绍

MTSP问题(图片来自网络)

1.2 MTSP与TSP问题的区别:

  • TSP指的是单个旅行商遍历一圈,将所有城市旅行一遍。
  • MTSP指的是将城市群划分成M个组,每组采用TSP得到最短的旅行路线,所以问题的关键在于如何确定城市群的 分组

2. MTSP问题的目标

MTSP问题是一个多目标问题,且 平均分配各旅行商的任务是多旅行商问题的一个重要的环节。MTSP问题的目标一般如下[1]:

  • 最小化总行程 && 均分多个旅行商访问节点数(不同城市数量)
  • 最小化总行程 && 均分访问路程

2.1 均分访问节点数的MTSP问题

目标函数1:

MTSP问题的简单介绍
目标函数2:MTSP问题的简单介绍
合并为一个目标函数:(↓更正:最后一个”+”应为”*”)

总目标函数既能使 总行程达到最小,同时也能达到平均分配 M个旅行商的访问节点数的目的。

2.2 均分行驶路程的多旅行商问题

目标函数1:

MTSP问题的简单介绍
目标函数2:MTSP问题的简单介绍
合并为一个目标函数:

总目标函数中,前一项体现均分M个路径长度的效果,后一项则是总路径长度。k为调节总目标函数中两个组成部分之间比例的系数(k>0)。

3. MTSP问题的求解方法及代码

主要基于GA(遗传算法)与SA(模拟退火算法)解决MTSP问题。
代码详见:https://github.com/Star-Stone/MTSP-GA-and-SA ,以下样例基于此代码。

问题一:

工厂安排 巡检路线问题,即多个员工巡检完全部检查点。

class GA:
    "商旅数量、城市数量、出发城市编号、文件路径、最大循环次数、路程权重、均衡度权重"
    def __init__(self, salesman_num, city_num, start_index,
                 filename, max_gen, distance_weight, balance_weight):

以上是定义的 GA类初始化所需传入的相关参数,注意其中的 路程权重、均衡度权重,在目标函数求解中将用到。

核心思路:虚点

通过增加虚点,将MTSP问题转化为TSP问题

总共8个城市,3号城市为起始点.下列染色体组成我们把起点和终点省略,看情况是否 增加虚点

  • 1个旅行商:一个chrom = [把3剔除,其余数字由1到8组成]
    如[1,5,4,2,6,8,7]表示旅行商路线为3->1->5->4->2->6->8->7->3
  • 2个旅行商:一个chrom = [1个9(9代表虚点,其实也是起点3),其余数字由1到8组成]。以此类推到多个旅行商的情况。
    如[1,5,4,9,2,6,8,7]表示:
    旅行商1路线为3->1->5->4->3(9)
    旅行商2路线为3(9)->2->6->8->7->3
  • 3个旅行商:一个chrom = [9,10,其余数字由1到8组成]
    如[1,5,4,9,2,6,10,8,7]
    旅行商1路线为3->1->5->4->3(9)
    旅行商2路线为3(9)->2->6->3(10)
    旅行商3路线为3(10)->8->7->3

即m个旅行商,增加((m-1))个虚点,沿虚点分割路线即为每个旅行商的路线。

目标函数:路程与均衡度的加权平均

目标函数 Z = distance_weight _总路程 + balance_weight_均衡度
均衡度 = (max(l)-min(l))/ max(l)

本题使用SA算法的思路与GA算法类似。详情请阅读代码,不做详细展开。

  • THE END –

参考文献
[1]卢厚清,王辉东,黄杰,等. 任务均分的多旅行商问题[J]. 系统工程,2005,23(2):19-21. DOI:10.3969/j.issn.1001-4098.2005.02.005.

[2]郭强,迟洪钦. 基于GA的MTSP问题的研究[J]. 计算机与数字工程,2010,38(10):5-7,18. DOI:10.3969/j.issn.1672-9722.2010.10.002.

Original: https://www.cnblogs.com/litecdows/p/16500123.html
Author: litecdows
Title: MTSP问题的简单介绍

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/609769/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Linux 配置Maven(避免踩坑篇)

    前言:请各大网友尊重本人原创知识分享,谨记本人博客: 南国以南i 二、下载好的maven安装包放在磁盘的 /usr/local/ 目录下,如下图: 三、解压该压缩文件 tar -z…

    Linux 2023年6月14日
    0104
  • JAVA中如何将以Date型的数据保存到数据库以Datetime型的字段中

    用Timestamp就行了 recordOuttime是Date类型 import java.sql.Timestamp; Record record = recordMapper…

    Linux 2023年6月8日
    083
  • 设计模式——–原型模式

    原型模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式的核心是一个clone方法,通过该方法进行对象的拷贝。 代码实例 原型模式的优点:性能更加优…

    Linux 2023年6月7日
    078
  • 博客园装饰——(二)滚动到页面顶部或底部

    功能描述: 1. 当页面向下滚动一定距离时,向下滚动到底部的按钮以淡入的效果出现,并以固定定位显示。且滚动到一定距离(快接近所设置的底部)时,该按钮又会以淡出效果消失。 2. 当页…

    Linux 2023年6月14日
    092
  • 如何在CentOS 6.3上安装nslookup

    nslookup是bind-utils软件包的一部分。请注意,host、dig和nslookup也是bind工具的一部分。如果没有安装bind-utils包,当你尝试nslooku…

    Linux 2023年6月7日
    0115
  • redis高可用

    Redis-高可用(主从复制、哨兵模式、集群) 1.主从复制 1.1 主从复制简介 在 Redis 复制的基础上,使用和配置主从复制非常简单,能使得从 Redis 从服务器(下文称…

    Linux 2023年6月13日
    090
  • csrf跨站请求伪造;auth模块

    csrf跨站请求伪造 针对csrf相关的校验有很多种方式,django只是提供了一些而已 form表单 前提必须是前后端整合,能够使用模板语法 {% csrf_token %} 当…

    Linux 2023年6月7日
    089
  • 【转】 一条 SQL 的执行过程详解

    MySQL 体系架构 – 连接池组件 1、负责与客户端的通信,是半双工模式,这就意味着某一固定时刻只能由客户端向服务器请求或者服务器向客户端发送数据,而不能同时进行。 …

    Linux 2023年6月13日
    0129
  • JQ 实现对比两个文本的差异并高亮显示差异部分

    利用jq对比两段文本的差异,差异的内容用不同颜色表示出来。 在线参考demo:http://incaseofstairs.com/jsdiff/ 项目地址:https://gith…

    Linux 2023年6月7日
    0111
  • 编写radware的负载配置

    radware如何添加负载服务? 笔者在新添加radware的新负载服务的时候,是习惯去看下上一个负载服务的ID 和 节点服务的ID 号 分别是多少,主要是避免ID冲突,把其他服务…

    Linux 2023年6月8日
    0102
  • ​探秘 Web 水印技术

    Web 水印技术在信息安全和版权保护等领域有着广泛的应用,对防止信息泄露或知识产品被侵犯有重要意义。水印根据可见性可分为可见水印和不可见水印(盲水印),本文将分别予以介绍,带你探秘…

    Linux 2023年6月8日
    0118
  • 【转】我是一个CPU:这个世界慢!死!了!

    简介 我经常听到人们说磁盘慢,网络很慢,这是从人类感知的角度来表达的。比如,把一个文件拷贝到硬盘上需要几分钟到几十分钟,足够我吃一顿饭;而从网上下载一部电影,有时需要几个小时,我可…

    Linux 2023年5月27日
    0100
  • 【Example】C++ 回调函数及 std::function 与 std::bind

    回调函数是做为参数传递的一种函数,在早期C样式编程当中,回调函数必须依赖函数指针来实现。 而后的C++语言当中,又引入了 std::function 与 std::bind 来配合…

    Linux 2023年6月13日
    090
  • C语言基本语法

    C语言以分号代表一条语句结束,一条命令可以在多行显示 对于空格没有多大要求,只是为了代码美观,方便看懂,但python语法就比较严格必须要加空格 注释VS快捷键Ctrl+K,然后C…

    Linux 2023年6月8日
    099
  • Putty&Psftp命令行实现自动登录

    | 0.18分钟 | 292.8字符 | 1、引言&背景 2、解决方案 3、声明与参考资料 | SCscHero | 2022/1/22 PM6:0 | 系列 | 已完成 …

    Linux 2023年5月27日
    0101
  • Redis主从复制的配置和实现原理

    Redis的持久化功能在一定程度上保证了数据的安全性,即便是服务器宕机的情况下,也可以保证数据的丢失非常少。通常,为了避免服务的单点故障,会把数据复制到多个副本放在不同的服务器上,…

    Linux 2023年5月28日
    087
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球