我有一个游戏地图,表示为瓷砖地图。目前,地图上存在两种类型的对象,与此问题相关:可收集的资源(树木,岩石等)以及玩家建造的建筑物。建筑物也通过道路连接。算法用于在瓷砖地图上查找最接近的对象
我必须搞清楚一个高效的算法有问题,可以做到以下几点:
- 找到最近的资源,任何相关的建筑物(即找到最近的树的樵夫/树采集)
- 找到最接近的相关建设任何建筑(即找到最近的存储任何锯木厂)
我分开这两个问题,因为第一个不需要道路,但是第二一个应该是只有使用道路。
所以,这应该是一个单一的路径到一个单一的对象,这是最接近我从中找出它。然后,路径被工人用来收集资源并将其带回,或者说,从锯木厂选取资源并将其带到最近的存储区。
我知道如何获得最接近的路径本身(A *,Djikstra甚至是Floyd-Warshall),但我不确定如何以最佳方式处理这些路径的倍数并获得最佳/最接近的路径,特别是如果它是将定期运行,地图对象集合(道路和建筑物)预计也会定期更新。
我在Unity3D/c#中这样做,但我想这不是Unity3D相关的问题。
我该如何继续?
你说得对。但是,一旦找出最接近的对象,追踪(并更新)最终路径是一个不同的问题。找出最接近的对象是问题。一个伐木工人可以访问100多棵树,并找到一个最近的路径,其中一个很容易。但是定期检查/更新所有人的列表并挑选最近/最短的人是我所追求的。 – EwanK
假设您正在使用一组航点(网格,很可能?),您可以从工作人员的位置开始搜索任意树。没有必要搜索所有的树木。 一旦您的搜索找到了一棵树,就知道“最佳”路径不能超过该路径。因此,当搜索其他路线时,如果路线超过上限,您可以立即放弃路线。 –
我可能最终会使用某种分层次的路径查找。首先,我必须将整个tilemap分割成更小的区域(比如说8x8),并且单个区域内的所有图块都可以保证可以互相访问。因此,最终获得最接近的对象需要在地区级别找到它,然后找到一条路径,并限制在需要经过的地区。我相信这样做的算法之一是HPA *。 – EwanK