Проблема с синхронизацией агентов разных типов в общей проекции дискретного пространства

У меня проблема с синхронизацией разных агентов.

Итак, у меня есть общий контекст с классом 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, поэтому некоторые детали могут отличаться, но, надеюсь, ясно, что существует один тип пакета, который может обрабатывать все типы агентов, и что вы используете тип агента, чтобы различать типы в ваших методах предоставления.

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