这是我的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配置开始,并检查所有邻居配置,直到找到已解决的配置。它似乎可以工作,但对于任何配置,运行和找到解决方案需要很长时间。
优化此搜索算法的一种方法是限制队列大小,因为在某一点之后我将花费大部分时间在队列中放置更多节点,而实际处理节点的时间非常少。所以在某些时候我应该停止填写队列,然后检查我的队列中是否有等待解决方案。
我怎么可能实现这个目标?谢谢
答案 0 :(得分:0)
我建议您使用iterative deepening depth-first search。它是在内存是一个大问题时设计的,基于BFS的天真解决方案可能会轻易占用所有可用的RAM。但它可以实现您想要达到的目标,限制队列大小,保证找到最短路径解决方案,如果分支因子很高,它比BFS更快。
提高解决方案性能的另一种方法是找到解决难题的良好启发式方法。一旦你有了可以编码的启发式,你就可以试试A* algorithm