Проблема с синхронизацией агентов разных типов в общей проекции дискретного пространства
У меня проблема с синхронизацией разных агентов.
Итак, у меня есть общий контекст с классом BaseAgent, как в учебнике, предложенном для случая, когда у нас есть более 1 типа агента в одном контексте. Затем у меня есть еще 4 класса агентов, которые являются дочерними элементами базового класса агентов. Для каждого из них у меня есть необходимые сериализуемые пакеты агентов, и в моем классе модели у меня также есть определенные приемники и поставщики пакетов для каждого из них.
Все эти агенты имеют общую дискретную пространственную проекцию вида:
repast::SharedDiscreteSpace<BaseAgentClass, repast::WrapAroundBorders, repast::SimpleAdder< BaseAgentClass > >* discreteSpace;
Три из моих 4 типов агентов могут перемещаться, и я реализовал их движения. Однако они могут перемещаться из одного процесса в другой, и мне нужно использовать 4 оператора синхронизации, которые были представлены в руководстве RepastHPC HPC:D03, Шаг 02: Агенты, перемещающиеся в пространстве.
Однако дело в том, что я не уверен, как их синхронизировать, поскольку агентам потребуются их конкретные поставщики, приемники и сериализуемые пакеты, чтобы их можно было правильно скопировать в другой процесс. Я попытался сделать следующее:
discreteGridSpace->balance();
repast::RepastProcess::instance()->synchronizeAgentStatus<BaseAgentClass, SpecificAgentPackage, SpecificAgentPackageProvider, SpecificAgentPackageReceiver>(context, *specificAgentProvider, *specificAgentProvider, *specificAgentReceiver);
repast::RepastProcess::instance()->synchronizeProjectionInfo<BaseAgentClass, SpecificAgentPackage, SpecificAgentPackageProvider, SpecificAgentPackageReceiver>(context, *specificAgentProvider, *specificAgentProvider, *specificAgentReceiver);
repast::RepastProcess::instance()->synchronizeAgentStates< SpecificAgentPackage, SpecificAgentPackageProvider, SpecificAgentPackageReceiver >(* specificAgentProvider, * specificAgentReceiver);
Однако при запуске я получаю следующую ошибку:
===================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= PID 3224 RUNNING AT Aleksandars-MBP
= EXIT CODE: 11
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault: 11 (signal 11)
This typically refers to a problem with your application.
Please see the FAQ page for debugging suggestions
Поэтому я не уверен, как на самом деле синхронизировать агенты для каждого конкретного типа агентов, поскольку все они используют один и тот же контекст и пространственную проекцию с BaseAgentClass.
Спасибо за помощь заранее!
1 ответ
Цель здесь состоит в том, чтобы у вас был один пакет, который можно было бы использовать для всех типов агентов. Например, в демонстрационной модели Zombies в пакете есть записи для компонентов идентификатора агента, а также Infected и InfectTime. Последние два относятся только к человеческим агентам, а не к зомби.
Методы, с помощью которых вы предоставляете и получаете контент, должны проверять тип агента и предпринимать соответствующие действия. Например, в модели зомби у нас есть
void ZombieObserver::provideContent(RelogoAgent* agent, std::vector<AgentPackage>& out) {
AgentId id = agent->getId();
AgentPackage content = { id.id(), id.startingRank(), id.agentType(), id.currentRank(), 0, false };
if (id.agentType() == humanType) {
Human* human = static_cast<Human*> (agent);
content.infected = human->infected();
content.infectionTime = human->infectionTime();
}
out.push_back(content);
}
Здесь вы можете видеть, что мы заполняем AgentPackage некоторыми значениями по умолчанию для зараженных и инфекций, а затем обновляем их, если агент относится к типу «Человек». Это модель в стиле ReLogo, поэтому некоторые детали могут отличаться, но, надеюсь, ясно, что существует один тип пакета, который может обрабатывать все типы агентов, и что вы используете тип агента, чтобы различать типы в ваших методах предоставления.