如何在BFS search~Java中限制队列大小

时间:2016-04-03 21:04:49

标签: java breadth-first-search

这是我的BFS搜索方法:

   private void doBfs(HiRiQ node, ArrayList<HiRiQ> queue, ArrayList<HiRiQ> path, ArrayList<HiRiQ> visited) {


        while(!queue.isEmpty()){

          HiRiQ current = queue.remove(0);


          if(current.IsSolved()){
            current.print();
            System.out.println("Path found !");

            return;

          } else {

            if(current.getAllNextStates().isEmpty()){ return; } 

            else {


              if(queue.contains(current)){ continue; }

              else if (visited.contains(current)){ continue; }


              else{ queue.addAll(current.getAllNextStates()); } 



            } 
                visited.add(current);
          }
        }
      }

该算法假定从peg-solitaire puzzle配置开始,并检查所有邻居配置,直到找到已解决的配置。它似乎可以工作,但对于任何配置,运行和找到解决方案需要很长时间。

优化此搜索算法的一种方法是限制队列大小,因为在某一点之后我将花费大部分时间在队列中放置更多节点,而实际处理节点的时间非常少。所以在某些时候我应该停止填写队列,然后检查我的队列中是否有等待解决方案。

我怎么可能实现这个目标?谢谢

1 个答案:

答案 0 :(得分:0)

我建议您使用iterative deepening depth-first search。它是在内存是一个大问题时设计的,基于BFS的天真解决方案可能会轻易占用所有可用的RAM。但它可以实现您想要达到的目标,限制队列大小,保证找到最短路径解决方案,如果分支因子很高,它比BFS更快。

提高解决方案性能的另一种方法是找到解决难题的良好启发式方法。一旦你有了可以编码的启发式,你就可以试试A* algorithm