共享离散 space 投影中不同类型代理的同步问题

Issue with Synchronisation of Agents from different types in a shared discrete space projection

我有一个关于不同代理同步的问题。

所以我有一个与 BaseAgent class 的共享上下文,正如教程针对我们在同一上下文中有超过 1 种代理类型的情况所建议的那样。然后我还有 4 个代理 classes,它们是基本代理 Class 的子代。对于它们中的每一个,我都有必要的可序列化代理包,并且在我的模型中 class 我也为它们中的每一个都有特定的包接收者和提供者。

所有这些代理都共享以下形式的离散空间投影:

repast::SharedDiscreteSpace<BaseAgentClass, repast::WrapAroundBorders, repast::SimpleAdder< BaseAgentClass > >* discreteSpace;

我的 4 种代理类型中有 3 种可以四处移动,我已经实施了它们的移动。但是,它们可以从一个进程移动到另一个进程,我需要使用 RepastHPC 教程 HPC:D03、步骤 02 中介绍的 4 个同步语句:代理移动 Space。

然而,我不确定如何实际同步它们,因为代理需要它们的特定提供者、接收者和可序列化包才能正确复制到其他进程中。我尝试执行以下操作:

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 共享相同的上下文和空间投影。

提前感谢您的帮助!

这里的目的是您将拥有一个可用于所有代理类型的包。例如,在 Zombies 演示模型中,包中包含代理 ID 组件的条目,以及 infected 和 infectionTime。最后两个只适用于人类特工而不适用于僵尸。

您提供和接收内容的方法应检查代理类型并采取适当的操作。例如,在僵尸模型中我们有

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 风格的模型,所以一些细节可能有所不同,但希望可以清楚地知道有一个包类型可以处理所有代理类型,并且您使用代理类型来区分提供方法中的类型。