首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++代码设计中的多agent系统

C++代码设计中的多agent系统
EN

Stack Overflow用户
提问于 2010-08-30 19:15:41
回答 4查看 2.7K关注 0票数 4

我有一个用C++编写的模拟,在这个模拟中我需要维护一个可变数量的代理,而且我在决定如何很好地实现它时遇到了困难。每个特工看起来都类似于:

代码语言:javascript
复制
class Agent{
public:
    Vector2f pos;
    float health;
    float data[DATASIZE];
    vector<Rule> rules;
}

我需要在我的模拟中保持一个可变数量的代理,以便:

最好,代理的数量没有上限--我可以轻松地添加一个代理-- agents.

  • (edit)

  • --我可以在某种条件下轻松地删除任何代理(例如,health<0)--

  • --我可以轻松地迭代所有代理并做一些事情(比方说,agents.

  • (edit)--我可以使用openMP并行工作,因为很多更新都比较昂贵,但是完全独立于其他的agent --)代理的顺序根本不重要!G 214/code>

代理应该使用什么样的容器或设计原则?直到现在,我还在使用向量,但我认为很难从这个结构中抹去:我需要经常做的事情,因为事情一直在消失。有什么可供选择的吗?我想到了一些类似List的东西,但我不认为它们可以并行化,因为它们是作为带有迭代器对象的链接列表实现的?

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-30 19:50:55

直到现在,我还在使用向量,但是我认为很难从这个结构中抹去:我需要经常做的事情,因为事情总是在消失。

在模拟的每一步中,你预计会有多少人死亡?对于一个人来说,“无时无刻不在”对计算机来说仍然是非常罕见的。例如,如果模拟的每一步处理数千个代理,但平均每几个步骤只有一个代理死亡,那么代理死亡是一个小事件。有了这些数字,您的程序处理活代理的时间要远远超过处理死代理的时间,因此担心删除死代理的性能可能根本不值得。如果使代理去除效率更高最终会导致正常代理迭代和处理效率降低(而代理去除相对较少),那么这可能是一个糟糕的权衡。

另一方面,如果每个模拟步骤都有大量代理生成并死亡,那么您可能希望确保这些事件能够得到有效的处理。所以这真的取决于你想要处理的数字类型。

我的一般建议是继续使用std::vector (只要它适合您设计的其余部分),除非您真的期望每一步与代理总数相比会有相当多的代理死亡。

票数 3
EN

Stack Overflow用户

发布于 2010-08-30 19:25:16

当你死后,你可以把特工留在名单上,准备重新使用。不要担心容器的收缩,并且保留向量的好处。您可以保留一个指向死/可重用代理的单独的指针堆栈,当一个代理死亡时,只需按下它,就可以弹出一个来重新获得一个新的代理。

代码语言:javascript
复制
foreach Agent {
    if (agent.health > 0) // skip dead agents
        process rules
票数 5
EN

Stack Overflow用户

发布于 2010-08-30 19:31:29

列表应该很好。它可以并行化,因为插入或删除元素不会使其他迭代器失效(当然,指向被移除的元素的迭代器除外)。

如果不需要向后遍历,slist与list一样好,而且速度更快一些。

如果您不关心元素的顺序,请使用set。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3603465

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档