2009-06-21 8 views
0

私は各チームの現在のゲームとその次のゲームのスケジュールを経てリーグのスポーツのためのJavaプログラムを作成しており、それに基づいてフローネットワークのモデルを作成します。プログラムのアイデアは、どのチームがすでに排除されているかを見いだし、他のチームと1か所で戦う機会がないということです。 (EdmondsKarp algoを適用して)ネットワークを分析した後、私はteam getが消滅したかどうかを調べる。今私もこれをシミュレートしたい。私はグラフライブラリとしてJGraphTを使用しています。おそらくJGraphをビジュアライゼーションに使用しています(理由:JGraphTオブジェクトを作成すると、JGraphオブジェクトをインスタンス化してグラフを表示できます)。私はまた、昨日Jungフレームワークのために見つけた、いいね。JavaでのMax-Flowグラフシミュレーション

主な問題はシミュレーションを書いたことがなく、「Hello World」ヘルプが必要なポイントです。私がシミュレーションを言うと、アルゴリズムの実行のすべての部分を視覚的に表示したいということです。ここでは例のシナリオがあります。アルゴリズムはパスを増やす必要があるため、新しいエッジが増えるごとにパスを追加する必要があります。ユーザーはアニメーションの再生と停止を行うことができます。私はまた、すべてのエッジやそのようなことでフローの変化を表示したい。これまでのところ、アルゴリズムは動作していますが、シミュレーションにどのようにアプローチするのか分かりません。私はシミュレーション実行のために別のスレッドを使用すべきですか?私はアルゴリズムとして実行される別のクラスを書くべきですか?本当のアルゴリズムを知らなくても状態を記録します(本当のアルゴリズムのパフォーマンスを中断したくないので)。私は、現在のアルゴリズムを使用し、後でユーザーにシミュレーションを表示するために使用できるいくつかのデータ構造に実行状態を保存するために、いくつかの行を追加する必要がありますか?どのようなアイディアも役に立ちます。

答えて

1

正しく理解すれば、アニメーションアルゴリズムを使用して、アニメーション内からインタラクティブに実行を制御します。これはシミュレーションとは全く異なります。シミュレーションはモデルを実行します。通常は、ユーザーインタラクションやアニメーションとは関係ない一定の時間間隔でモデルを実行しますが、両方とも組み合わせることもできます。

問題を2つの主要な部分、インタラクションとアニメーションに分割することをお勧めします。どちらも、model-view-controllerアプローチを適用することで解決することができます。

  • 例えば、あなたは区別したい「原子ステップ」を識別し、あなたのアルゴリズムを操作するにはパスへのエッジの追加。その後、アルゴリズムを拡張して段階的に作業するか、アルゴリズムをラップし、ステップワイズ実行に必要なルーチンを提供する余分なクラスを作成します。

  • はあなたのアニメーションコンポーネントがオブザーバーであり、その状態が変化したときに、例えば、アルゴリズムによって通知され observer patternを、使用する必要があり、あなたのアルゴリズムはである現在の状態をアニメーション化するにはパスにエッジが追加されました。 ヒント(パスに追加されたエッジオブジェクトなど)を渡すことで実際の状態変化を記述することもできます。これにより古い状態と新しい状態の違いを視覚化することが容易になります。

    ご質問がスレッドについて

:(それは非常に非常に高速でない限り)アルゴリズムは、おそらく余分なスレッドで実行する必要があります。また、(これはおそらくすでにとにかくJGraphはによって提供され、余分なスレッドでアニメーションを置くことができ、単にドキュメントをチェックするか、アドバイスとしてそのコンポーネントを使用してください)。しかし、アルゴリズムの実行時パフォーマンスは、が別のスレッドで実行中の(通知はまだアルゴリズムによって行われている必要があるため)であっても、影響を受ける可能性がほとんどありますので、パフォーマンス分析と使用に注意してくださいそのような研究のための非アニメーション版。