0

アクティビティをシミュレートするプログラムを書いています。シミュレーションの時間を短縮する方法を考えています。たとえば、現実世界の 1 時間は、プログラムの 1 か月に等しいとします。

ありがとうございました

このプログラムは実際、顧客がいつ来るかわからないレストランのシミュレーションに似ています。1時間ごとに乱数(2〜10)の顧客を選ぶとしましょう

4

5 に答える 5

2

今の時間の取り方次第です。

たとえば、Linux systemtime()を呼び出す場合は、より高速な時間を返す独自の関数 (mytime など) に置き換えるだけです。おそらく mytime は時間を呼び出し、返された時間を意味のある係数で乗算します。1時間=1ヶ月は720回。プログラムの開始時にオリジンを処理することを考慮する必要があります。

time_t t0;
main ()
{
     t0 = time(NULL);    // at program initialization

     ....

     for (;;)
     {
           time_t sim_time = mytime (NULL);
           // yada yada yada
           ...
     }
}

time_t mytime (void *)
{
     return 720 * (time (NULL) - t0);   // account for time since program started
                                        // and magnify by 720, so one hour is one month
}
于 2010-08-29T06:42:33.357 に答える
1

離散イベントシミュレーションを実装しているようです。このような状況では、(使用するスケーリングに関係なく)フリーランニングタイマーを用意する必要はありません。それはすべてイベントによって推進されます。イベントを含む優先キューがあり、イベント時間順に並べられています。キューの先頭でイベントを取得し、シミュレーション時間をイベント時間に進める処理ループがあります。イベントを処理します。これには、さらに多くのイベントのスケジュールが含まれる場合があります。(たとえば、customerArrivedイベントcustomerOrdersDinnerによって2分後にイベントが生成される場合があります。)を使用して、到着する顧客を簡単にシミュレートできますrandom()

これまで読んだ他の回答は、継続的なタイマーが必要であると想定しています。これは通常、イベント駆動型システムをシミュレートする最も効率的な方法ではありません。シミュレーション時間にリアルタイムでスケーリングしたり、目盛りを付けたりする必要はありません。イベントに時間をかけましょう!

于 2010-08-29T07:29:45.270 に答える
1

あなたはそれをするだけです。1 時間のシミュレーション時間に発生するイベントの数を決定します (たとえば、イベントが 1 秒に 1 回発生する場合、3600 のシミュレートされたイベントの後、1 時間の時間をシミュレートしたことになります)。シミュレーションをリアルタイムで実行する必要はありません。関連する数値を計算できる限り速く実行できます。

于 2010-08-29T06:36:44.380 に答える
0

シミュレーションの時間が離散的である場合、1 つのオプションは、「すべてのティック」で何かが発生するようにプログラムを構成することです。これを行うと、プログラムの時間は任意に速くなります。

1 か月のシミュレーション時間を現実世界の 1 時間に正確に対応させる理由は本当にあるのでしょうか? はいの場合は、1 か月に対応するティック数をいつでも処理してから、適切な時間を一時停止して、1 時間の「リアルタイム」を終了させることができます。

もちろん、ここで重要な変数はシミュレーションの粒度です。つまり、1 秒のシミュレーション時間に対応するティック数です。

于 2010-08-29T07:23:27.173 に答える
0

シミュレーションが (株式市場プログラムのように) データに依存している場合は、データがポンピングされる速度を上げてください。time() 呼び出しに依存していると思われる場合は、wallyk の回答のようなことを行う必要があります (ソース コードがあると仮定します)。

于 2010-08-29T06:49:08.643 に答える