0

Nagel-Schreckenberg モデルでは、交通シミュレーション内のすべての車について、次の 4 つの手順をシミュレーション内のすべての車に、以下に示す順序で並行して適用する必要があることを指定しています。

  1. 加速: 最大速度に達していないすべての車は、速度が 1 単位増加します。たとえば、ベロシティが 4 の場合、5 に増加します。
  2. 減速: すべての車をチェックして、前の車との距離 (セル単位) が現在の速度 (タイム ステップあたりのセル単位) よりも小さいかどうかを確認します。距離が速度よりも小さい場合、衝突を避けるために、速度は車の前にある空のセルの数まで減少します。たとえば、車の速度が現在 5 であるが、その前に空きセルが 3 つしかなく、4 番目のセルが別の車に占有されている場合、車の速度は 3 に減少します。
  3. ランダム化: 速度が 1 以上のすべての車の速度が、確率 p で 1 単位減少します。たとえば、p = 0.5 の場合、速度が 4 の場合、速度は 50% の確率で 3 に減少します。
  4. 車の動き: 最後に、すべての車が速度に等しいセル数だけ前進します。たとえば、速度が 3 の場合、車は 3 セル前進します。

( Nagel Schreckenberg モデル)

この背後にあるロジックを理解しており、適切に機能させるために並行して実行する必要がある理由を理解しています。ただし、これをJavaで実装する方法がわかりません。並行して実行する必要があるため、すべての車のこれらすべてのステップをほぼ同時に実行するために、1 つの個別のスレッドが割り当てられていることを意味する必要がありますか?

シミュレーションで一度に実行できるのは、最大 30 台の車のスレッドではないでしょうか。私が考えることができる唯一の方法は、スレッドのプールを用意し、それらを再利用して、毎回スレッドを作成しないようにすることです。ただし、それが最適なソリューションであるとはまだ確信が持てません。

何かご意見は?

4

2 に答える 2

2

アルゴリズムの背後にある考え方は、計算の前にモデルの状態を維持し、次にすべての車を計算し、その後モデル全体を更新する必要があるというものです。

parallelそれが通常、更新とは何を意味するかです。

計算中に更新すると、次のタイムステップの計算中にモデルが変化するため、モデルの動作に一貫性がなくなります。

Concurrent1-nモデルが変更されるべきではないため、計算はすべての車に対して同時に実行できるため、実際にスレッドを使用して同じことを実行できることを意味します。

個人的には、モデルの計算がボトルネックになる限り、並行して行うことはありません。多くの車を所有している可能性が非常に高いです。その場合、ThreadPoolCPU コアと同じ数のスレッドを割り当て、車のリストを同じ量の車にチャンクします。

次に、各スレッドにモデルの新しい状態を計算させ、その後パーツを再度結合します。

于 2013-03-17T12:32:59.470 に答える
2

これがウィキペディアの記事で提示されている方法は、やや誤解を招くと思います。

4 つのステップを調べると、最初の 3 つを論理的に 1 つにまとめることができることがわかります (現在の速度、前方のフリー セルの数、ランダム係数に基づいて車両の速度を調整します)。各車両について、そのうちの 1 つだけが外部状態です。ステップ 4 でのみ更新されます。ステップ 4 は外部状態の影響を受けません。車は現在の速度に基づいて盲目的に移動します。これが、この記事での「並列処理」の意味です。2 つの論理アクションは、車両ごとに順番に実行されるのではなく、モデル全体に​​対して実行されます。

したがって、すべての車の速度を変更してから、すべての車を移動するだけでよいため、スレッドの問題は意味がありません。効率性を除けば、これらのステップのいずれにおいてもマルチスレッド化の本質的な必要性はありません。

したがって、最も単純な実装は次のようになります。

(与えられた車のコレクション)

  • 速度変更ルールを適用して、すべての車を反復処理します
  • 位置の変更を適用して、すべての車を反復処理します
  • 完了するまで繰り返す
于 2013-03-17T12:33:27.267 に答える