我需要找到2d地图上多个点之间的最佳路径。 2d地图属于建筑物,只有你不能去的地方(通过墙壁)和地图上的所有点。所以它并不是一张真正的地图,而是一些你无法通过分数传递的线条。
我很想知道在哪里寻找有障碍的旅行商问题。甚至更好,做完了它的库。
更新示例
在我的例子中,我们有一个办公室。现在我没有想到每一个细节,所以这只是一个例子。
再次抱歉只是头脑风暴的想法,但我从来没有做过这样的工作,并为任何指针感到高兴: - )
答案 0 :(得分:2)
让N
成为要访问的节点集(紫色点)。对于i
中的每个j
和N
,让c(i,j)
为从i
到j
的距离(或行程时间)。这些可以根据实际距离加上墙壁,门,其他障碍物等进行预先计算。
现在,如果从c(i,j)
到i
的路径通过一扇门,“烦人”的区域等,您可以向j
添加一个惩罚。但是更灵活的方式可能会如下:
让k = 1,...,K
成为各种不受欢迎的路线属性(门,恼人的区域等)。让a_k(i,j)
为从i
到j
的路径中每个属性的数量。 (例如,假设k=1
代表门,k=2
代表黄色区域,k=3
代表外部。然后从休息区的i
代表j
浴室可能有a_1(i,j) = 1
,而从i
到j
,黄色区域内的a_2(i,j) = 0.5
或2.0
或者该区域都会令人讨厌,等等。)
然后,让p_k
对每个不受欢迎的属性k
的单位进行惩罚 - 如果您不介意过多地通过门p_1 = 0.1
,可能p_2 = 3.0
如果你真的不喜欢黄色区域。
然后,让c'(i,j) = c(i,j) + sum{k=1,...,K} p_k * a_k(i,j)
。换句话说,用距离加上所有烦恼的罚款替换实际距离。用户可以在优化之前设置p_k
值,以便在这些中表达他/她的偏好。最终处罚p_k * a_k(i,j)
应该与c(i,j)
使用的距离单位相称 - 但是你不希望距离为100米但罚款为1,000,000。
现在解决距离为c'(i,j)
。
TSP要求您在同一节点上开始和结束,因此首选项实际上是一个约束。如果您要同时解决多个楼层,那么楼梯时间将在c(i,j)
,因此无需明确鼓励在楼梯附近终点的路线 - 无论如何,解决方案往往会这样做,因为楼梯很慢。如果您要独立解决每个楼层,那么只需将每个楼层的起始节点设置为等于楼梯。
我不会对红色(允许但未使用)区域做任何事情 - 这些区域已经被纳入c(i,j)
计算。
希望这有帮助。