Моделирование на основе агента AnyLogic: ClassCastException

Я работаю с агентной имитацией эпидемии инфекционных заболеваний в AnyLogic. В моей модели есть два типа агентов - Персона и Здание. Я пытаюсь написать функцию, которая подсчитывает количество инфекционных контактов, которые имеет агент типа "Персона" в любой данный момент времени. Ниже мой код для функции:

int infectedConnections = 0;

if (getConnections() != null)
    for (Agent a : this.getConnections())
        {
        Person p = (Person) a;

        if (p.IsCurrentlyInfected()) 
            infectedConnections++;
            }

return infectedConnections ;

Код компилируется без каких-либо ошибок, но во время выполнения он вызывает исключение java.lang.ClassCastException с сообщением: model.Building не может быть приведен к model.Person.

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

2 ответа

Решение

Если вы просто хотите игнорировать агентов типа Building, вы можете сделать следующее:

int infectedConnections = 0;

if (getConnections() != null) {
    for (Agent a : this.getConnections())
    {
        if(a instanceof Person) {
            Person p = (Person) a;

            if (p.IsCurrentlyInfected()) {
               infectedConnections++;
            }
        }
    }
}
return infectedConnections;

Проблема в том, что (Person) a; потерпит неудачу, если a это здание, а не человек.

Хотя ответ Роба решает вашу проблему, учтите, что Person а также Building соединения на самом деле являются "коренной причиной" ваших проблем: в общем, смешивание типов в наборе вещей является недостатком дизайна по типу причин, которые вы видите (и, вероятно, соединения ваших агентов с другими агентами Person или агентами Building два концептуально разных отношения).

В AnyLogic вы можете иметь несколько сетей на одного агента, а не только по умолчанию connections один, добавив дополнительные Link to agents элементы. Так, например, ваш Person агент может иметь один для семейных отношений (скажем, называется family присоединенный к Person агенты) и один для мест, где они живут / работают (скажем, называется workHomePlaces присоединенный к Building агенты); очевидно, я придумываю возможные цели этих сетей.

Тогда вы можете делать такие вещи, как family.getConnections() а также workHomePlaces.getConnections()избегать проблем, с которыми вы сталкиваетесь, и иметь более концептуально правильный дизайн.

В справке см. Агентное моделирование -> Взаимодействие с агентом -> Определение пользовательских контактных ссылок.

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