整数规划-模型

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. 群聊(udp)

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  2. Docker 与 K8S学习笔记(二十二)—— 高效使用kubectl的小技巧

    kubectl作为我们主要的操作K8S的工具,其具备非常丰富的功能,但是如果不经过打磨,使用起来还是存在诸多不便,今天我们来看看如何将我们的kubectl打磨的更加易用. 一.命令自动补全 kubec ...

  3. Java面试-常见基础笔试题目

    1. Vector, ArrayList, LinkedList的区别 Vector:①长度可变,以类似数组的形式存储于内存中,线程安全(同步),因为其大部分方法都有synchronized 关键字, ...

  4. iOS模拟弱网

    iOS平台: 首先需要苹果手机开启开发者选项,方法是手机连接到MacOS上启动Xcode. 通过自带的开发者选项 >Network Link Conditioner, 即可简单的模拟各种速度的网 ...

  5. 02 前端基础之CSS

    目录 前端基础之CSS css简介 基本选择器(重要) 组合选择器(重点) 属性选择器 分组与嵌套 伪类选择器 伪元素选择器 选择器的优先级 字体相关 背景属性 边框属性 display属性 盒子模型 ...

  6. LinuxCPU性能工具总结

    一.根据性能指标找工具 二.根据工具查性能指标

  7. 转:Minikuberar的含义很不错可以看看

    Kubernetes的主要意图是通过杂乱的负载均衡和资源分配功用跨服务器集群保管使用程序.即使某些服务器呈现毛病,也能够保证使用程序平稳运转.因而在出产布置中,有必要为Kubernetes装备多个服务 ...

  8. 拒绝for循环,从take_along_axis开始

    技术背景 在前一篇文章中,我们提到了关于Numpy中的各种取index的方法,可以用于取出数组里面的元素,也可以用于做切片,甚至可以用来做排序.但是遇到对于高维矩阵的某一个维度取多个值的时候,单纯的使 ...

  9. [LeetCode]1221. 分割平衡字符串

    在一个「平衡字符串」中,'L' 和 'R' 字符的数量是相同的. 给出一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串. 返回可以通过分割得到的平衡字符串的最大数量. 示例 1: 输入:s = ...

  10. Python中random模块的用法案例

    1 import random # 调用random模块 2 3 a = random.random() # 随机从0-1之间抽取一个小数 4 print(a) 5 6 a = random.rand ...