[英]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.