带有墙壁(障碍物)的 2d 地图上的旅行推销员概率,因此需要寻路

Traveling salesman prob on 2d map with walls (obstacles) so pathfinding needed

我需要在二维地图上的多个点之间找到最佳路径。 2d 地图是建筑物的,只会有你不能去的地方(穿过墙壁)和地图上的所有点。所以它不是真正的地图,而是你不能通过的线和要通过的点。

我很想知道在哪里寻找这个有障碍的旅行商问题的提示。或者更好的是,done library for doing it.

奖金


更新示例

在我这里的例子中,我们有一个办公室。现在我还没有考虑到每一个细节,所以这只是一个例子。

再次抱歉只是集思广益,但我从未做过这种工作,很高兴收到任何指示:-)

N为要访问的节点集(紫色点)。对于 N 中的每个 ij,令 c(i,j) 为从 ij 的距离(或旅行时间)。这些可以根据实际距离加上墙壁、门、其他障碍物等预先计算。

现在,如果从 ij 的路径穿过门、"annoying" 区域等,则可以对 c(i,j) 添加惩罚。但是更灵活的方式可能如下:

k = 1,...,K 成为各种类型的不良路线属性(门、烦人的区域等)。令 a_k(i,j) 为从 ij 的路径上每个属性的数量。 (例如,假设k=1代表门,k=2代表黄色区域,k=3代表外面。那么从休息区的i到休息区的j浴室可能有​​ a_1(i,j) = 1,从 ij 两个黄色区域都有 a_2(i,j) = 0.52.0 或者不管那个区域有多烦人,等等.)

然后,让 p_k 成为对每个单位不良属性的惩罚 k -- 如果你不介意穿过门太多,也许 p_1 = 0.1p_2 = 3.0 如果你真的不喜欢黄色区域。

然后,让c'(i,j) = c(i,j) + sum{k=1,...,K} p_k * a_k(i,j)。换句话说,用距离加上对所有烦恼的惩罚来代替实际距离。用户可以在优化前设置 p_k 值,以表达其中的 his/her 偏好。最终的惩罚 p_k * a_k(i,j) 应该与用于 c(i,j) 的距离单位相称,但是——你不想要 100 米的距离,而是 1,000,000 的惩罚。

现在用 c'(i,j) 给定的距离求解 TSP。

TSP 要求您在同一节点开始和结束,因此偏好确实是一种约束。如果您要同时解决多个楼层的问题,那么楼梯时间将在 c(i,j) 内,因此无需明确鼓励在楼梯附近结束的路线——无论如何解决方案都会这样做,因为楼梯很慢。如果您要独立解决每个楼层,则只需将每个楼层的起始节点设置为等于楼梯即可。 我不会对红色(允许但未使用)区域做任何事情——它们已经被纳入 c(i,j) 计算中。

希望这对您有所帮助。