【问题标题】:algorithm to use to find closest object on tile map用于在平铺地图上查找最近对象的算法
【发布时间】:2015-10-15 23:11:17
【问题描述】:

我有一个游戏地图表示为瓷砖地图。目前地图上存在两种类型的对象,与此问题相关:可收集资源(树木、岩石等)和玩家建造的建筑物。建筑物也通过道路连接。

我在找出可以执行以下操作的有效算法时遇到问题:

  • 找到离任何相关建筑最近的资源(即找到离伐木工人/树木采集者最近的树)
  • 找到离任何建筑最近的相关建筑(即找到离任何锯木厂最近的仓库)

我把这两个问题分开了,因为第一个不需要需要道路,而第二个应该使用道路。

因此,结果应该是指向单个对象的单个路径,即最接近我从中找出的路径。然后,工人使用该路径来收集资源并将其带回,或者比方说,从锯木厂挑选资源并将其带到最近的仓库。

我知道如何获得最近的路径本身(A*、Djikstra 甚至 Floyd-Warshall),但我不确定如何以最佳方式处理这些路径的倍数并获得最佳/最近的路径,特别是如果它正在运行将非常定期地运行,并且地图对象集合(道路和建筑物)预计也会定期更改。

我在 Unity3D/c# 中执行此操作,但我想这并不是真正与 Unity3D 相关的问题。

我应该如何进行?

【问题讨论】:

    标签: c# algorithm path-finding closest


    【解决方案1】:

    查找两个对象之间的地理距离是一项成本低廉(快速)的操作 - 您可以在每个游戏刻执行这么多次。如果选项可用,请使用它。

    利用道路、轨道等地形特征寻找最短路径是一项复杂得多的操作。正如您在帖子中已经提到的,A* 搜索算法可能是您最好的选择,但它很慢。

    但一般情况下,您应该不需要太频繁地运行它 - 只需每 X 秒计算一次路径(对于 X 的某个值),然后让您的工作人员在接下来的几个游戏周期中花费计算路径,直到你“刷新”它。您拥有的精度越高,对游戏环境变化的响应能力越强(例如路径中出现的障碍物),您将使用的 CPU 时间就越多。

    尝试不同程度的精度,并找到一种精度不错,同时在 CPU 时间方面又不会太贵的方法。 (更新间隔完全取决于您预计要进行的调用次数。计算 100 个工作人员的路径显然比 1 个要困难得多。)

    【讨论】:

    • 你是对的。但是,一旦我确定哪个对象最接近,遵循(并更新)最终路径是一个不同的问题。找出最近的物体是问题所在。一名伐木工人可以接触到 100 多棵树,而找到与其中一棵树最近的路径非常容易。但是定期检查/更新所有这些列表并选择最接近/最短的列表,这就是我所追求的。
    • 假设您正在使用一组航路点(很可能是网格?),您可以从工人的位置开始并搜索任意树。没有必要搜索所有的树。一旦您的搜索找到一棵树,您就知道“最佳”路径不得长于该路径。因此,在搜索其他路线时,如果路线超出该上限,您可以立即放弃。
    • 我可能最终会使用某种分层寻路。首先,我必须将整个瓦片地图分割成更小的区域(比如说 8x8),并且保证单个区域内的所有瓦片可以相互访问。因此,最后,要获得最近的物体需要在区域级别上找到它,然后获得一条通往它的路径,仅限于它需要经过的区域。我相信执行此操作的算法之一是 HPA*。
    猜你喜欢
    • 2012-02-12
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 2012-03-23
    • 1970-01-01
    • 2019-04-02
    相关资源
    最近更新 更多