旅行商问题 Traveling Salesman Problem(TSP)

一、问题描述:是一个经典的组合优化问题

一个商人从一点出发,经过所有点后返回原点。

目标:经过所有点的最短路程。

约束:

1,除起点和终点外,所有点当且仅当经过一次;

2,起点与终点重合;所有点构成一个连通图


图论解释:该问题实质是在一个带权完全无向图中,找一个权值最小的哈密尔顿回路

哈密尔顿回路(Hamilton回路)

定义:G=(V,E)是一个图,遍历图中每个顶点一次且仅一次的路线称为哈密尔顿路径,遍历图中每个顶点一次且仅一次的回路(从哪里出发再回到哪里)称为哈密尔顿回路。具有哈密尔顿回路的图叫做哈密尔顿图

【离散数学】图论(四)哈密顿回路(Hamiltonian cycle) - 简书 (jianshu.com)


二、TSP问题建模

(29条消息) 旅行商(TSP)问题建模和子路径(subtour)消除约束详解_Dragon Fly的博客-CSDN博客_tsp约束条件

三、存在子回路(subtour)

查看源图像

导致解中含有多个相离的环,也就是subtour。需要的解是一个单个的经过所有点的大环


  子路径消除约束常见两种

  1. 加入subtour-elimination 约束
  2. 加入Miller-Tucker-Zemlin(MTZ)约束

1: subtour-elimination 消除子环路

主要想法就是,根据子环路的特点,在模型中添加相应的约束,将其破开>>增加子环路不存在的条件就是(即破圈的方法)

粗犷理解:点的个数为N,S为点的集合,除了包含全部点的集合的情况,所有其他少了一个或几个点的集合所形成的点点线条必须小于等于(集合中点总数-1)(即少了一个或几个点后,连线边要求比现存的点少)

subtour-elimination的约束,思路就是相当于割平面法,是一个枚举的约束,复杂度2^{N}
采用Gurobi或者CPLEX求解器中提供的callback(回调函数)的方法来动态的添加subtour-elimination约束。


2 : Miller-Tucker-Zemlin(MTZ)约束消除子环路

对每个结点,引入一个决策变量\mu _{i}

 

 粗犷理解:M 取无穷大数,是运筹学中常见的基本操作​​​​​​​,取M = N (N为节点的个数)


由于TSP的起点和终点是一致的,如果不做处理,会出现infeasible的情况

 修正:点集为V ′ = { 1 , 2 , ⋯   , N , N + 1 } V'=\{1,2,..., N,N+1},一共N + 1 个点,其中点1和点N + 1 是同一个点,点1表示起点,点N + 1 表示终点

​​​​​​​(29条消息) 运筹学修炼日记:TSP中两种不同消除子环路的方法及callback实现(Python调用Gurobi求解,附以王者荣耀视角解读callback的工作逻辑)_刘兴禄的博客-CSDN博客

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
离已知,旅行商问题Traveling Salesman ProblemTSP)是在图论中的经典问题。它假设有若干个城市,并且每两个城市之间的距离都已知。问题的目标是找到一条路径,使得旅行商能够依次访问每个城市,并且最终回到起始城市,同时总路径长度最短。 TSP是一个NP-hard问题,意味着在一般情况下很难找到一个高效的解决算法。目前,对于TSP的求解方法主要有穷举法、贪心算法、动态规划、遗传算法等。 穷举法是一种暴力的解法,它尝试列举出所有可能的路径,并计算每条路径的总长度,最后选择其中最短的路径。这种方法适用于城市数量较少的情况,但随着城市数量的增加,计算量呈指数级增长。 贪心算法是一种局部最优策略,它从一个起始城市开始,每次选择距离最近的下一个城市作为下一个访问目标,直到遍历完所有城市。贪心算法的计算速度较快,但可能得到的结果并不一定是最优解。 动态规划是一种针对TSP的优化算法,通过利用子问题的最优解来构造整体解。它将问题分解为多个子问题,并通过递归计算子问题的最优解,最终得到整体的最优解。动态规划的时间复杂度为O(n^2*2^n)。 遗传算法是一种启发式的优化算法,它模拟自然界中的遗传进化过程。通过对路径进行交叉、变异等操作,逐步优化路径长度,最终找到近似最优解。遗传算法能够处理大规模的TSP问题,但结果通常只是近似最优解。 总之,TSP是一个经典的图论问题,已经有人提出了多种求解方法。根据问题的规模和对结果要求的不同,可以选择适用的解决算法。然而,由于TSP的复杂性,要找到真正的最优解仍然是一个挑战。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值