网格中的最佳路径
Best path in a grid
我有一个最佳路径问题要解决。给定一个包含可行走和不可行走砖块的nxn网格,我必须通过最短路径从a点到达B点。诀窍在于一些可行走的贴图包含点数。要成为一个有效的解决方案,当我达到目标时,我必须有一定数量的点。这些贴图上有不同数量的点(或者没有点),我需要最短的路径来到达目标,但也需要在路上收集至少M个点。
我所尝试的是A*算法,它找到2点之间的最短路径,并试图自定义它,使其不仅在达到目标时具有停止条件,而且还具有必要的点。它不能像我设置的那样工作,因为我阻塞了路径。
如果你有任何建议如何处理这个问题或另一个算法,将更适合我感激的帮助。谢谢。
如果你仍然被这个问题困住了,因为其他的答案/评论只能给你一个部分的答案——这里有一个问题空间的裂缝。
实际上可以使用A*进行一些修改来捕获(大多数)无序的M点路径。您唯一需要更改的是启发式和终止标准。
首先你需要改变你的启发式来考虑经过M个点的路径。启发式必须是可接受的和一致的,所以它必须等于一个小于或等于真实路径成本的值,并且它只能随着你接近目标而减少(必须是单调递增的)。
你可以把你现在要走的路径想象成你必须完成的M个子路径,每个子路径都是一条正常路径。因此,对于单点图(只有一个终止空间),您可以使用像欧几里得距离这样的标准启发式。这是一个贪婪的估计,表明直线路径是最优的,在理想情况下你不能做得更好(这是可以接受的)。
对于多于一条路径,贪婪方法类似地说,点之间没有阻塞的直线路径是你能走的最快的路径。它仍然是一个一致的启发式因为你不可能走得更远而仍然得到更好的分数。困难的部分是在没有障碍的情况下选择M个点的哪个顺序是最快的,以保持可接受的启发式。你可以在一个图中找到M个点的最优选择,其中所有的贴图都是可行走的宽度首先搜索从当前贴图到M个点的欧几里德距离,到剩下的M-1个点的欧几里德距离,……到终点广场。这个操作是昂贵的,因为你需要对你到达的每个方块都做这个操作——但是你可以使用动态规划或搜索缓存将所需的平摊计算降低到每一步0 (M)。
现在,一旦你有了M条无障碍物时最快的点路径,你就可以使用路径上每个点与你当前位置之间的欧几里得距离作为启发式。这是一个贪婪的移动估计,所以它总是可以接受的(你不能超过估计的成本),它是一致的,因为你不能离开下一个贪婪的最优点并减少你的成本,因为从当前贴图中选择一个不同的贪婪点是不允许的。
最后,您的终止条件需要更改为到达M个点,其中最后一个点是终止贴图。这模拟了遍历M个图,而不需要构造M!可能要走的图。提供的启发式将让A*在不改变底层算法的情况下实现它的魔力,并且在保持对通用网格上启发式的所需约束的同时,应该尽可能有效。
你可以添加图层到你的图形,当你在层的深度X
->你已经收集了至少X
点。从上层添加适当的边缘到+N
层,其中N
是当前tile的点数。
你的图是无限的,但你可以动态地添加层数顶点句柄,当遍历一些边。当它是无穷大时,你无法判断终点是否可达,但你可以检查基本图上的路径是否存在,以及是否至少有一个点。
你应该在>M
关卡完成。
如果你需要一些澄清,问=)
编辑
正如@Pyrce所说,如果您计划使用A* http://en.wikipedia.org/wiki/Consistent_heuristic
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 如何将更多文件夹添加到c++include路径
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- 在c代码之间共享数据的最佳方式
- 为Catch2中的外部文本文件指定路径的最佳方式
- 获取 exe 文件夹路径的最佳方法?
- 我该如何判断k-server动态解决方案的最佳路径以数组成本[i] [j] [k] [t]位于何处
- 保存使用递归回溯找到的最佳路径
- 确定两个文件路径引用同一文件对象的最佳方法是什么
- 存储库的路径.需要最佳实践
- 标题包含C++库中的路径-最佳实践
- 什么是适用于多个入口和多个出口的类似BFS的最佳路径算法
- 如何完善Dijkstra算法,而不是找到最佳路径
- 点 c++ 列表中的最佳路径
- 组织一个C++游戏的最佳方式是什么?该游戏涉及用户在路径之间进行选择,以便在旅程中前进
- 使用Dijkstra算法找到最佳路径的不可预测的结果
- 网格中的最佳路径
- 将filesystem::path元素附加到另一个路径的最佳方法是什么?