【发布时间】:2014-12-05 18:47:30
【问题描述】:
我正在开发一个用电线连接物体的软件。这种布线有一条规则,即这些电线不能穿过其他物体,并且不接受对角线移动。
我知道的所有最短路径算法(A*、dijkstra 等)都可以找到这种类型的路径:
我不想在第二个屏幕截图中出现不必要的曲折。我如何实现这个目标?
注意:任何想尝试算法的人都可以使用this 应用程序。
另一个注意事项:这是我不想要的确切情况。它找到的是之字形路径,而不是“向右直到到达目标的 x 位置,向上直到到达目标的 y 位置”的路径,这与之字形路径的成本相同。
【问题讨论】:
-
我知道 A* 将始终找到那些锯齿形图案,因为它使用了启发式方法,但解决此问题的一种方法是将启发式方法设置为有利于水平/垂直运动而不是对角线运动。我还没有看到你的算法,但它应该不难实现。这也适用于 Dijkstra,因为两种算法的工作方式几乎相同。
-
您可以使用 L1 (abs[x + y]) 而不是 L2 (sqrt[x² + y²]) 距离作为启发式方法来避免这种情况。如果你不能斜着走,那无论如何这是一个更好的启发式方法。但这只是一个 hack,它是否有效也取决于节点从队列中弹出的顺序。
-
@larsmans 我已经在我的实现中尝试过这种启发式方法。但没有运气,它不起作用。
-
您是否考虑过在方向变化时增加额外成本(如果 dx 或 dy 发生变化,则向 pathLength 添加 1(或更少)),因此它会发现只有 1 个方向变化而不是当前找到的 8 个路径。
-
A* 可以更改,因此额外转动比仅移动更昂贵。为此,您还需要添加从 (N,S,W,E) 填充单元格的方向,因此对于直线移动,成本可以是例如每个单元格 1 个,对于转弯移动(改变方向/zig/ zag) 是 2。这种方式 zig zag 路径将被认为是更长的 den 笔直路径......(呵呵,jast 看到之前的评论有相同的建议......抱歉重复)
标签: algorithm shortest-path path-finding