2009-04-13 3 views
2

Я застреваю, пытаясь реализовать одну очередь серверов. Я адаптировал некоторые pseudocode из учебника Simpy от Norm Matloff's на Python, а код here. Теперь я изо всех сил пытаюсь найти способ вычислить среднее время ожидания работы/клиента.Моделирование очередности дискретных событий

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

+0

Псевдокод и содержимое кода в вопросе более недоступны. – dim

ответ

5

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

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

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

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

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

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

Чтобы сделать все более понятным, рассмотрим факт, что в очереди 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 

Надежда, что помогает ему кажется немного longwinded.

+0

Благодарим вас за прекрасное объяснение. Хотя я ... я понимаю теорию и идеи моделирования, реализация на удивление сложна. Мне трудно держать все детали в голове и соединять их таким образом, чтобы сделать что-то полезное. Еще раз спасибо :-) – vinc456

+0

yw ... рад поделиться! Я никогда не удосужился узнать кого-либо из них, но есть некоторые пакеты, чтобы сделать это проще; однако, это хорошая практика, чтобы почувствовать ожог, делающий один из них с нуля, прежде чем разветвиться. – ojblass

Смежные вопросы