3

私はJavaでシミュレーションを構築しています。そこで、シミュレーションを2つの部分に分けます。

1)シミュレーションエンジン

2)シミュレーションモデル

基本的に、私はそれを分割する方法、つまり何がどこに行くのかについて少し助け(ヒント/アドバイス)が欲しいです。

だから私はエンジンが時間を追跡するだろうと思っています。イベントをリッスンし、イベントが到着すると、シミュレーションの状態を更新します(離散イベントシミュレーションを構築しています)。シミュレーションモデルにはGUIがあり、実際のエンジンからロジックとデータを取得します。モデルはエンジンへの入力として実際のイベントを提供すると思います。私は、エンジンが車のボディであり、モデルがドライバーであるという車の例えについて考えてきました。ですから、ドライバー(モデル)が車(エンジン)に何をすべきか、つまりいつブレークするか、どの速度で進むかなどを指示するように動作させたいのです。

私はこれに正しい方法で取り組んでいると思いますか?少し紛らわしく、はっきりしないように聞こえます。ですから、私が探しているのは、これをどのように分割すべきか、そしてエンジンとモデルの責任が実際にどうあるべきかについての単なるインプットであることを明確にします。

また、MVCデザインパターンを実装する場合、それを分割しようとしている方法にどのように適合するのでしょうか。

編集:

モデルとは、シミュレーションに、エンジンが従う特定のルールのセットを持たせたいという意味です。私が道路交通シミュレーターを構築しているとき、ルールは、車の分布、ドライバーのプロファイル、車が実行できることと実行できないこと(たとえば、赤信号のために停止する)などのようになります。したがって、モデルはの「頭脳」のようなものです。私が言っていることを理解できればシミュレーション、そしてエンジンはモデルによって指定された一連の「ルール」の実際のシミュレーションです。これがもっと理にかなっていることを願っています。

4

3 に答える 3

5

あまり適用できないかもしれませんが、かなり広く受け入れられているMVCアプローチ(Model-View-Controller)の場合、コントローラーはエンジンと呼ばれるものに対応しているようです。そして、モデルはまさにそれです-可能な限りロジックが少なく、それらが表す実世界のオブジェクトの属性のみを含む単純なダンプJavaオブジェクトの束。

したがって、MVCとのこのアナロジーを使用すると、モデルを道路、車のセットとして取得し、オブジェクトの座標だけを含み、エンジンが車を動かしたり、衝突を検出したりします。

移動のラウンドが終了すると、モデルの更新バージョンが取得されます(一部の車は新しい速度で新しい位置にあり、一部の建物は燃えています(heh)など)。そして、レンダリングのために、この更新されたモデルをビュー(それが何であれ)に処理します。

ここで私が確信していないのは、システムのどの部分が入力イベントを提供するのかということだけです。通常のMVCでは、これは外部エンティティ(通常は人間のオペレーター)です。イベントによって人間の入力を意味する場合、それはアプリケーションでも同じになります。たとえば、車の動きによる衝突などのイベントを意味する場合、シミュレーションの各ステップでの計算の結果としてそのようなイベントを生成するのはエンジン自体です。

ただし、これはあまり古典的なOOデザインではありません。従来のオブジェクト指向デザインでは、車などのモデルクラスに内部ロジックがあり、たとえば、車の速度が突然変化することを定義します。コードのロジックがモデルクラスとコントローラークラスに分散されるため、このルートは使用しません。あなたは世界の始まりにモデルオブジェクトのセットを持っており、前進する唯一の方法は、エンジンの決定でそれらに影響を与えるか、実際の外部入力(人間からのGUI入力など)を持つことです。動作を変更するためにモデルオブジェクトが必要な場合は、モデルコードではなく、エンジンコードが責任を負う必要があります。

このかなりまとまりのない憶測で申し訳ありませんが、これはかなり広いトピックであり、そのようなことについての本がたくさんあります。

于 2012-10-25T21:33:35.160 に答える
2

シミュレーションをスケッチするのに本当に役立つ十分な情報を私たちに提供していませんが、ここに良いヒントがあります。物として識別できるものはすべてオブジェクトである必要があります。だからクラスを作るCar。そしてクラスTrafficLight。次に、クラスを作成します。DriverそれぞれCarにフィールドがありますDriver。そしてRoadList<Car>

MVCフレームワークの実装方法について考える前に、それが何であるかを理解していることを確認してください。。MVCで最も重要なことは、ユーザーがユニバースとどのように対話するかということです。したがって、たとえば、SimTrafficというゲームを作成している場合は、MVCが必要になります。これは、トラフィックシミュレーションが必要なだけでなく、ユーザーが何らかの方法でそれを制御する必要があるためです。シミュレーションが発生するのを(相互作用なしで)見ているだけの場合は、MVCについて心配する必要はありません。

于 2012-10-25T21:30:51.170 に答える
1

GUIを忘れてください。物理学から始めてください-交通シミュレーションのスコアがあります。このテーマについて少なくとも1冊の本を読んだと思いますが、そうする時期ではありません。出発点は、Springerが公開した、Fundamentals of Traffic Simulation(ISBN 1441961410)、Jaumeと呼ばれるさまざまな最新モデルに関するエッセイのコレクションです。バルセロ(編)(2010)。

編集:最初にあなたのシムの範囲を決定することをお勧めします。一定の仮定は何ですか?どの期間調整されますか?道路網は変わりますか?交通事故、飲酒運転の馬鹿、Youtubeの事故現場から映画を撮る見物人を許可しますか?

シムにはどの程度の精度が必要ですか?都市計画、環境制御、または交通管理に使用しますか?設定する変数とパラメーターは何ですか?シミュレーションを検証し、予測をテストするための統計データを入手しましたか?モデル化された宇宙/都市の車/ドライバーの物理的特性(加速度、線形サイズ、交通ルールを破る傾向)に関するデータが用意されていますか?コードを書く前に答えるべき質問がたくさんあります...

編集#2:コメントから@Victor Sorokinの回答まで、モデルにドライバーの期待を追加するという素晴らしいアイデアがあると思います-ドライバーのAIを最初にコーディングするものにします:はい、最短経路ですが、最短経路問題は、古いデータ(場合によっては可変遅延を伴う)に起因します。ドライバーに完全な先見性を与えれば、クラッシュは発生しません。それらを不完全にすると、感覚入力をモデル化する必要があります。おそらく、入ってくる車を検出する方向固有の確率に要約されます。確かに、CPUサイクルに莫大な費用がかかります。

于 2012-10-25T21:47:40.503 に答える