1

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

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

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

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

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

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

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

提前感谢您的帮助!

4

1 回答 1

0

这里的目的是您将拥有一个可用于所有代理类型的包。例如,在 Zombies 演示模型中,包具有代理 id 组件的条目,以及感染和感染时间。最后两个仅适用于人类特工,不适用于僵尸。

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

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

于 2022-02-22T18:51:59.607 回答