【问题标题】:Finding the most natural route between two points on a grid在网格上的两点之间寻找最自然的路线
【发布时间】:2016-11-13 21:59:15
【问题描述】:

假设我有一个字节数组,我如何找到两点之间最自然的路线(人类可能会采取的路线),每个位代表一个固定大小的正方形并指示它是否可访问?例如,假设数组表示如下网格:

在灰色方块不能穿过的地方,我需要一种算法来找到橙色方块指示的路径,而不是棕色方块表示的路径。

请注意,虽然橙色路径也是最短的,但这只是一个奖励,而不是要求。我只需要找到方向变化最小的路径(在长度和变化之间取得良好的平衡)。此外,该算法必须不需要大量内存,因为它可以在嵌入式芯片上运行。

编辑: 正如 Rudy Velthuis 所指出的,我没有准确解释我所说的“自然”是什么意思。自然,我的意思是一条不太长的路径,只需要用户改变几次方向。

【问题讨论】:

  • @AndersCedronius 这难道不是最高效的路线吗?
  • 请把“最自然的路线(人类可能采取的路线)”定义好一点。
  • @RandomUser (Dijkstra)取决于您用于算法的标准 - “费用”由其实现方式定义。
  • @RudyVelthuis 我已经有了:“方向变化最小的路径”

标签: c algorithm performance artificial-intelligence


【解决方案1】:

A* 是要走的路,但您应该考虑到它需要一些技巧来生成“自然”路径。

由于您的地图允许对角线移动,因此启发式可能类似于:

/* "Octile" heuristic */
int h(node n)
{
  int dx = abs(n.x - goal.x);
  int dy = abs(n.y - goal.y);

  if (dx > dy)
    return 14 * dy + 10 * (dx - dy);
  else
    return 14 * dx + 10 * (dy - dx);
}

即使使用这种启发式方法,您也会遇到平局:SW、SW、SW、W、W、W 的成本与 SW、W、SW、W、SW、W 相同(看起来更好)。

有一些快速的技巧可以解决这个问题(打破平局)。

它们在Amit's page 中进行了描述(其中包含大量信息和wonderful introduction to A*)。

【讨论】:

    【解决方案2】:

    构建一个图,其中每个方向变化都是一条边。

    每个单元格表示为 8 个顶点。垂直、水平和对角边缘是免费的(成本 0)。其他的成本不为零(或 45、90 和 135 度转弯的不同成本,如果您想要更陡峭的转弯成本更高)。以自然方式连接相邻小区(N 到 S、W 到 E、SW 到 NE 等)。也为这些边缘分配一些成本(或垂直/水平和对角边缘的不同成本,取决于您如何定义“路径长度”)。

    然后在图表上使用 A*。通过改变成本,您可以调整“好看”和“矮”之间的平衡。

    【讨论】:

      【解决方案3】:

      我认为您正在寻找 A* 寻路。虽然它会产生找到最短路径的副作用,但它也会看起来很自然。长期以来,它一直是电子游戏的黄金标准。

      这里有一篇关于算法的文章。注意:您必须稍微修改它以允许对角线移动。

      https://www.raywenderlich.com/4946/introduction-to-a-pathfinding

      【讨论】:

        猜你喜欢
        • 2018-09-18
        • 1970-01-01
        • 1970-01-01
        • 2011-01-27
        • 1970-01-01
        • 2016-07-22
        • 1970-01-01
        • 2012-08-13
        • 1970-01-01
        相关资源
        最近更新 更多