簡體   English   中英

如何在BFS搜索中限制隊列大小〜Java

[英]How can I limit the queue size in BFS search ~ Java

這是我的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);
          }
        }
      }

據推測,該算法從釘接龍拼圖配置開始,並檢查所有鄰居配置,直到找到已求解的配置。 它似乎可以工作,但是對於任何配置而言,運行和查找解決方案都需要很長時間。

優化此搜索算法的一種方法是限制隊列大小,因為在某個點之后,我將只花費大部分時間將更多的節點放入隊列中,而很少時間實際用於處理節點。 因此,在某個時候,我應該停止填寫隊列,而只是檢查您的隊列中是否有解決方案。

我怎么可能做到這一點? 謝謝

我建議您使用迭代加深深度優先搜索 它是在內存非常重要的情況下設計的,並且基於BFS的幼稚BFS解決方案可以輕松耗盡所有可用的RAM。 但這確實達到了您想要達到的目的,限制了隊列大小,為找到最短路徑解決方案提供了保證,並且如果分支因子很高,它的速度比BFS快。

改善解決方案性能的另一種方法是找到解決難題的啟發式方法。 一旦有了可以編寫的啟發式代碼,就可以嘗試使用A *算法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM