一个特定的旅行推销员变体的实现
Implementation of a particular Travelling-Salesman variation
我正在寻找一种算法(C/c++/Java -没关系),这将解决一个问题,其中包括找到图的2个节点(a和B)之间的最短路径。问题是该路径必须访问特定的其他给定节点(城市)。一个城市可以被访问多次。路径示例(A- h - d - c - e -F-G-F B)(其中A为源,B为目的,F和G为必须访问的城市)
我认为这是旅行推销员问题的一个变体,但我无法找到或编写一个基于我的搜索的工作算法。
我试图找到一个解决方案,从这些主题开始,但没有任何运气:https://stackoverflow.com/questions/24856875/tsp-branch-and-bound-implementation-in-c和跨城市TSP变化
将问题简化为TSP:
- 对于每个"必须访问"的
(u,v)
,求它们之间的距离d(u,v)
。这可以有效地使用Floyd-Warshall算法来找到全到全的最短路径。 - 创建一个仅由这些节点组成的新图G',所有边都存在,距离根据(1)计算。
- 在约简图上运行标准TSP算法求解问题。
我认为除了amit的答案之外,您还需要将以A或B为端点的边的成本增加足够多(图的总成本+ 1可能就足够了),以确保您最终不会得到经过A或B的路径(而不是结束于A和B)。
A--10--X--0--B
| | |
| 10 |
| | |
+---0--Y--0--+
上述情况将导致从a到Y到B到X的路径,除非您将a和B边的成本增加21)。
A--31--X--21--B
| | |
| 10 |
| | |
+---21--Y--21-+
现在它从A到X再到Y再到B。同时确保你删除了所有的边缘(A,B)(如果它们存在的话)。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 动态规划中的旅行推销员问题
- 如何使用不完整的图表实施蛮力旅行推销员
- 旅行推销员启发式
- 面向旅行推销员的多片段启发式算法(C++)
- 一个特定的旅行推销员变体的实现