整数规划-模型

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. Linux shell脚本之 if条件判断 (转)

    IF条件判断 1.基本语法: if [ command ]; then 符合该条件执行的语句 fi 2.扩展语法: if [ command ];then 符合该条件执行的语句 elif [ comm ...

  2. linux中统计文件中一个字符串出现的次数

    要统计一个字符串出现的次数,这里现提供自己常用两种方法: 1. 使用vim统计 用vim打开目标文件,在命令模式下,输入 :%s/objStr//gn 2. 使用grep: grep -o objSt ...

  3. 从StoryBoard加载控制器

    1.创建窗口self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];2.加载控制器从StoryBoard ...

  4. 前端也能做AI

    殷圣魁 58架构师 7月16日 原文链接 前言 相信不少人看过一篇人工智能已经能实现自动编写HTML,CSS的文章,人工智能开始取代前端的一部分工作.前端开发行业真的被人工智能取代吗? 1.人工智能发 ...

  5. NSURL组成部分详解

    手思中有这么一段代码,初看下,让人摸不着头脑 //功能:UIWebView响应长按事件 -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithR ...

  6. Python--操作列表

    Python--操作列表 目录 Python--操作列表 一.遍历整个列表 1. 深入研究循环 2. 在for循环中执行更多操作 3. 在for循环结束后执行一些操作 二.避免缩进错误 1. 忘记缩进 ...

  7. 基于Socket实现多人聊天室

    当前支持: 1.仅文字 2.加入聊天室提醒 3.退出聊天室提醒 可能出现的BUG: 1.可能出现客户端发送信息后不能及时推送,需要下一个客户端发送信息后一起推送 服务端代码: 1 package co ...

  8. AppiumForWin安装

    尝试安装Windows版本的Appium 参考:http://www.cnblogs.com/fnng/p/4540731.html 第一步:安装node https://nodejs.org/en/ ...

  9. SQL——with as 临时表

    一.WITH AS的含义    WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候,是 ...

  10. SQLServer、Mysql、Oracle 创建、删除用户和授予用户权限

    SQLServer 1.创建用户 CREATE LOGIN [用户名称] WITH PASSWORD='用户密码', DEFAULT_DATABASE=[默认数据库名称], CHECK_EXPIRAT ...