使用IDDFS创建路径数组

时间:2012-06-03 17:23:10

标签: algorithm path-finding

我的IDDFS算法使用邻接矩阵找到我的图的最短路径。 它显示了解决方案的深度(我知道这是从起点到终点连接在一起的点数) 我想在阵列中得到这些点。

例如:
假设解决方案在深度5中找到,所以我希望得到带有点的数组:{0,2,3,4,6}。
深度3:数组{1,2,3}。

这是C ++中的算法:
(我不确定该算法是否“知道”在搜索时是否再次访问过访问的点 - 我几乎是图初学者)

int DLS(int node, int goal, int depth,int adj[9][9])
{
    int i,x;

    if ( depth >= 0 )
    {
        if ( node == goal )
            return node;

        for(i=0;i<nodes;i++)
        {
            if(adj[node][i] == 1)
            {
                child = i;
                x = DLS(child, goal, depth-1,adj);

                if(x == goal)
                    return goal;
            }
        }
    }
    return 0;
}

int IDDFS(int root,int goal,int adj[9][9])
{
    depth = 0;
    solution = 0;
    while(solution <= 0 && depth < nodes)
    {
        solution = DLS(root, goal, depth,adj);
        depth++;
    }
    if(depth  == nodes)
        return inf;

    return depth-1;
}

int main()
{
    int i,u,v,source,goal;

int adj[9][9] = {{0,1,0,1,0,0,0,0,0},
       {1,0,1,0,1,0,0,0,0},
       {0,1,0,0,0,1,0,0,0},
       {1,0,0,0,1,0,1,0,0},
       {0,1,0,1,0,1,0,1,0},
       {0,0,1,0,1,0,0,0,1},
       {0,0,0,1,0,0,0,1,0},
       {0,0,0,0,1,0,1,0,1},
       {0,0,0,0,0,1,0,1,0}
    };

    nodes=9;
    edges=12;

    source=0;
    goal=8;

    depth = IDDFS(source,goal,adj);

    if(depth == inf)printf("No solution Exist\n");
    else printf("Solution Found in depth limit ( %d ).\n",depth);

    system("PAUSE");
    return 0;
}

我使用IDDFS而不是其他路径查找算法的原因是我想将深度更改为指定的数字以搜索精确长度的路径(但我不确定这是否可行)。


如果有人建议使用邻接矩阵查找指定长度路径的其他算法,请告诉我。

1 个答案:

答案 0 :(得分:1)

从路径寻找算法中获取实际路径的想法是使用map:V->V使得键是顶点,并且值是用于发现键的顶点(源不是key,或者是具有null值的键,因为它不是从任何顶点发现的。)

路径查找算法会在运行时修改此地图,当它完成时 - 您可以通过迭代地从表中读取 - 从目标开始 - 一直到源 - 来获取路径 - 然后您就可以获得路径按相反的顺序。

DFS中:每次发现新顶点((key,value))时都会插入key对。请注意,如果key已经是地图中的关键字 - 您应该跳过此分支。
一旦你完成了探索某个路径并“关闭”一个顶点,你需要将它从列表中删除,但是 - 有时你可以优化算法并跳过这部分(它会使分支因子更小)。

由于IDDFS实际上是迭代地进行DFS,因此您可以遵循相同的逻辑,每次进行新的DFS迭代时 - 对于更高的深度,您只需清除旧地图,然后从头开始新的地图。 / p>

其他寻路算法包括BFSA*dijkstra's algorithm。请注意,最后2个也适用于加权图。当达到某个深度时,所有这些都可以终止,就像在IDDFS中达到某个深度时终止DFS一样。