你真的懂TSP吗
整数规划-模型
2022年2月26日
TSP问题
有一个邮递员,他每天负责向100个客户的家门口送一份报纸,他希望走最短的总路程来完成配送任务,这是TSP问题最原始的场景。用理论描述就是:找一个路径最小的哈密顿回路(Hamiltonian cycle) 。
哈密顿回路:也称为一笔画问题,就是从一个点出发不重复的走完所有的点,最后在回到出发点。我们现在希望为邮递员找到这个最短的哈密顿回路。

求解
关于求解TSP问题的方法,有很多,但是他们之间的效率也是千差万别,比如我们本篇推文介绍基于整数规划的一类求解思路这也是最主流的效果最好的,可以拓展到非常大的规模的一类解法,可以说是正统解法,当然还有其他解法,比如动态规划等,这里先挖一个坑,有时间小编一定把动态规划的思路的代码一同奉上。
模型
这里我们提供两个模型,分别是对称TSP和非对称TSP,假设我们我们将报亭标号为1,且客户的数量加上报亭一共为n;cij表示从i到j的距离。


分析
虽然我们把模型写出来了,但是我们必须得知道每个约束的作用是什么,只有清楚的知道当前这一步是为什么,我们才知道下一步得往哪里走,对吧。
对比:
- 目标函数:没有区别;
- Asymmetric的(1)(2)在Symmetric中变成了(5),这三个约束我们一般称为“度约束”。 在非对称的情况cij和cji是不同的,所以我们从i走到j和从j走到i是不同的。所以我们需要针对每个点的出度和入度进行约束;但是对称的情况则不用却分从i到j还是从j到i,为了避免求解模型的时候还是将xij和xji进行枚举,比较我们就在一开始的时候不生成从j到i得边,(这里请仔细想想,我说出来的话可能在你那里就变味了)。但是不难看出,“度约束的数量少了一半”非常哈皮啊。所以求解对称问题比求解非对称问题快你现在知道为什么了对吧。
- Asymmetric的(3)在Symmetric中变成了(6),这两个约束可以称为“消除子环约束”,为什么需要这个约束呢?我们先把这个约束从两个模型中去掉,来看看,会发现有一种不合法的情况会出现,如如图1所示:
- 最后(4)和(7)约束限制,决策变量必须为整数,以为一条边的存在不能是小数的。

图1
这个结果显然是不对的,因为它没有做到一笔画,而是分了两笔;但是如果没有“消除子环约束”我们的模型将会把上述模型视为合法的,但是真正的最优结果应该是

图2
在下期的推文中我们将介绍,如何借助cplex构造:割平面算法(cutting plane)和分支定界算法,来求解问题。小编到时候会提供代码哦,还不快快关注一下,哈哈哈。
你真的懂TSP吗的更多相关文章
- [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
- 【转】was mutated while being enumerated 你是不是以为你真的懂For...in... ??
原文网址:http://www.jianshu.com/p/ad80d9443a92 支持原创,如需转载, 请注明出处你是不是以为你真的懂For...in... ??哈哈哈哈, 我也碰到了这个报错 . ...
- javascript的语法作用域你真的懂了吗
原文:javascript的语法作用域你真的懂了吗 有段时间没有更新了,思绪一下子有点转不过来.正应了一句古话“一天不读书,无人看得出:一周不读书,开始会爆粗:一月不读书,智商输给猪.”.再加上周五晚 ...
- 你真的懂ajax吗?
前言 总括: 本文讲解了ajax的历史,工作原理以及优缺点,对XMLHttpRequest对象进行了详细的讲解,并使用原生js实现了一个ajax对象以方便日常开始使用. damonare的ajax库: ...
- “三次握手,四次挥手”你真的懂吗?TCP
“三次握手,四次挥手”你真的懂吗? mp.weixin.qq.com 来源:码农桃花源 解读:“拼多多”被薅的问题出在哪儿?损失将如何买单? 之前有推过一篇不错的干货<TCP之三次握手四次挥手 ...
- 你真的懂 ajax 吗?
前言 总括: 本文讲解了ajax的历史,工作原理以及优缺点,对XMLHttpRequest对象进行了详细的讲解,并使用原生js实现了一个ajax对象以方便日常开始使用. damonare的ajax库: ...
- 【转】先说IEnumerable,我们每天用的foreach你真的懂它吗?
[转]先说IEnumerable,我们每天用的foreach你真的懂它吗? 我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq ...
- 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截
程序猿修仙之路--数据结构之你是否真的懂数组? 数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构 .要想在之后的江湖历练中通关,数据结构必不可少. ...
- C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
随机推荐
- Html 项目使用自定义字体文件问题
感谢大佬:https://zhidao.baidu.com/question/652711582735059245.html 1.首先在项目过程中新建文件夹fonts将准备好的ttf字体文件复制该文件 ...
- docker | jenkins 实现自动化部署项目,后端躺着把运维的钱挣了!(上)
前言 背景 最近在帮学校导师写项目,团队有4个人,项目前后端分离.如果是选择瀑布式开发:(在约定好接口的情况下)A.B同学写前端,C.D同学写后端,然后约定一个时间统一联调,最后将项目交付安装到客户机 ...
- notepad++颜色属性解释
Global Styles Indent guideline style 缩进参考线的颜色Brace highlight style 鼠标指针在框架左右时框架的颜色(如css中{} js中的() ...
- 02 前端基础之CSS
目录 前端基础之CSS css简介 基本选择器(重要) 组合选择器(重点) 属性选择器 分组与嵌套 伪类选择器 伪元素选择器 选择器的优先级 字体相关 背景属性 边框属性 display属性 盒子模型 ...
- 10、架构--keepalive、四层负载均衡
笔记 1.晨考 1.HTTPS的作用,怎么实现的呢? 2.全栈部署HTTPS 只需在代理中部署HTTPS 3.反向代理 BBS 步骤 1.部署WEB机器 2.部署代理 4.如果 LB01 宕机了,怎么 ...
- 基于双TMS320C6678 + XC7K420T的6U CPCI Express高速数据处理平台
1.板卡概述 板卡由我公司自主研发,基于6UCPCI架构,处理板包含双片TI DSP TMS320C6678芯片:一片Xilinx公司FPGA XC7K420T-1FFG1156 芯片:六个千兆网口( ...
- 我们一起来学Shell - shell的并发及并发控制
文章目录 bash的并发 未使用并发的脚本 简单修改 使用wait命令 控制并发进程的数量 文件描述符 查看当前进程打开的文件 自定义当前进程用描述符号操作文件 管道 我们一起来学Shell - 初识 ...
- soc AXI接口术语和特性
AXI接口术语和特性 1.outstanding 2.interleaving 3.out-of-oder 4.写数据可以优先于写地址 5.大小端 小端:低地址数据放在总线bus的低位. 大端:低地址 ...
- 【基础篇】js对本地文件增删改查--增
前置条件: 1. 本地有安装node,点击传送门 项目目录: 1. msg.json内容 { "data": [ { "id": 1, "name&q ...
- AfterLogicWebMail CSRF导致密码可修改
实验目的 了解CSRF漏洞导致Webmail管理员帐号密码任意被修改 实验原理 当我们打开或者登陆某个网站的时候,浏览器与网站所存放的服务器将会产生一个会话(cookies),在这个会话没有结束时,你 ...