当前位置: 首页 > 知识库问答 >
问题:

TSP和Christofide启发式的子游约束公式

鄢雅畅
2023-03-14

我正在比较旅行商问题(TSP)的不同公式。特别是,我比较了DFJ和MTZ次目标约束公式。这些都是使用GLPK解算器(通过Python代码和pyomo包)实现的。由于前者中有大量约束,TSP的解决方法如下:

  1. 放松所有子任务约束
  2. 求解MIP
  3. 如果解决方案可行:完成
  4. 否则:为当前解决方案中的每个子周期添加DFJ subtour约束

这在我需要处理的实例上非常有效。另一方面,MTZ配方要慢得多(在10到10k倍之间)。因此,我有以下问题:

  1. MTZ公式也能有效地迭代求解吗

关于第二个问题,两个区别是DFJ公式包含$O(2^n)$subTour约束,而MTZ包含$O(n^2)$subTour约束,DFJ使用$n$变量,而MTZ使用$2n$。然而,由于DFJ是迭代求解的,因此不需要所有的subTour约束(实际上对于我使用的实例来说,少于10次迭代就足够了),我们只剩下类似数量的约束。因此,我假设差异是变量的数量,但我不知道为什么这会导致如此大的差异。

最后,我认为使用启发式方法(即Christofide算法)可以产生目标的上界,可以用作新的约束条件(希望大幅减少可行解集)。然而,如果我首先应用赫里斯托菲德的启发式方法来确定目标的上界,然后在求解MIP之前将其添加到约束中,那么效率最多保持不变,最坏的情况下会降低10倍。

为什么?这与可行解决方案集的新形状有关吗?我的一个朋友也假设GLPK可能不会执行适当的预处理来消除支配约束,但我不知道这是否正确,我也不知道去哪里找这个。

有人对我的众多问题中的一个有想法吗?

共有1个答案

景安翔
2023-03-14

关于赫里斯托菲德斯启发式的使用:我认为正确的方法不是将其目标作为约束。相反,您希望为解算器提供目标作为上限。我不知道GLPK是如何处理这个问题的,但我想有一种方法可以提供一个初始上界,在它找到一个比你的上界更好的可行解决方案之前,解算器可以先用它来了解分支和边界树。

此外,赫里斯托菲德(Christofides)具有很好的理论性质,但一般来说,它不是TSP的最佳启发式。即使是像“最远插入”这样非常简单的方法,平均性能也会更好。

不幸的是,我没有任何关于DFJ与MTZ子目标消除约束的建议。。。

 类似资料:
  • 本文向大家介绍C ++中的约束子序列总和,包括了C ++中的约束子序列总和的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个名为nums的数组和一个整数k,我们必须找到该数组的一个非空子序列的最大和,以使子序列中每两个连续的数字nums [i]和nums [j],其中i <j,条件j-i <= k为真。 众所周知,数组的子序列是通过从数组中删除一些元素而获得的,其余元素则保持其原始顺序。 因

  • 我有这样的情况: 由于项目经理之间存在关系m:n,我将有第三个表: 其中(ManagerID,ProjectID)是Manager_has_Project的复合主键 让我们假设我们必须删除一个从我们的数据库中创建了一些项目的经理:SQL不会让我们这么做。我们可以在子表“on DELETE cascade”中添加对fk ManagerID的约束,但在这种情况下,我们将丢失有关(例如)有多少经理为一个

  • 了解如何对多种屏幕尺寸和布局使用响应式调整大小和约束功能。 响应式调整大小 当针对如今的多设备环境进行设计时,务必要考虑到移动设备、平板电脑和桌面解决方案所使用的各种屏幕尺寸。由于设计师使用的设备各异,设计人员需要考虑内容如何适应多种屏幕尺寸。  为解决此用户问题,Adobe XD 开发了一项称为响应式调整大小的功能,支持您调整对象大小,同时保持不同大小下的空间关系,以最好地适应多种屏幕大小。响应

  • 我试图为一个棋盘游戏找到一个更好的启发式函数,我将在代码后指定其规则。我的评估功能是: 初始板持有绿色和红色令牌,如图所示。人工智能先移动,使用与你相反的颜色,攻击你的代币。在黑色单元上,令牌可以正交(左、右、上、下)或对角移动。如果是在白血球上,你只能正交移动。 当您将令牌移动到对手令牌旁边时,您将删除该方向上所有对手的令牌。例如,如果我将绿色令牌从 C4 移动到 C5,我将杀死 C-6 到 C

  • 问题内容: 我在oracle上有Tester表,其中包含以下各列: TesterID TesterName IsDefault Application_ID TesterID是主键。现在,我希望只能有一个默认测试器,这意味着只有一个测试器可以在ApplicationID上具有IsDefault = Y的提示。 我尝试了一个约束: 是否可以在isdefault = Y的位置上设置唯一键? 感谢帮助!

  • 如果某些数组索引不能配对,我将如何找到唯一正整数数组的最大和? 例如,我们有一个数组:[8,2,1,3,9,4] 索引(0,4)和(4,5)处的元素彼此不喜欢。 在这种情况下,最大和为:8 2 1 3 4=18 假设这是100个条目的规模和多达一半的约束,您将如何处理这个问题? 是否有一个像图形这样的数据结构是有用的还是有一些DP?我主要关心的是高效的运行时。