【问题标题】:Depth First Search Random Select Node/Vertex深度优先搜索随机选择节点/顶点
【发布时间】:2015-12-09 23:38:42
【问题描述】:

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

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 来查找最短路径。改用 bfs
  • 对于那些不知道的人,BFS 代表广度优先搜索
  • 我也有广度优先,这对我来说很好。我只是想知道是否有另一种仅使用深度优先搜索的方法。
  • 你在寻找最短路径吗?
  • 基本上,是的。这不是最适合的吗?广度优先搜索是找到最短路径的最佳方法。

标签: java stack graph-algorithm depth-first-search


【解决方案1】:

如果不更改您的算法(这不会使其成为 dfs)或(如果您试图为除此特定数据之外的任何内容制作它,那将是浪费时间的地图,您不会从搜索中得到不同的答案放)。在代码找到减少遍历节点数量的路径后,您可以尝试实现一种回溯,但这不是您要寻找的简单答案。

简短回答:不,这不是 DFS 的工作原理。

编辑:错过了您的一些问题,您的代码中没有任何内容可以使其随机化。如果,而不是

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

你随机抽样 G,那么你就有机会得到不同的结果,但因为它没有随机元素。

【讨论】:

  • 所以基本上用dfs找最短路径不是最优解?对吗?
  • 基本上。如果您正在寻找结果,您需要一个最佳的第一个算法,例如 A*,但如果您专注于问题的“使用 DFS”部分,那么就没有办法在不极度低效的情况下获得一致的性能
  • 这是有道理的。谢谢你。
  • 我的代码中没有任何东西使它随机?所以问题出在我的迭代算法中还是我应该做递归?这是你的意思吗?
  • 不,我只是在解决您关于 dfs 是否随机的问题。您在文件上使用了 for 循环,因此它根据文件顺序选择下一个分支
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多