你真的懂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 块 一.异常介 ...
随机推荐
- ListIterator特有的方法
import java.util.ArrayList; import java.util.List; import java.util.ListIterator; /* 迭代 listIterator ...
- Hadoop完全分布式的配置
选取机器sam01作为主节点,并进行分布式文件的配置 1.进入Hadoop配置文件路径/usr/local/hadoop/etc/hadoop(这里我把Hadoop安装在/usr/local目录下) ...
- KC705E增强版基于FMC接口的 Kintex-7 XC7K325T PCIeX8 接口卡
一.板卡概述 本板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8.64bit DDR3容量 ...
- Solution -「AGC 034C」Tests
\(\mathcal{Description}\) Link. 给定非负整数序列 \(\{l_n\},\{r_n\},\{b_n\},X\),求最小的 \(s\),使得存在非负整数序列 \(\ ...
- suse 12 脚本部署docker(二进制文件)
suse-linux:~ # cat /etc/issue Welcome to SUSE Linux Enterprise Server 12 SP3 (x86_64) - Kernel \r (\ ...
- 超详细的Cookie增删改查
目录 1,什么是 Cookie? 1.1,存储形式 1.2,常用属性 1.3,大小限制 2,增 or 改Cookie 3,查Cookie 4,删Cookie 1,什么是 Cookie? Cookie是 ...
- DotNet Dictionary 实现简介
一:前言 本来笔者对DotNet的Hashtable及Dictionary认识一直集中在使用上,一个直接用object 一个可以用泛型,以前也只大概看过Hashtable的实现.最近查MSDN时发现有 ...
- AFNetworking 修改
相比大家刚刚拿到AFNetworking post 和 get 请求数据的时候都会有些小问题吧 NSLocalizedDescription=Request failed: unacceptabl ...
- ssh 连接出现expecting SSH2_MSG_KEX_ECDH_REPLY失败解决
问题描述: ssh连接通过ipsec后连接卡住:ssh -vvv显示: echo "1420" > /sys/class/net/eth0/mtu #把mtu值设置一下默认是 ...
- 如何把Spring学精通了?
作为 Java 后端工程师,几乎都要用到 Spring,今天这篇文章是和大家说说如何学好 Spring. 在之前的一篇 Java 读书路线的文章中,我介绍过 Spring 的读书路线: 虽然 Spri ...