algorithm - 将旅行商表示为线性表达式

标签 algorithm linear-algebra linear-programming cplex traveling-salesman

我在网上看到有人可以将旅行商问题写成一个线性表达式,然后使用 CPLEX for java 等软件对其进行计算。

我有 1000 个城镇,需要找到一个短距离。我计划将这 1000 个城镇划分为大约 100 个城镇的集群,并对这些单独的集群执行一些线性规划算法。

我的问题是,我该如何将其准确表示为线性表达式。

所以我有 100 个城镇,我相信每个人都知道 TSP 的运作方式。

我完全不知道如何编写满足 TSP 的线性约束、目标和变量。

有人可以向我解释这是如何完成的,或者给我发送一个链接来清楚地解释它,因为我已经进行了很多研究,但似乎找不到任何东西。

编辑:

我发现的一些额外信息:

我们用数字 0 到 n 标记城市并定义矩阵:

enter image description here

这会产生以下 5 个城镇的矩阵吗?

enter image description here

约束是:

i) 每个城市都是从另一个城市到达的

ii) 从每个城市出发到另一个城市

iii) 这条路线没有分成单独的岛屿。

同样,这对我来说完全有意义,但我仍然无法将这些约束写成线性表达式。显然这是一个足够简单的矩阵。

感谢您的帮助!

最佳答案

根据这个Wikipedia article旅行商问题可以建模为一个整数 线性程序,我认为这是问题的关键问题。这个想法是在 {0,1} 中有允许值的决策变量,它对图中选择的边进行建模。合适的约束必须确保所选边覆盖每个节点,所选边形成一组循环并且只有一个连通分量(这总共意味着恰好有一个循环包含每个节点)。请注意,该文章还给出了明确的公式并解释了约束的解释。

由于旅行商问题是NP-hard,除非P=NP,否则无法通过(非积分)线性规划求解。

关于algorithm - 将旅行商表示为线性表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29917133/

相关文章:

algorithm - Knuth舞蹈与次要专栏的链接

python - NumPy linalg.eigh 返回不正确的特征向量

最大化矩阵的最小对角线元素的算法

algorithm - 如何在任意四边形内刻上一个矩形或圆形

algorithm - 最大化整数数组中的熵

c - 算法 |给定一个数组 [] 和 k,找到子集数和 k 的倍数

c++ - 快速稀疏矩阵乘法

python - Pulp Python LP - 错误的解决方案

algorithm - 如何防止用户使用大写锁定书写?

scala - 如何在 Scala 微风中求解线性矩阵系统?