当入口和出口指向不同的节点时,如何使用 boost::graph (大约)解决旅行商问题?

Posted

技术标签:

【中文标题】当入口和出口指向不同的节点时,如何使用 boost::graph (大约)解决旅行商问题?【英文标题】:How to use boost::graph to (approximately) solve the travelling salesman problem when entry and exit points to a node a different? 【发布时间】:2019-08-09 13:28:03 【问题描述】:

使用boost::metric_tsp_approx函数是否可以轻松解决TSP?

目前的形式metric_tsp_approx 解决了以下问题,即通过一组点找到一些近似最优的路径,接触每个点一次。

解决办法可能是

但是我有一个更有趣的变体想要解决

上面我在飞机上有一系列段。这些段需要使用 TSP 解决方案连接,但连接只允许在绿色侧进入并在红色侧退出。例如,一个解决方案可能是

黄线是解决方案。有没有可能构造一个 boost::graph 或者 metric_tsp_approx 可以解决的问题?

【问题讨论】:

恐怕不可能使用任何工具轻松解决 TSP - 它被认为是 NP 完全的(如果我没记错的话)。 不看细节,您的变体只是将无向图转换为有向图(其中一些边是双向的,但绿色边是一种方式)。这有帮助吗?这只是不对称的 tsp 变化。 @slava metric_tsp 是一种将 TSP 求解到最优值 2 倍以内的算法。这对我来说已经足够了。问题是是否可以重用这段代码,其中每个顶点都是一个段而不是一个点。 @KennyOstrom 不,这不太对。绿线在解决方案中是强制性的。 metric_tsp 的文档也说它只适用于无向图。我可能不走运:( 绿线的另一端必须有一个节点,否则这个问题没有意义。如果没有...添加一个。 TSP 仍然必须访问它们,您需要做的就是为有向图实现 TSP。至于这个特定的图书馆是否已经这样做了……对不起。但它看起来确实是一个可以研究的记录问题。也许别人有它。 【参考方案1】:

我想我会将这些段视为节点。无需担心哪一边是入口/出口:您可以稍后装饰您的路径。

所以,制作一个以线段为顶点的图模型,使用当前算法找到近似最短的路径 Segment1, Segment..., SegmentN

您正在寻找的路径可以简单地扩展为:

 entrypoint(Segment1), exitpoint(Segment1),
  ..., ...
  entrypoint(SegmentN), exitpoint(SegmentN) 

【讨论】:

我会提到这个图必须是无向的(因为从段 1 的出口到段 2 的入口通常不会与从段 2 的出口到段 1 的入口相同) .这已经回答了是否可以应用 boost::metric_tsp_approx 的问题(不,因为它需要一个无向图)。 我认为我们真的了解得不够多。也许 OP 可以将图形转换为具有适当权重的无向线段图(根据他的描述,对我来说似乎是这样)。 访问段的顺序很重要。如果您在 1D 中有从 0.5 到 1.5 和从 1.5 到 2.5 的两个线段 A 和 B,则线段作为顶点图从 A 到 B 的成本为 0,从 B 到 A 的成本为 2。我不明白你是如何转换的将其转换为无向图(同时保持访问每个节点一次的要求)。我的意思是,我无法证明 boost::metric_tsp_approx 没有任何转换可以解决这个问题,但可能性看起来很糟糕。 @MaxLanghof 你可能是对的。我错过了算法假设边权重“服从三角形不等式”的那部分——这确实以我没有包含在我的假设中的方式来约束图形 (我忽略了“度量”部分,基本上我假设图像是算法图形渲染,没有几何相关性。如果几何距离领先,你是对的,这种方法不'不工作)。

以上是关于当入口和出口指向不同的节点时,如何使用 boost::graph (大约)解决旅行商问题?的主要内容,如果未能解决你的问题,请参考以下文章

使用多线程在 Java 中模拟停车场中的多个入口和出口

C语言中函数是如何存储的

webpack小结

webpack 入门入口(entry)出口(output

vue-cli配置多入口多出口,实现一个项目两个访问地址,区分不同上线环境

课下实践——实现Mypwd