Моделирование очереди дискретных событий - PullRequest
2 голосов
/ 13 апреля 2009

Я застрял, пытаясь реализовать одну очередь сервера. Я адаптировал псевдокод из учебника Simpy Норма Мэтлоффа для Python, и код здесь Сейчас я пытаюсь найти способ рассчитать среднее время ожидания работы / клиента.

В этот момент мой мозг завязал себя в узел! Будем благодарны за любые указатели, идеи, советы или псевдокод.

1 Ответ

5 голосов
/ 13 апреля 2009

Вы должны знать, когда каждый клиент прибыл в очередь. Когда они прибудут на сервер, вы должны добавить одного к числу обслуживаемых клиентов, а также накапливать количество времени, которое он ожидал. В конце моделирования вы просто делите накопленное время на количество клиентов, и у вас есть среднее время ожидания для работы / клиента.

Основная проблема заключается в учете различных событий и обновлении статистики на основе этих событий.

Ваше моделирование должно инициализировать все структуры вашего моделирования в разумное состояние:

  • Инициализировать очередь клиентов, чтобы в ней никого не было
  • Инициализировать любое количество обслуживаемых клиентов до 0
  • Инициализировать любое накопленное время ожидания до 0
  • Инициализировать текущее системное время на 0
  • Etc.

Как только вся система была инициализирована, вы создаете событие, когда прибывает клиент. Это обычно будет определяться некоторым данным распределением. Генерация системных событий должна будет обновить статистику системы. В этот момент у вас есть выбор: генерировать все время прибытия на работу / клиентов. Время обслуживания каждого клиента также зависит от конкретного дистрибутива.

Затем вы должны обработать каждое событие и соответственно обновить статистику. Например, когда приходит первый клиент, очередь была пуста с момента начала моделирования до текущего времени. Среднее число клиентов в очереди, скорее всего, является интересным параметром. Вы должны накапливать 0 * прошедших секунд в аккумуляторе. Как только клиент прибудет в пустую очередь, вы должны сгенерировать время обслуживания. Либо следующий клиент прибудет до или после завершения данной работы. Если следующий клиент приходит до обслуживания предыдущего, вы добавляете его в очередь (накапливая факт, которого никто не ждал). В зависимости от того, какое событие происходит дальше, вы должны накапливать статистику, которая происходит за этот промежуток времени. Время простоя сервера также является интересным параметром в таких симуляциях.

Чтобы прояснить ситуацию, учтите, что в очереди 18 человек, и сервер выполнил задание для первого клиента. Интервал между прибытием 18-го клиента и временем завершения работы первого лица является средневзвешенным значением, которое нужно добавить к аккумулятору. Например, в течение 4 секунд в очереди было 18 человек.

Сервер не находился в режиме ожидания, поэтому вы должны удалить запись из очереди и начать обработку следующего задания. Работа займет некоторое количество времени, обычно определяемое из некоторого распределения. Если следующий клиент прибудет до завершения текущей работы, к вашему взвешенному значению будет добавлено 17 человек.

Опять на фундаментальном уровне вы накапливаете статистику между соответствующими событиями в вашей системе:

while (current_time < total_simulation_time)
      handle_next_event
      generate_subsequent_events
      accumulate_statistics
      update_current_time
endwhile

Display "Average wait time: " accumulated_wait_time / number_of_customers_served

Надеюсь, это поможет, кажется, немного надуманным.

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