我正在使用 CP-SAT 求解 TSP,如 https://github.com/google/or-tools/blob/master/examples/python/tsp_sat.py 所示,但我有一些限制,但我没有能够制定:
我不确定如何获取特定节点的时间点来检查这些约束,因为决策变量仅说明从节点 i 到节点 j 的访问。
我尝试实现带有时间戳的 CP-SAT TSP 问题,如 https://github.com/google/or-tools/issues/590,但它的性能不佳(42 个节点约为 2 小时,但我在我的实际示例中必须服务约 150 个节点)。
我认为在您的情况下,运行时间的增加可能是可以预料的——因为您有额外的排序限制,所以与 Google OR 示例相比,您的问题要困难得多。
您最初的问题可以说是 2D - 它只涉及城市之间的距离和连接,而您的问题是 3D - 您有额外的及时订购要求。
此链接准确定义了一个 3D 问题 - 连接加上
t
表示时间。如果您希望代理在特定时间访问特定城市,则需要额外的约束:
stops = [10, 15, ...]
for i in range(0, num_cities):
t = stops[i]
solver.Add(solver.Sum(x[i,j,t] for j in range(0, num_cities)) == 1)
基本上,它告诉我们必须选择城市
i
的入站弧线之一,因此,我们强制在该特定时间戳访问该城市 i
。
我只知道改善此类问题运行时间的几种方法:
A
,则永远不会到达城市 B
(不幸)幸运的是,此类问题涉及大量专业知识、运气和直觉,通常更多的是关于艺术而不是科学。