旅行推销员探索2d地图与墙壁(障碍物)所以寻路需要

时间:2015-02-08 18:18:06

标签: c# .net path-finding traveling-salesman

我需要找到2d地图上多个点之间的最佳路径。 2d地图属于建筑物,只有你不能去的地方(通过墙壁)和地图上的所有点。所以它并不是一张真正的地图,而是一些你无法通过分数传递的线条。

  • 我有很多要点,比如20到500
  • 我从我选择的那个开始,然后需要为最佳路径计算的路线。

我很想知道在哪里寻找有障碍的旅行商问题。甚至更好,做完了它的库。

奖金

  • 像门这样的东西可以加权,因为它们不经常来回传递。
  • 确定优先次序的可能性/权衡接近您开始的地方的能力。
  • 选择区域可通过但烦人(加权)
  • 我可以使用
  • .Net / C#代码,我想在.NET MVC项目和Xamarin移动项目中使用它。所以.net代码会很棒(如果代码存在)

更新示例

enter image description here 在我的例子中,我们有一个办公室。现在我没有想到每一个细节,所以这只是一个例子。

  • 需要检查所有紫色点
  • 黄色区域可能意味着要通过但可行的
  • 红色可能意味着不活跃,但如果不存在其他选项则可以通过。
  • 蓝色(墙壁)难以穿透,无法通过。
  • 绿色是门,可能因为通过关闭门而烦恼(通常这可能是有意义的,因为房间里的点最容易一起检查。
  • 用户会去一个点,检查一下,然后软件会告诉他下一个要做的事情,直到他完成。
  • 奖励可以在接近开始的地方结束。因此,例如在这个例子中,如果红色区域是正常的并且包含点,那么很容易使它成为一个循环。 (所以用户回到他开始的地方)
  • 最后,我认为区分户外区域也很聪明,因为你需要穿着户外穿着,所以你只想出去一次。
  • 如果他们打算一次检查多个楼层,那么能够优先确定靠近楼梯间到下一楼的点的结束可能是明智的。
  • 当然,这个例子会有更复杂和更大的计划。

再次抱歉只是头脑风暴的想法,但我从来没有做过这样的工作,并为任何指针感到高兴: - )

1 个答案:

答案 0 :(得分:2)

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

现在,如果从c(i,j)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.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

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

希望这有帮助。