修改c ++中的模拟时间

时间:2010-08-29 06:10:52

标签: c++ time simulation event-driven

我正在编写一个模拟活动的程序,我想知道如何加快模拟的时间,假设在现实世界中1小时等于1个月的程序。

谢谢

该计划实际上类似于餐馆模拟,您不知道客户何时来。假设我们每隔一小时挑选一个随机数(2-10)客户

5 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

你就是这样做的。您可以决定在一小时的模拟时间内发生的事件数量(例如,如果事件每秒发生一次,那么在模拟一小时的3600次模拟事件之后)。您的模拟无需实时运行;您可以尽可能快地运行它来计算相关数字。

答案 2 :(得分:0)

如果模拟依赖于数据(如股票市场计划),只需加快数据抽取的速度。如果有人认为这取决于time()调用,你将不得不做一些像wallyk的回答(假设你有源代码)。

答案 3 :(得分:0)

如果模拟中的时间是离散的,一个选项是构建程序,以便“每个滴答”发生一些事情。 一旦你这样做,你的程序中的时间是任意快的。

真的有一个理由让一个月的模拟时间完全符合现实世界中的一小时吗?如果是,您可以随时处理与月份对应的刻度数,然后暂停适当的时间以让“实时”完成一小时。

当然,这里的一个关键变量是模拟的粒度,即多少个刻度对应于模拟时间的第二个。

答案 4 :(得分:0)

听起来你正在实施Discrete Event Simulation。在这种情况下,您甚至不需要自由运行的计时器(无论您使用何种缩放)。这一切都是由事件驱动的。您有一个包含事件的优先级队列,按事件时间排序。您有一个处理循环,它将事件放在队列的头部,并将模拟时间提前到事件时间。您处理事件,这可能涉及安排更多事件。 (例如,customerArrived事件可能会导致2分钟后生成customerOrdersDinner事件。)您可以使用random()轻松模拟到达的客户。

到目前为止我读过的其他答案仍然假设您需要一个连续计时器,这通常不是模拟事件驱动系统的最有效方法。您不需要将实时缩放到模拟时间,也不需要刻度。让事件开动时间!