Изменить время для моделирования в C ++ - PullRequest
0 голосов
/ 29 августа 2010

Я пишу программу, которая имитирует активность, мне интересно, как ускорить время для симуляции, скажем, 1 час в реальном мире равен 1 месяцу в программе.

спасибо

программа на самом деле похожа на симулятор ресторана, где вы не знаете, когда придет клиент. скажем, мы выбираем случайное число (2-10) клиентов каждый час

Ответы [ 5 ]

2 голосов
/ 29 августа 2010

Зависит от того, как сейчас время.

Например, если он вызывает систему 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 голос
/ 29 августа 2010

Вы просто делаете это.Вы сами решаете, сколько событий будет происходить за час времени моделирования (например, если событие происходит раз в секунду, то после 3600 смоделированных событий вы смоделировали час времени).Вам не нужно, чтобы ваша симуляция работала в режиме реального времени;Вы можете запустить его так же быстро, как и рассчитать соответствующие числа.

0 голосов
/ 29 августа 2010

Похоже, вы реализуете Моделирование дискретных событий . Вам даже не нужно иметь автономный таймер (независимо от того, какое масштабирование вы можете использовать) в такой ситуации. Это все обусловлено событиями. У вас есть приоритетная очередь, содержащая события, упорядоченные по времени события. У вас есть цикл обработки, который берет событие в начало очереди и увеличивает время моделирования до времени события. Вы обрабатываете событие, которое может включать планирование большего количества событий. (Например, событие customerArrived может вызвать создание события customerOrdersDinner через 2 минуты.) Вы можете легко смоделировать клиентов, прибывающих с помощью random().

Другие ответы, которые я читал до сих пор, все еще предполагают, что вам нужен непрерывный таймер, который обычно не самый эффективный способ моделирования системы, управляемой событиями. Вам не нужно масштабировать реальное время на время симуляции или иметь галочки. Пусть события движут временем!

0 голосов
/ 29 августа 2010

Если время в вашей симуляции дискретно, один из вариантов - структурировать вашу программу так, чтобы что-то происходило «каждый тик». Как только вы это сделаете, время в вашей программе будет сколь угодно коротким.

Действительно ли есть причина, по которой месяц моделирования точно соответствует часу времени в реальном мире? Если да, вы всегда можете обработать количество тиков, соответствующих месяцу, а затем сделать паузу в соответствующем интервале времени, чтобы закончился час «реального времени».

Конечно, ключевой переменной здесь является степень детализации вашего моделирования, то есть сколько тиков соответствует секунде имитируемого времени.

0 голосов
/ 29 августа 2010

Если моделирование зависит от данных (например, программа фондового рынка), просто увеличьте скорость, с которой данные прокачиваются. Если некоторые думают, что это зависит от вызовов time (), вам нужно будет сделать что-то вроде ответа wallyk (при условии, что у вас есть исходный код).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...