Моделирование на основе агента 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()
избегать проблем, с которыми вы сталкиваетесь, и иметь более концептуально правильный дизайн.
В справке см. Агентное моделирование -> Взаимодействие с агентом -> Определение пользовательских контактных ссылок.