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)

大家都在看

  • MSSQL中Repalce函数处理长字符串时报异常的解决方案

    阅文时长 | 17.99分钟字数统计 | 28788.8字符主要内容 | 1、引言&背景 2、问题还原 3、解决方案 4、官方解释 5、声明与参考资料『MSSQL中Repa…

    Linux 2023年6月14日
    075
  • Nginx基础入门篇(1)—优势及安装

    一、Nginx 的优势 1.1发展趋势: 2016年: 1.2、简介 Nginx (engine x) 是一个高性能的HTTP(解决C10k的问题)和反向代理服务器,也是一个IMA…

    Linux 2023年6月6日
    096
  • linux 僵尸进程处理

    什么是僵尸进程 我们启动一个程序,开始我们的任务,然后等任务结束了,我们就停止这个进程。 进程停止后, 该进程就会从进程表中移除。 但是,有时候有些程序即使执行完了也依然留在进程表…

    Linux 2023年6月6日
    0109
  • SpringSecurity 新版2.7以上 快速入门

    SpringSecurity 快速入门 1、导入依赖 org.springframework.boot spring-boot-starter-security 2、测试三种权限 …

    Linux 2023年6月7日
    0109
  • CentOS 7 新系统 手动配置网络 简要步骤

    一、配置网卡文件 1.修改网卡文件进入网卡配置文件目录 2.查看网卡文件 CentOS中网卡文件一般为 ifcfg-ens* 这样的文件,多块网卡会有多个类似文件 3.编辑网卡文件…

    Linux 2023年6月8日
    085
  • 解决报错 Microsoft Visual C++ 14.0 is required

    环境:Surface Windows 10 专业版 问题:安装 Python3 的第三方库 py7zr 时不成功。而报错的是另外一个依赖库 pycryptodomex distut…

    Linux 2023年6月14日
    0116
  • 【Linux】CMake源码编译安装教程

    步骤: 卸载旧版本 官网下载安装包 CMake源码编译安装 检查是否安装成功 Linux下,默认安装方式: sudo apt install cmake 如果使用默认的安装方式,这…

    Linux 2023年6月13日
    0106
  • mit 6.824 lab2A ,raft 领导人选举实现(lab2D中有关于此处大量代码修改,找出了很多错误)

    lab2 说明: https://pdos.csail.mit.edu/6.824/labs/lab-raft.html 参考博客: https://zhuanlan.zhihu….

    Linux 2023年6月7日
    0132
  • 由乐观锁延伸出的知识

    锁是网络数据库中的一个非常重要的概念,当多个用户同时对数据库并发操作时,会带来数据不一致的问题,所以,锁主要用于多用户环境下保证数据库完整性和一致性以商场的试衣间为例,每个试衣间都…

    Linux 2023年6月7日
    080
  • Mysql安装

    linux系统,Mysql安装,用户登录、密码修改。 Mysql安装 环境 ubuntu 20.04 安装 安装服务 sudo apt install mysql-server 启…

    Linux 2023年6月13日
    088
  • Docker Manager for Docker Swarm deploy

    一、Swarm概述 Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机。Swa…

    Linux 2023年6月14日
    0115
  • LeetCode-26. 删除有序数组中的重复项

    题目来源 题目详情 由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应…

    Linux 2023年6月7日
    095
  • python正则表达式

    1.定义 正则表达式使用某种预定义的模式去匹配一类具有共同特征的字符串,主要用于处理字符串,可以快速、准确地完成复杂的查找、替换等处理要求。 re模块提供了正则表达式操作所需要的的…

    Linux 2023年6月7日
    0123
  • 【Redis】缓存穿透、缓存击穿、缓存雪崩产生原因及解决方案

    一. 本文对Redis中[缓存穿透]、[缓存击穿]、[缓存雪崩]三种现象产生原因、解决方法进行说明 二. 缓存穿透 1. 原因 2. 解决方法 三. 缓存击穿 1. 原因 2. 解…

    Linux 2023年5月28日
    0108
  • Linux 基于flock命令实现多进程并发读写文件控制

    需求描述 实际项目中,需要在Linux下通过 shell脚本并发读写同一个文件,但是希望同一时刻,只有一个进程可以在读、写目标文件。 解决方案 使用 flock命令。 flock …

    Linux 2023年5月27日
    0104
  • Linux Ubuntu 添加新用户

    1. 了解配置文件 Linux下与用户信息相关的配置文件有 /etc/passwd、 /etc/group、 /etc/shadow等,其权限分别如下: /etc/passwd:保…

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