2

単一のサーバー キューを実装しようとして行き詰まっています。Norm Matloff の Simpy チュートリアルからいくつかの疑似コードを Python に適合させました。コードはhereです。今、仕事/顧客の平均待ち時間を計算する方法を見つけるのに苦労しています.

この時点で、私の脳は結び目を作りました!ポインタ、アイデア、ヒント、または疑似コードをいただければ幸いです。

4

1 に答える 1

5

各顧客がいつキューに到着したかを知っておく必要があります。彼らがサーバーに到着したら、サービスを提供する顧客の数に1を追加し、彼が待機した時間を累積する必要があります。シミュレーションの最後に、累積時間を顧客の数で割るだけで、ジョブ/顧客の平均待機時間が得られます。

中心的な問題は、さまざまなイベントを考慮し、それらのイベントに基づいて統計を更新することです。

シミュレーションでは、シミュレーションのすべての構造を適切な状態に初期化する必要があります。

  • 顧客のキューを誰にも初期化しない
  • 提供された顧客の数を0に初期化します
  • 累積待機時間を0に初期化します
  • 現在のシステム時刻を0に初期化します
  • 等。

すべてのシステムが初期化されたら、顧客が到着するイベントを作成します。これは通常、特定の分布によって決定されます。システムイベントを生成するには、システムの統計を更新する必要があります。この時点で、すべてのジョブ/顧客の到着時間を生成する選択肢があります。各顧客のサービス時間も、特定のディストリビューションから生成されるものです。

次に、各イベントを処理し、それに応じて統計を更新する必要があります。たとえば、最初の顧客が到着したとき、シミュレーションが開始されてから現在までキューは空になっています。キュー内の顧客の平均数は、関心のあるパラメーターである可能性があります。0*経過秒数をアキュムレータに累積する必要があります。顧客が空のキューに到着したら、サービス時間を生成する必要があります。次の顧客は、指定されたジョブが終了する前または後に到着します。前の顧客がサービスを受ける前に次の顧客が到着した場合、あなたは彼をキューに追加します(誰も待っていなかったという事実を蓄積します)。次に発生するイベントに応じて、その時間間隔で発生する統計を蓄積する必要があります。サーバーのアイドル時間も、このようなシミュレーションで重要なパラメーターです。

より明確にするために、18人が並んでいて、サーバーが最初の顧客の仕事を完了したという事実を考慮してください。18人目の顧客が到着してから一人称の仕事が完了するまでの間隔は、アキュムレータに追加される加重平均です。たとえば、4秒間に18人が並んでいます。

サーバーはアイドル状態ではないため、キューからエントリを削除して、次のジョブの処理を開始する必要があります。このジョブには、通常、何らかのディストリビューションから定義された時間がかかります。現在の仕事が終了する前に次の顧客が到着した場合、17人が並んでいたという事実が加重値に追加されます。

ここでも基本的なレベルで、システム内の関連するイベント間の統計を蓄積しています。

while (current_time < total_simulation_time)
      handle_next_event
      generate_subsequent_events
      accumulate_statistics
      update_current_time
endwhile

Display "Average wait time: " accumulated_wait_time / number_of_customers_served

それが少し長引くように見えるのを助けることを願っています。

于 2009-04-13T01:47:21.830 に答える