【问题标题】:Questions about Iterative Deepening Depth First search in javajava中关于迭代加深深度优先搜索的问题
【发布时间】:2013-04-07 00:37:29
【问题描述】:

我正在查看 Wikipedia 上的伪代码,并尝试使用它在 java 中编写算法。我的问题在于返回结果的方式有所不同。在维基百科上,返回一个结果,这超出了搜索范围。在我的情况下,每次找到相关节点时,都会将其添加到列表中,并且在处理完树后返回该列表。我将如何检测树的末端以打破并返回列表?

维基百科:

IDDFS(root, goal)
{
  depth = 0
  repeat
  {
    result = DLS(root, goal, depth)
    if (result is a solution)
      return result
    depth = depth + 1
  }
}

DLS(node, goal, depth) 
{
  if (depth == 0 and node == goal)
    return node
  else if (depth > 0)
    for each child in expand(node)
      DLS(child, goal, depth-1)
  else
    return null
}

我的:

    public List<String> dfid(Tree t, String goal)
    {
        List<String> results = new ArrayList<String>();
        String result;

        int depth = 0;
        while (true) //obviously not the way to go here
        {
            result = dls(t.root, goal, depth);
            if (result.contains(goal))
                results.add(result);
            depth += 1;
        }
        return results; //unreachable return
    }

    public String dls(Node node, String goal, int depth)
    {
        if (depth == 0 && node.data.contains(goal))
        {
            return node.data;
        }
        else if (depth > 0)
        {
            for(Node child : node.children)
            {
                dls(child, goal, depth-1);
            }
        }
        return null;
    }

编辑:修改后:

//depth first iterative deepening
        //control variables for these methods
        boolean maxDepth = false;
    List<String> results = new ArrayList<String>();

    public List<String> dfid(Tree t, String goal)
    {
        int depth = 0;

        while (!maxDepth)
        {
            maxDepth = true;
            dls(t.root, goal, depth);
            depth += 1;
        }
        return results;
    }

    public void dls(Node node, String goal, int depth)
    {
        if (depth == 0 && node.data.contains(goal))
        {
            //set maxDepth to false if the node has children
            maxDepth = maxDepth && children.isEmpty();
            results.add(node.data);
        }
        for(Node child : node.children)
        {
            dls(child, goal, depth-1);
        }
    }

【问题讨论】:

    标签: java search tree iterative-deepening


    【解决方案1】:

    我认为您可以使用 boolean maxDepth = false 实例变量来完成此操作。在 while 循环的每次迭代中,如果 maxDepth == true 则退出,否则设置 maxDepth = true。在dls 中,当您到达depth == 0 时设置maxDepth = maxDepth &amp;&amp; children.isEmpty(),即如果节点有任何子节点,则将maxDepth 设置为false。

    另外,将 dls 更改为 void 方法。将return node.data 替换为results.add(node.data),其中resultsArrayListHashSet,具体取决于您是否要过滤掉重复项。

    如果你总是想访问树中的每个节点,那么修改dls如下

    public void dls(ArrayList<String> results, Node node, String goal)
    {
        if (node.data.contains(goal))
        {
            results.add(node.data);
        }
        for(Node child : node.children)
        {
            dls(child, goal, depth-1);
        }
    }
    

    【讨论】:

    • 在结果的第一个实例中这仍然会中断吗?我希望在树中收集所有结果
    • 我误解了,请参阅我的编辑 - 将您的结果放入集合中而不是返回它们。
    • 嗯好的。所以基本上这个搜索在技术上不会返回任何东西,它只会在其他地方填充一组数据
    • 没错。您可以将结果集合作为实例变量,也可以将其作为另一个参数传递给dls
    • 这样操作,还需要maxdepth吗?
    猜你喜欢
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多