我正在写一个模拟活动的程序,我想知道如何加快模拟的时间,假设在现实世界中1小时等于程序中的1个月。
谢谢
该程序实际上类似于餐厅模拟,在那里你不能真正知道顾客什么时候来。假设我们每小时随机挑选一个(2-10)客户
发布于 2010-08-29 14:42:33
这取决于它现在如何获得时间。
例如,如果它调用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
}发布于 2010-08-29 14:36:44
你只要做就行了。你决定在一个小时的模拟时间内发生多少事件(例如,如果一个事件每秒发生一次,那么在模拟一个小时的3600个模拟事件之后)。您的模拟不需要实时运行;您可以尽可能快地计算相关数字来运行它。
发布于 2010-08-29 15:29:45
听起来您正在实现一个Discrete Event Simulation。在这种情况下,你甚至不需要有一个自由运行的计时器(无论你使用什么缩放)。这一切都是由事件驱动的。您有一个包含事件的优先级队列,按事件时间排序。您有一个处理循环,它获取队列头部的事件,并将模拟时间提前到事件时间。您可以处理事件,这可能涉及调度更多事件。(例如,customerArrived事件可能会导致在2分钟后生成customerOrdersDinner事件。)您可以使用random()轻松模拟到达的客户。
到目前为止,我读到的其他答案仍然假设您需要一个连续的计时器,这通常不是模拟事件驱动系统的最有效的方法。您不需要将实时缩放到模拟时间,也不需要有刻度。让事件驱动时间!
https://stackoverflow.com/questions/3593737
复制相似问题