グラフにBFSを実装しています。ここで、ノードはStateクラスのオブジェクトによってマークされています(比較のために暗黙のequals toメソッドを実装しました)。
プログラムを拡張してDFS、Astarなどを処理したいので、1を返すコンパレータを備えたPriorityQueueを使用してキューを実装しました。これは、コンパレータ内のロジックを変更するだけで実行できます。
関連するコードは次のとおりです。
//BFSComparator.java
import java.util.Comparator;
public class BFSComparator implements Comparator<State>{
@Override public int compare(State x, State y) {
return 1;
}
}
//solver.java
Comparator comparator = new BFSComparator();
PriorityQueue<State> frontierList = new PriorityQueue<State>(500,comparator); //List of nodes to be expanded
frontierList.add(seed state0);
while (!frontierList.isEmpty()){
curState = frontierList.poll();
//handle, expand and add child states to frontierList
リストを繰り返し処理し、存在する要素を印刷しているときに、一部の要素がランクを上げないことがわかりました(たとえば、pollの{a、b、c、d、e}はpoll(の{b、e、c、d}になります) ){b、c、d、e})ではなく、したがって、FIFOを実行しません。
for(State x:frontierList) {
//print x
}
1)コンパレータに問題がありますか?
2)これを一般的に行うためのより良い方法はありますか?つまり、プッシュやポップなどの異なる呼び出し名を持つキューやスタックを使用するのではなく、並べ替えの背後にあるロジックを変更しながら追加できる優先キューよりも優れたコンテナですか?これは、後でヒューリスティックに基づいて並べ替えるときに役立ちます。または、リンクリストを使用して、挿入ソートベースのアプローチを実行する必要がありますか?
編集:もう少し明確にしたいと思います。DFSまたはBFS(FIFOまたはLIFO)、またはA-Starやビームサーチなどの他の優先度ベースのアルゴリズムに関係なく、共通のadd(State)またはState x = remove()で物事をスローできるコレクションを実装しようとしています。 。
私はおそらくコレクションを拡張し、addや他のメソッドを実装するつもりです。