2010-08-29 31 views
0

我正在編寫一個模擬活動的程序,我想知道如何加快模擬的時間,比方說在現實世界中1小時等於1個月的程序。在C++中進行模擬的修改時間

謝謝

方案實際上類似於一個餐廳模擬,你真的不知道什麼時候客戶光臨。假設我們每隔一小時選一個隨機數(2-10)的客戶

回答

1

你就這樣做。您可以決定在一個小時的模擬時間內發生多少次事件(例如,如果事件每秒發生一次,那麼在3600次模擬事件之後,您已經模擬了一個小時)。您的模擬無需實時運行;您可以儘可能快地計算相關數字。

2

這取決於它現在如何獲得時間。

例如,如果它調用Linux系統time(),只需用您自己的函數(如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 
} 
0

如果仿真依賴數據(如A股市場程序),只是加快在數據被泵送的速度。如果有人認爲這取決於time()調用,那麼你將不得不做一些像wallyk的回答(假設你有源代碼)。

0

如果仿真中的時間是離散的,則可以選擇一種方法來構造程序,以便發生「每次打勾」的事情。 一旦你這樣做,你的程序中的時間是任意快的。

確實有一個理由讓模擬時間的一個月與現實世界中的一個小時完全一致?如果是,您可以隨時處理與一個月相對應的滴答數,然後暫停適當的時間讓一小時的「實時」完成。

當然,這裏的一個關鍵變量是模擬的粒度,即有多少個刻度對應於另一個模擬時間。

0

這聽起來像你正在實施Discrete Event Simulation。在這種情況下,你甚至不需要有一個自由運行的定時器(不管你使用什麼擴展)。這一切都是由事件驅動的。您有一個包含事件的優先級隊列,按事件時間排序。你有一個處理循環,它將事件放在隊列頭部,並將仿真時間提前到事件時間。您處理事件,這可能涉及安排更多事件。 (例如,customerArrived事件可能導致在2分鐘後生成customerOrdersDinner事件。)您可以使用random()輕鬆模擬到達的客戶。

我到目前爲止閱讀的其他答案仍然假設您需要一個連續的計時器,這通常不是模擬事件驅動系統的最有效方式。您不需要實時縮放模擬時間,也不需要滴答。讓事件推動時間!