寻找没有边缘的地图的路径算法

时间:2011-09-21 16:39:47

标签: c# c++ algorithm

我有2D世界地图,基本上是类似墨卡托的投影,(如果你向西走得足够长,你最终会向东开始)

问题我有:您是否可以使用A *来计算这些类型的地图上的路径?

我想不出你为什么不能这样做的原因(我认为你只是代表边缘地图节点,使得北,南,东,周三,“边界”节点简单地连接到对面侧)。

先谢谢,如果有人之前见过这样的东西,或者可以给我一些提示,我会很感激。

3 个答案:

答案 0 :(得分:4)

寻路算法并不真正关心地图的全局拓扑。唯一棘手的部分是为A *获得一个好的估算器,但如果你的地图确实是一个三维空间中的一个表面并且步长是步长,那么使用3D距离应该没问题。

你的地图可以有各种奇怪的“连接”(包括例如打结的桥梁),如果你正确实现A *,这不会有问题。

答案 1 :(得分:2)

我无法想象为什么类似墨卡托的投影会导致A *出现问题,只要你的启发式函数正确地近似距离。我认为下面的功能应该可以正常工作

float heuristic(point from, point to, size mapsize) {
    float x = from.x - to.x;
    if (abs(x) > mapsize.x/2)
        x = mapsize.x - x;
    float y = from.y - to.y;
    if (abs(y) > mapsize.y/2)
        y = mapsize.y - y;
    return sqrt(x*x+y*y);
}

答案 2 :(得分:1)

已编辑:我意识到我被非图形理论)误用了 edge 这个词(其中强烈的问题标题)提出了图算法问题:))

为什么你认为没有边缘?您可以建模许多逻辑离散位置,并且之间的连接有限(即不是墙在哪里:)。你走了:你有你的优势。

<击>

您可能意味着您不希望在数据中表示您的边缘(您不需要,但仍然存在连接位置/点的逻辑边缘。)

那说:

你问以前是否有人见过这样的事情。我模糊地回忆起在Knuths Dancing Links文章(DLX)中看到与此相关的内容,这是A *算法的一种实现技术。

该文章专门将州视为具有东/西/北/南链接的“单元格”(在网格中)。已经很长一段时间了,所以我不记得你将如何映射(没有双关语)你的算法问题。

  

舞步。实现算法X的一个好方法是表示算法X中的每一个   矩阵A作为具有五个字段L [x]的数据对象x; [R [X]; U [x]; d [X]; C [X]。矩阵的行   通过L和R字段(“左”和“右”)作为循环列表双重链接;列是   通过U和D字段(“向上”和“向下”)双重链接为循环列表。每一栏   list还包括一个名为list list的特殊数据对象。

enter image description here