整数规划-模型

2022年2月26日

TSP问题

有一个邮递员,他每天负责向100个客户的家门口送一份报纸,他希望走最短的总路程来完成配送任务,这是TSP问题最原始的场景。用理论描述就是:找一个路径最小的哈密顿回路(Hamiltonian cycle) 。

哈密顿回路:也称为一笔画问题,就是从一个点出发不重复的走完所有的点,最后在回到出发点。我们现在希望为邮递员找到这个最短的哈密顿回路。

求解

关于求解TSP问题的方法,有很多,但是他们之间的效率也是千差万别,比如我们本篇推文介绍基于整数规划的一类求解思路这也是最主流的效果最好的,可以拓展到非常大的规模的一类解法,可以说是正统解法,当然还有其他解法,比如动态规划等,这里先挖一个坑,有时间小编一定把动态规划的思路的代码一同奉上。

模型

这里我们提供两个模型,分别是对称TSP和非对称TSP,假设我们我们将报亭标号为1,且客户的数量加上报亭一共为n;cij表示从i到j的距离。

分析

虽然我们把模型写出来了,但是我们必须得知道每个约束的作用是什么,只有清楚的知道当前这一步是为什么,我们才知道下一步得往哪里走,对吧。

对比:

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

图1

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

图2

在下期的推文中我们将介绍,如何借助cplex构造:割平面算法(cutting plane)和分支定界算法,来求解问题。小编到时候会提供代码哦,还不快快关注一下,哈哈哈。

你真的懂TSP吗的更多相关文章

  1. [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?

    你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...

  2. 【转】was mutated while being enumerated 你是不是以为你真的懂For...in... ??

    原文网址:http://www.jianshu.com/p/ad80d9443a92 支持原创,如需转载, 请注明出处你是不是以为你真的懂For...in... ??哈哈哈哈, 我也碰到了这个报错 . ...

  3. javascript的语法作用域你真的懂了吗

    原文:javascript的语法作用域你真的懂了吗 有段时间没有更新了,思绪一下子有点转不过来.正应了一句古话“一天不读书,无人看得出:一周不读书,开始会爆粗:一月不读书,智商输给猪.”.再加上周五晚 ...

  4. 你真的懂ajax吗?

    前言 总括: 本文讲解了ajax的历史,工作原理以及优缺点,对XMLHttpRequest对象进行了详细的讲解,并使用原生js实现了一个ajax对象以方便日常开始使用. damonare的ajax库: ...

  5. “三次握手,四次挥手”你真的懂吗?TCP

    “三次握手,四次挥手”你真的懂吗?  mp.weixin.qq.com 来源:码农桃花源 解读:“拼多多”被薅的问题出在哪儿?损失将如何买单? 之前有推过一篇不错的干货<TCP之三次握手四次挥手 ...

  6. 你真的懂 ajax 吗?

    前言 总括: 本文讲解了ajax的历史,工作原理以及优缺点,对XMLHttpRequest对象进行了详细的讲解,并使用原生js实现了一个ajax对象以方便日常开始使用. damonare的ajax库: ...

  7. 【转】先说IEnumerable,我们每天用的foreach你真的懂它吗?

    [转]先说IEnumerable,我们每天用的foreach你真的懂它吗? 我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq ...

  8. 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截

    程序猿修仙之路--数据结构之你是否真的懂数组?   数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构  .要想在之后的江湖历练中通关,数据结构必不可少. ...

  9. C# 知识回顾 - 你真的懂异常(Exception)吗?

    你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...

随机推荐

  1. Java数组3种创建方式

    public static void main(String[] args){ /** * 1. 固定大小的空数组, 动态创建 */ String[] strArr1 = new String[3]; ...

  2. Visual Studio 下error C2471: 无法更新程序数据库

    转载请注明来源:https://www.cnblogs.com/hookjc/ 解决方案:修改项目属性 右击项目 --> "属性" 1. "C/C++" ...

  3. 使用 Element UI Select 组件的 value-key 属性,让绑定值可以为一个对象

    EsunR 2019-11-07 12:14:42  12264  收藏 6 分类专栏: Vue 文章标签: element-ui 版权 当我们使用 Elemet UI 的选择组件进行多选时,Sele ...

  4. centos安装Libzip

    2018年06月29日 11:12:15 oxiaobaio 阅读数 4827   wget https://nih.at/libzip/libzip-1.2.0.tar.gztar -zxvf li ...

  5. ARC和MRC兼容和转换

    1.ARC模式下如何兼容非ARC的类 转变为非ARC -fno-objc-arc 转变为ARC的, -f-objc-arc (不常用) 2.如何将MRC转换为ARC

  6. 使用grpcui测试gRPC服务

    grpcui类似Swagger UI,可以用来测试gRPC服务,使用起来特别简单. 其原理是通过自动发现gRPC服务协议(当然前提是gRPC服务暴露了Protobuf协议),然后启动一个带界面的Web ...

  7. netty系列之:可以自动通知执行结果的Future,有见过吗?

    目录 简介 JDK异步缘起 netty中的Executor Future的困境和netty的实现 总结 简介 在我的心中,JDK有两个经典版本,第一个就是现在大部分公司都在使用的JDK8,这个版本引入 ...

  8. NPM 错误、问题等汇总

    一. npm的作用就是对Node.js依赖的包进行管理,也可以理解为用来安装/卸载Node.js需要装的东西 二. 1. 修改npm配置为淘宝的源下载: npm install -g cnpm --r ...

  9. Java在算法题中的输入问题

    Java在算法题中的输入问题 在写算法题的时候,经常因为数据的输入问题而导致卡壳,其中最常见的就是数据输入无法结束. 1.给定范围,确定输入几个数据 直接使用普通的Scanner输入数据范围,然后使用 ...

  10. JAVA8学习——深入浅出方法引用(学习过程)

    方法引用:method reference 先简单的看一下哪里用到了方法引用: public class MethodReferenceTest { public static void main(S ...