Ресурсом в AnyLogic называется специальный тип агента, используемый другими агентами при моделировании сущностей, доступных в ограниченных количествах. Примером могут послужить оборудование, рабочие и средства передвижения, требующиеся для выполнения определенных задач в контексте модели.
Ресурсы модели находятся в блоках ResourcePool, где они получают задания и их могут использовать другие блоки. Ресурсы каждого ResourcePool могут использовать несколько блоков одновременно. ResourcePool — основной способ моделирования ресурсов; вы не можете создавать ресурсы как обычные агенты через Source и подобные блоки.
Для простейших задач с ресурсами можно использовать блок Service. Этот блок представляет собой комбинацию трех других: он захватывает указанное число единиц ресурса (блок Seize), моделирует действие, выполняемое ими (блок Delay), а затем высвобождает ресурсы (блок Release).
Чтобы разработать более сложный процесс с участием ресурсов, добавьте на диаграмму процесса блок Seize. Этот блок захватывает указанное число единиц ресурса. Затем добавьте блоки, нужные для вашей задачи. Освободить занятые единицы ресурсов после выполнения всех требуемых задач можно с помощью блока Release, добавленного на диаграмму процесса.
Будучи особенным типом агента, ресурсы обладают собственным API. Чтобы узнать больше о доступных функциях, изучите соответствующую статью.
С ресурсами работают следующие блоки Библиотеки моделирования процессов:
Seize | Захватывает определенные ресурсы и при необходимости отправляет их на место назначения. |
Release | Высвобождает определенное количество ресурса после выполнения задач. |
Service | Этот блок разработан для моделирования простых задач, требующих ресурсов. Он объединяет блоки Seize, Delay и Release, предоставляя доступ к большинству их свойств. |
Downtime | Моделирует простои, вызванные поломками и плановым обслуживанием, а также позволяет создавать нестандартные задачи. |
ResourceSendTo | Командует ресурсу переместиться в заданную локацию. |
ResourceTaskStart | Моделирует начало выполнения задачи, выполняемой ресурсом, на диаграмме процесса. |
ResourceTaskEnd | Моделирует окончание выполнения задачи, выполняемой ресурсом, на диаграмме процесса. |
ResourceAttach | Прикрепляет ресурс к заданному агенту, после чего ресурс начинает двигаться вместе с этим агентом. |
ResourceDetach | Открепляет ресурс от заданного агента, после чего ресурс начинает двигаться отдельно от агента. |
Assembler | Позволяет при необходимости использовать ресурсы для объединения нескольких типов агента в один. |
Блок, которому требуются несколько различных единиц ресурса, может использовать ресурсы из одного или нескольких блоков ResourcePool, в зависимости от задач вашей модели:
-
Когда вам нужно несколько единиц ресурса одного типа (двое рабочих, трое медсестер и так далее):
- Задайте значение свойства Захватить: ресурсы одного типа.
- В списке Тип ресурса (или аналогичном свойстве блока) выберите нужный блок ResourcePool. Вы также можете щелкнуть по кнопке , после чего блок можно выбрать в графическом редакторе.
- Укажите требуемое количество единиц ресурса в поле параметра Количество ресурсов.
-
Если вам нужно использовать несколько ресурсов разного типа (например, робота с контроллерами, рабочих с различающимися навыками и так далее):
- Задайте значение свойства Захватить: (альтернативный) набор ресурсов.
-
Щелкните по кнопке , чтобы выбрать один из существующих блоков ResourcePool или
Щелкните по иконке и выберите блок ResourcePool в графическом редакторе. - Повторите действие для другого блока ResourcePool.
- Укажите требуемое количество единиц каждого ресурса в правой части таблицы.
-
Если вам нужно использовать несколько разных наборов ресурсов с различающимся числом единиц ресурса (например, задача может быть выполнена с помощью 2 роботов и 1 контроллера, но если свободных роботов недостаточно, ассистент-человек может заменить робота):
- Задайте значение свойства Захватить: (альтернативный) набор ресурсов.
-
Щелкните по кнопке , чтобы выбрать один из существующих блоков ResourcePool или
Щелкните по иконке и выберите блок ResourcePool в графическом редакторе. - Повторите действие для другого блока ResourcePool.
- Укажите требуемое количество единиц каждого ресурса в правой части таблицы.
- Создайте второй список ресурсов, щелкнув по кнопке Добавить список.
- Повторите шаги 2–4, чтобы задать второй список.
-
Повторяйте шаги, пока не зададите необходимые списки ресурсов.
Не добавляйте пустые списки ResourcePool: это может вызвать ошибки.
Приведенная ниже модель демонстрирует различные варианты использования ресурсов, включая примеры с использованием нескольких наборов. Она содержит огромное количество ресурсов, назначенных на различные задачи в рамках агента Main. Большую часть времени ресурсы используются блоками Service. Модель также включает процедуры, начинающиеся с блока Seize, для моделирования более сложных сценариев.
Демо-модель: Trauma Center Открыть страницу модели в AnyLogic Cloud. Там можно запустить модель или скачать ее по ссылке Исходные файлы модели.Чтобы узнать, как создать нестандартный тип ресурса, обладающий собственными диаграммой, параметрами и фигурой анимации, ознакомьтесь со статьей Создание нестандартных типов ресурсов.
Задачи — это Java-сущности, которые используются моделью и ее составными частями для работы с ресурсами. С помощью задач AnyLogic определяет, на какое действие назначить единицу ресурса, когда высвободить ее и так далее. В большинстве случаев это означает, что если ресурс не имеет связанной с ним задачи, то он не делает ничего.
Задачи ресурсов видны в окне инспекта блока ResourcePool во время «прогона» модели.
В AnyLogic множество типов задач для ресурсов. Вот некоторые из них:
- Задача service — это базовый тип задачи, назначаемый ресурсу, который захвачен каким-либо агентом.
- Задача wrap-up командует единице ресурса завершить выполнение текущего действия и вернуться на базовое местоположение. Такая задача создается автоматически в блоке Release.
- Задача end-of-shift командует единице ресурса оставаться на базовом местоположении и не делать ничего. Так, если свойство При уменьшении кол-ва блока ResourcePool имеет значение ресурсы сохраняются, то такие ресурсы выполняют именно задачу end-of-shift.
- Задача custom task создается блоками Downtime и служит для моделирования простоев и нестандартных действий, задаваемых этим блоком.
Каждой единице ресурса может быть назначена задача из двух очередей:
-
Очередь, генерируемая блоком ResourcePool, которому принадлежит единица ресурса. Она объединяет все задачи, относящиеся к ресурсам этого блока ResourcePool.
В простых моделях очередь блока ResourcePool — это основная очередь, управляющая ресурсами. ResourcePool будет отправлять ресурсы на задачи в соответствии с заданными в его свойствах правилами. Больше информации — в статье об этом блоке. -
Собственная очередь единицы ресурса. Она состоит из задач, которые может выполнить только эта конкретная единица ресурса: например, ей может быть назначена задача типа end-of-shift, или у блока, использующего единицу ресурса, включена политика Ожидать оригинал ресурса.
Кроме того, у некоторых блоков могут быть заданы дополнительные условия выбора ресурса (т.е. в свойствах блока включена политика Задать выбор ресурса и указано, собственно, Условие выбора ресурса). Больше информации — в документации по отдельным блокам.
Один набор ресурсов может выполнять задачи с разными приоритетами, заданные в нескольких блоках.
- Если задачи имеют одинаковый приоритет, они будут выполняться последовательно в соответствии с настройками времени выполнения каждой из них. Если освободившихся единиц ресурса хватает, то такие задачи могут выполняться одновременно. Если у двух задач одинаковый приоритет, но одна из них по какой-то причине была ранее приостановлена, то выбирается приостановленная задача.1
- Если для задач не задан механизм вытеснения, они будут выполняться последовательно в соответствии с настройками времени выполнения каждой из них. Если освободившихся единиц ресурса хватает, то такие задачи могут выполняться одновременно.
- Начало выполнения задачи, заданной в одном блоке, не сбрасывает приоритеты задач, заданных в других блоках.
-
Самый высокий приоритет — у приостановленных задач из «индивидуальной» очереди единицы ресурса.
Такие очереди формируются агентами, находящимися в блоках, для которых значение свойства Правило вытеснения задач установлено на Ожидать оригинал ресурса. -
После этого обрабатываются прерванные задачи из очереди блока ResourcePool.
Эта очередь формируется агентами, находящимися в блоках, для которых значение свойства Правило вытеснения задач установлено на Захватывать любой ресурс.
После выполнения задач из этих очередей ресурс сначала выполняет задачи из «индивидуальной очереди», а затем — из очереди блока ResourcePool.
Если этот порядок выполнения вам не подходит, вы можете вручную уменьшить приоритет определенной задачи с помощью кода: для этого используйте действие блока При остановке задачи.
-
Как мы можем улучшить эту статью?
-