#priority-queue #anylogic
Вопрос:
Добрый день! Я попытался построить сетевую модель в AnyLogic 8.7.6. У меня есть 2 источника с разными приоритетами (пакеты из первого источника получают приоритет 2, а пакеты из второго источника получают приоритет 1). Пакеты из источников передаются в очередь. Очередь должна отсортировать их по приоритету.
Параметры приоритета определяются в Агентах у Источников.
Я провел простой эксперимент. Источник 1 генерирует 1 агента в секунду, а Источник 2 генерирует 10 агентов в секунду. Мы видим, что очередь пуста 🙁
Я понятия не имею, почему. Очередь не сортирует их в соответствии с их приоритетом.
P.S. Извините, у меня есть русскоязычная версия Anylogic.
Комментарии:
1. Как мы можем узнать, не работает ли сортировка, если в очереди ничего нет? Пожалуйста, удалите все соединения из очереди, чтобы образовалась очередь…если у вас есть две очереди, подключенные друг к другу, агенты войдут в первую и сразу перейдут в следующую очередь… таким образом, они никогда не имеют приоритета, потому что они никогда не стоят в очереди в первой очереди, где, я полагаю, вы устанавливаете приоритеты.
2. Спасибо! Я понимаю, в чем была моя проблема. Очередь не может ничего сортировать, так как она ничего не собирает. Агенты немедленно покидают очередь. Так просто…. Однако число моих агентов начинается с 39. Не 1….
3. (Это было мое самое первое утверждение в моем первоначальном ответе 😉 ) Вы можете игнорировать номер агента или создать свою собственную функцию и выбрать, что вы хотите отобразить. Проверьте мою последнюю фотографию в моем обновленном вопросе. (Если мой ответ помог вам решить вашу проблему, не забудьте принять его)
Ответ №1:
Не видя емкости очереди, если у вас есть две очереди, соединенные друг с другом, агенты войдут в первую и сразу перейдут в следующую очередь… таким образом, они никогда не имеют приоритета, потому что они никогда не стоят в очереди в первой очереди, где, я полагаю, вы устанавливаете приоритеты.
Попробуйте удалить соединение между двумя очередями и просто посмотрите, будут ли агенты упорядочены в соответствии с вашим приоритетом.
Смотрите небольшой тест ниже
У меня есть пользовательский тип агента с переменной priority
и простой блок-схемой с 2 источниками и очередью
В соответствии с вашим примером я устанавливаю переменную приоритета агентов, созданных в источнике 1, на 2, а в источнике 2 они установлены на 1.
В очереди я устанавливаю порядок заказа на основе приоритета и говорю блоку использовать переменную приоритета внутри агентов (чем выше, тем выше приоритет)
Для примера я установил source1 для генерации агентов каждую минуту, а source 2-для генерации каждую секунду.
Ожидается, что как только агент из source1 будет сгенерирован, он перескочит через очередь и встанет первым в очереди
Когда я запускаю модель и щелкаю, чтобы просмотреть подробные сведения о очереди, я вижу, что, как только создается агент из source1, он переходит линию.
Вы всегда можете создать пользовательскую функцию toString (), чтобы определить, что должно отображаться при нажатии на блок очереди
Комментарии:
1. Спасибо вам за ваш ответ. Нет, это не работает. Я просто оставляю два источника, соединяю их с очередью, а затем соединяю очередь с приемником. Источники генерируют агентов с параметром «Приоритет». Сортировка очереди производится по этому параметру. Вместимость очереди не ограничена.
2. Спасибо за отзыв, я обновил свой ответ очень простым примером. Я надеюсь, что это поможет вам найти приемлемое решение вашей проблемы. Если это все еще не помогает, пожалуйста, предоставьте подробную информацию о приоритизации ваших блоков, аналогично тому, что я сделал
3. И что еще более интересно, очередь может сортировать пакеты внутри агентов, которые были сгенерированы в одно и то же время. Итак, если я заменю два источника одним источником. И этот источник генерирует агентов с помощью uniform_discr(1,5). Очередь сортирует пакеты в пределах одной метки времени создания.
4. Очередь будет сортировать агентов каждый раз, когда в очереди появляется новый агент. Не уверены, решена ли ваша проблема сейчас или нет?
5. Я обновил задачу. Нет, это все равно не работает 🙁