Ручное приведение агентов и доступ к его параметру типа SelectOutputOut в AnyLogic? - PullRequest
0 голосов
/ 24 января 2019

Я понял, что могу вставить разные типы агентов в один и тот же блок, изменив тип агента во всем процессе на общий Agent (работает хорошо, благодаря Эми). снимок

Но я застрял на том, как вытащить их с помощью ручного литья для процесса selectOutputIn1.Каждый тип агента имеет параметр с именем p_new_location с типом SelectOutputOut.

Что мне нужно, чтобы помочь

передать то, что эквивалентно agent.p_new_location, если правильно произнесено через selectOutputIn1.

Что я пытался

, создаваяфункция с ручным приведением:

if( agent instanceof Wife){
    return ((Wife)agent).p_new_location ;
} else if(agent instanceof Child_M){
    return ((Child_M)agent).p_new_location ;
} else if(agent instanceof Child_F){
    return ((Child_F)agent).p_new_location ;}

как это выглядит с ошибкой

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

Тип параметра в каждом классе выглядит точно так же, как this .А внутри симуляции это выглядит как this перед передачей значения и как this после передачи значения.Кроме того, Я заметил, что значение необычного типа параметра, такого как SelectOutputOut, не отображается во время симуляции , как показано здесь .Как вы можете видеть, параметры (age, countDb и taken) все вместе со своими значениями, но не p_new_location.

Решение

Спасибо Эми снова:)

Компилятор видит if / else if / else if.Что если ничего из этого не правда?Если ваш последний вариант if является единственным, просто измените его на else или вставьте соответствующий код для того, что вы хотите сделать.

Вот как теперь выглядит код

if( agent instanceof Wife){
    return ((Wife)agent).p_new_location ;
    } else if(agent instanceof Child_M){
        return ((Child_M)agent).p_new_location ;
    } else{
        return ((Child_F)agent).p_new_location ;}

Спасибо inAdvance;

1 Ответ

0 голосов
/ 24 января 2019

Да, AnyLogic может легко обрабатывать несколько типов агентов в одном блоке процесса.Несколько вещей, которые нужно иметь в виду:

  • Убедитесь, что блок процесса настроен на обработку универсального типа «Агент» или родительского класса «мама, папа, ребенок».
  • Так каку вас есть несколько типов агентов, проходящих через одни и те же блоки, вы должны быть готовы выполнить какое-то приведение, чтобы получить информацию, специфичную для любого класса.
  • Агенты AnyLogic не могут быть одновременно в более чем одном блоке потоковой диаграммы, даже если они могутбыть во многих коллекциях.Они также могут быть в NO блок-схемах.Прежде чем отправить агента в блок ввода, вы должны сначала удалить его из любого другого блока, в котором он находится (если он есть в одном).Например, если все ваши жены были в очереди, вам необходимо удалить агента-жены из очереди перед вызовом строки кода enter.take (жена).
...