Anylogic - Пользовательский выбор ресурсов между двумя наборами

Используя сервисный блок AnyLogic, я пытаюсь захватить набор ресурсов, используя пользовательское условие выбора ресурсов. Моим критерием для принятия решения о том, какой набор захватить, является логический параметр агента. Используя ответы из этого вопроса, я реализовал следующий код для захвата необходимого ресурса:

ResourcePool t_pool = (ResourcePool)pool;
// resource selection condition
if ( (t_pool == resourcePool1) && (agent.bool) ||
     (t_pool == resourcePool2) && (!agent.bool)){
    return true;
}
else {
    return false;
}

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

Например, с двумя наборами {commonResourcePool, resourcePool1} и {commonResourcePool, resourcePool2} я проверил пул локальных переменных, и он принимает только значение commonResourcePool. Переключение порядка пулов не помогло.

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

(Я использую AnyLogic PLE 8.4.0)

Ожидаемый результат: захватить предполагаемый набор в соответствии с логическим значением. Полученный результат: not set изъят, а агент заблокирован. Что я пробовал: Поменяйте порядок пулов в наборе. Результат тот же: только commonResourcePool проверяется пулом локальных переменных.

Модификации кода: я пытался создать новый набор каждый раз, когда достигается блок, однако мне не удалось создать набор (ResourceSet не существует). Код, который я пробовал, выглядел так:

    // create the two resource sets
    ResourceSet resourceSet1 = new ResourceSet();
    ResourceSet resourceSet2 = new ResourceSet();

    // customize the resource choice based on the agent parameter bool
    if (agent.bool.par_cancer) {
        resourceSet1.add(commonResourcePool);
        resourceSet1.add(resourcePool1);
        customizeResourceChoice(resourceSet1);
    } else if (!agent.bool) {
        resourceSet2.add(commonResourcePool);
        resourceSet2.add(resourcePool2);
        customizeResourceChoice(resourceSet2);
    } else {
        // handle invalid agent parameter value
    }

Спасибо, С наилучшими пожеланиями

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

Обновлено еще раз: Ресурс установил настройки.

Можете ли вы поделиться скриншотами вашей модели и где вы пишете свой код? Трудно следить за тем, что вы сейчас делаете, и какова желаемая логика

mczandrea 05.04.2023 12:33

Я отредактировал сообщение, добавив несколько скриншотов, показывающих, как возникает эта проблема. Я надеюсь, что это помогает.

Jules Le Lay 05.04.2023 15:13

Вы добавили пулы ресурсов в раздел «Наборы ресурсов» своего блока «Сервис»? Вы можете выбирать ресурсы только из определенного пула, если в блоке Service (или Seize) указан пул. Кроме того, является ли ваша логика «если agent.bool истинным, то используйте commonResourcePool или resourcePool1, иначе используйте commonResourcePool или resourcePool2»? Тогда ваш код может быть намного проще, но я просто хочу убедиться, что правильно понимаю вашу проблему.

mczandrea 05.04.2023 15:29

Также у вас опечатка в fct_resourceChoice, я думаю, вы хотели написать resourcePool2 во второй строке вашего if условия :)

mczandrea 05.04.2023 15:36

Действительно, это опечатка, она исправлена ​​(и это не изменило моей проблемы).

Jules Le Lay 05.04.2023 15:47

Да, я добавил два набора ресурсов в служебный блок. Я хотел бы захватить ресурс из каждого из пулов набора. Например, если логическое значение представляет природу продукта, я хотел бы захватить рабочего с машиной, если логическое значение истинно, а если оно ложно, 1 рабочего и еще одну машину. Я добавляю скриншот ресурса, установленного в вопросе.

Jules Le Lay 05.04.2023 15:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я вижу два решения. Проще было бы иметь два разных служебных блока и SelectOutput перед ними, чтобы выбрать, какой блок использовать, на основе значения agent.bool, примерно так:

Если по какой-то причине вы не можете использовать отдельные блоки Service, то вам необходимо установить наборы ресурсов программно. Вам нужно вызвать свою функцию в разделе «Наборы ресурсов» блока (в этом случае вам не нужно использовать раздел «Настроить выбор ресурсов»):

Функция selectResourceSet(boolean getType1) должна возвращать тип ResourcePool[][]. В этом случае тело функции выглядит следующим образом, где getType1 — логический аргумент, который принимает функция:

ResourcePool[][] choice = {{resourcePool2, commonResourcePool}};
if (getType1) choice[0][0] = resourcePool1;
return choice;

Это работает только в том случае, если вам нужно захватить 1-1 единицу из каждого набора, но я надеюсь, что это поможет вам найти правильное решение.

Большое спасибо, это очень помогает. Поскольку мне нужно захватить по 1 юниту из каждого пула, я реализую второе предложенное вами решение. Я не знал, как установить наборы ресурсов программно, спасибо, что поделились этим решением и за ваши полезные комментарии.

Jules Le Lay 06.04.2023 11:16

Другие вопросы по теме