2012-03-26 5 views
1

私の質問はかなり簡単です。検索アルゴリズム(DFS、BFS、星印など)。どのように "フリーズ"せずにGUIを(更新された状態で)更新するのですか?

アルゴリズム「Aスター」(ヒューリスティック関数を使用して次の状態を計算する検索アルゴリズム)を実行しているとします。

グリッドにアップデートを表示したい(私は8-パズルの問題に適用する)。私はどうしたらいいですか?私は変更がはっきり見えるようにしたいのですが、私の経験では、ちょうどGrid[6].showValue(newValue)のような何かをすれば、GUIはちょうど "スタンバイ"になります。

これはマルチスレッド(多分?)で行うことができると確信していますが、もっと単純な方法がありますか?

可能であればもう少し簡単な質問 Java(私のIDEはNetbeans)にBFS、DFS、Aスターのような検索方法を含むクラスがあるのだろうか?もしそうなら、あなたはアルゴリズムのコードへのリンクを提供することができますか(私はそれらをコードのベースとして使用する必要があります。私は直接それらを含めることはできません。 Javaはオープンソース言語なので、このコードは簡単に見つかるはずです。私が間違っている?

ありがとうございました

+0

また、A *を実装する必要がある場合は、少なくともCUTの配布資料/コースブックに擬似コードが必要です。既存の実装を調べる前にそれらのアルゴリズムに基づいてアルゴリズムを実装してみてください。あなたが自分の実装に固執している場合は、あなたが得た距離と解決しようとしている特定の問題についての詳細を提供してください(ディスプレイはさわやかではありません) – Attila

答えて

3

GUIスレッドで処理しないでください。

ここでは、について言えば、それはイベントディスパッチスレッドです。 Concurrency in Swing tutorialに記載されているワーカースレッドを使用します。

+0

ありがとうございます。ただ1つの質問: "GUIスレッドで処理しないでください"。どういう意味ですか?操作(検索アルゴリズムなど)に「別のスレッド」を使用し、出力を表示して入力を取得するためにGUIスレッド(たとえば開始クラス)を使用することを意味しますか? – dragonmnl

+0

正確に。 ['SwingWorker'](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html)を参照してください。 –

1

MДΓΓBLLLLのように別のスレッドで処理する必要があります。基本的には、検索関連のコードをRunnableを実装するクラスに実装する必要があります。これは、スレッド内で実行可能なクラスを「マーク」します。

そうするためには、使用することができますSwingWorker:2番目の答えのために

SwingWorker<Integer[], Void> worker = new SwingWorker<Integer[], Void>() { 
    public Integer[] doInBackground() { 
     //do the computation here. This will be executed in a different thread; 
     //thus allowing the event dispatch thread (=GUI thread) to ensure responsiveness of the UI. 
     //NEVER update your GUI here since this could cause strange errors that are sometimes hard to track down. 
    } 
    public void done() { 
     try { 
      Integer[] result = get(); //this is executed in the GUI thread after 
      //execution if the doInBackground method finished and fetches the result of 
      //that method. You should update your GUI here. 
     } catch (InterruptedException ex) { 
      ex.printStackTrace(); 
     } catch (ExecutionException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

:それは特にツリー以来、それはさまざまなデータ・タイプに使用可能だということを、このような一般的な方法でアルゴリズムを実装するために、むしろ難しいですあなたはBFSを使用していますが、DFSとA-Starにはあらゆる種類のデータを含めることができます。私は教科書や講義のノードで擬似コードでアルゴリズムを見つけるべきだと思います。もしそうでなければ、どこかでそれを見て、あなた自身でそれを実装しようとする。

+0

ありがとうございます。もう1つの質問:検索アルゴリズムを「減速させる」方法を提案してください。私は..私はGUIが高速に更新されないようにしたい(ユーザーは少なくとも200ミリメートル8パズルのすべての構成を見ることができます)。何か案が? – dragonmnl

+0

Thread.sleep(200)を使うことができます。これは静的メソッドです。遅くしたいスレッドで呼び出すだけです。このようにして、実行スレッドは200msの実行を停止します。私の答えがあなたを助けたら、それをアップヴォート/受け入れてください! – mort

+0

私はただ一つの答えを受け入れなければなりませんでした(私は両方を受け入れようとしました)、私は最初の答えを選択しました。もちろん、私はあなたに投票しました。ありがとうございました! – dragonmnl

関連する問題