Java 深度优先搜索随机选择节点/顶点

Java 深度优先搜索随机选择节点/顶点,java,stack,graph-algorithm,depth-first-search,Java,Stack,Graph Algorithm,Depth First Search,我想使用图中所示的迷宫,使用迭代深度优先搜索从开始节点找到目标的路径。它是一个只包含一对数字的文本文件,如成对连接a.k.a边/弧。像这样: 11 3 2 3 0 3 1 4 5 4 5 7 6 7 7 8 8 9 9 10 0 5 那么我的代码是这样的: private void performIterativeDFS(MazeGraph G, int node, int goal) { ArrayBasedStack arrayStack = new ArrayBasedS

我想使用图中所示的迷宫,使用迭代深度优先搜索从开始节点找到目标的路径。它是一个只包含一对数字的文本文件,如成对连接a.k.a边/弧。像这样:

11 3
2 3
0 3
1 4
5 4
5 7
6 7
7 8
8 9
9 10
0 5
那么我的代码是这样的:

private void performIterativeDFS(MazeGraph G, int node, int goal) {
        ArrayBasedStack arrayStack = new ArrayBasedStack();
        ArrayBasedStack pathStack = new ArrayBasedStack();
        arrayStack.push(node);
        visited[node] = true;
        while (!arrayStack.isEmpty()) {
            int newNode = arrayStack.pop();
            if (newNode == 0) {
                out.print("Starting at " + newNode + " ");
            }
            pathStack.push(newNode);
            if (newNode == goal) {
                out.println("Path if goal found: " + pathStack.toString());
            }
            for (int arc : G.getAdjacencyList(newNode)) {
                if (!visited[arc]) {
                    visited[arc] = true;
                    arrayStack.push(arc);
                }
            }
        }
    }
我将输入0作为起始节点,目标节点为1。那么输出的路径是0,5,7,8,9,10,6,4,1。不幸的是,这不是一个合适的解决方案,可以改为0,5,4,1。迭代深度优先搜索是否会在到达目标之前随机选择下一个节点


我试图修改我的代码来做到这一点,但我无法使路径像0,5,4,1那样打印。我想让它尽可能简单,让每个人都能理解。有任何建议或建议吗?

如果不更改算法(这不会使其成为dfs)或(如果您尝试将其用于除此特定数据集之外的任何内容,这将是浪费时间的映射),您将无法从搜索中获得不同的答案。您可以在代码找到一条路径后尝试实现某种回溯,以减少遍历的节点数,但这不是您想要的简单答案

简短回答:不,DFS不是这样工作的

编辑:漏掉了一点你的问题,你的代码中没有任何东西是随机的。如果,而不是

for (int arc : G.getAdjacencyList(newNode)) {
            if (!visited[arc]) {
                visited[arc] = true;
                arrayStack.push(arc);
            }

随机抽样G,则有可能得到不同的结果,但实际上并没有随机元素。

若不更改算法(不会使其成为dfs)或(映射,如果您试图将其用于除此特定数据集之外的任何内容,这将是浪费时间的)。您可以在代码找到一条路径后尝试实现某种回溯,以减少遍历的节点数,但这不是您要寻找的简单答案

简短回答:不,DFS不是这样工作的

编辑:漏掉了一点你的问题,你的代码中没有使它随机的东西。如果,而不是

for (int arc : G.getAdjacencyList(newNode)) {
            if (!visited[arc]) {
                visited[arc] = true;
                arrayStack.push(arc);
            }


你们随机抽取G,那个么你们将有机会得到不同的结果,但它并没有随机元素。

你们不使用dfs来寻找最短路径。使用bfs代替那个些不知道的人,bfs代表广度优先搜索。我也有广度优先搜索,这对我来说很好。我只是想知道是否有其他的方法r仅使用深度优先搜索的方法。你在寻找最短路径吗?基本上,是的。这不是最理想的方法吗?广度优先搜索是寻找最短路径的最佳方法。你不使用dfs来寻找最短路径。使用bfs代替那些不知道的人,bfs代表广度优先搜索。我也有广度优先,这是对我来说很好。我只是想知道是否有其他方法只使用深度优先搜索。你在寻找最短路径吗?基本上,是的。这不是最理想的方法吗?广度优先搜索是找到最短路径的最佳方法。所以基本上用dfs找到最短路径不是最佳解决方案?是这样吗?基本上。如果你在寻找结果时,您需要像a*这样的最佳优先算法,但如果您专注于“使用DFS”你的问题的一部分是,没有一种方法可以在不降低效率的情况下获得一致的性能,这是有意义的。谢谢。我的代码中没有任何东西使它随机?所以问题是在我的迭代算法中,还是我应该做递归?这就是你的意思吗?不,我只是在回答你关于dfs是否随机的问题r不是。您在文件上使用了for循环,因此它根据文件顺序选择下一个分支。因此基本上,使用dfs查找最短路径不是最佳解决方案?是吗?基本上。如果您正在查找结果,您需要像a*这样的最佳优先算法,但如果您专注于“使用dfs”你的问题的一部分是,没有一种方法可以在不降低效率的情况下获得一致的性能,这是有意义的。谢谢。我的代码中没有任何东西使它随机?所以问题是在我的迭代算法中,还是我应该做递归?这就是你的意思吗?不,我只是在回答你关于dfs是否随机的问题r不是。您在文件上使用了for循环,因此它根据文件顺序选择下一个分支