【问题标题】:Agent-Based Modeling in Java - Animation QuestionJava中基于代理的建模 - 动画问题
【发布时间】:2011-09-11 07:11:19
【问题描述】:

我正在用 Java 创建一个 agent-based modeling program

我正在尝试确定动画代理的最佳方式。我见过几个使用网格的示例,允许每个代理一次只占用一个单元格。

我正在寻找更流畅的东西,代理可以在各个方向“流动”穿过窗口。

有什么建议吗?

谢谢!

编辑:

环境将是简单的二维的。从一个代理到数百个代理不等。

我想将代理表示为带有某种方向指示的小圆圈(具体情况无关紧要;关键是代理需要能够旋转)。

第二次编辑:

我目前正在阅读本教程:http://www.giosoft.net/Development/Java-Asteroids-Tutorial.html

看起来它会帮助我完成我想要完成的事情。

【问题讨论】:

  • 空间数据结构很多。在不了解您的要求的情况下,我们无法判断哪些适合您。例如,代理如何与彼此/环境交互?您如何描述环境以使其变得简单?
  • 已编辑以添加详细信息。谢谢。
  • 这里有一个类似的例子。 xjtek.com/models/?archive=pedestrian_models/…

标签: java animation graphics 2d agent-based-modeling


【解决方案1】:

您可能想看看MASON。它是一个用于多智能体模拟的开源 Java 平台。一些演示(例如 MAV)展示了如何完全按照您的描述进行操作。

RePast 是另一个可以选择的 Java 平台。

最后,NetLogo 让您的描述变得非常简单。虽然可以将 NetLogo 与其他 Java 代码集成,但它有自己的小语言,可以进行非常快速的开发。

【讨论】:

  • 我下载了 RePast 但发现它太臃肿了。这个来自 MASON 的 Keep-Away 演示(我已经简要调查过)似乎包含很多我需要的功能。谢谢!
【解决方案2】:

在 2000-2006 年间,我在 Tryllian 工作,这是一家专门从事多代理系统的荷兰公司。该公司现在不活跃。

Tryllian 的第一个想法是构建基于代理的搜索设备(称为 Gossip)。它有一个图形客户端应用程序,带有许多颜色鲜艳的圆形代理和可爱的眼睛。每个特工的背部都有一个空隙,可以拖出一个“背包”。背包可以包含一个搜索查询和许多搜索结果(URL、文档、图像等)。要进行搜索,用户必须将一个背着准备好的背包的特工拖到“互联网门户”上,这是一种科幻电影中星空背景的登陆舱门。然后,代理将被“传送”到 Tryllian 服务器,在那里它会被服务器上的“管家代理”引导到“主题室”。在房间里,它可以与其他代理交互并交换搜索兴趣和结果。看来你仍然可以下载八卦here

后来 Tryllian 决定开发一种代理开发工具包 (ADK),使用它可以更轻松地创建像 Gossip 这样的代理应用程序。它为编程代理行为提供了一个基于任务的模型。您的代理会收到很多事件(agentStarted 等),并且在事件处理程序中可以添加任务,这些任务反过来也会收到事件(taskStarted 等),并且可以安排更复杂的行为(可能以子任务的形式)。 API 做得非常好。

在我看来,ADK 的关键特性是它提供的代码移动性;代理不仅可以在其本地 ARE(代理运行时环境)上的虚拟房间之间移动,还可以移动到另一台服务器。这涉及到类序列化和多类加载器解决方案,这在当时是非常具有革命性的(我们喜欢这样想)。此功能支持将代码带到数据中的设计,而不必到处传递数据(我所知道的大多数企业系统的主要功能仍然是传递数据)。例如,Tryllian 开发了一个远程审计应用程序,它允许审计公司的分析人员将审计规则编码到代理中,并将其安全地发送到客户的服务器以监控流程。

我会在这个答案开始之前停止真的长(-;

这可能比您现在想要实现的要多一点。如果您可以更具体地提出您的问题,我可以就如何设置您的多代理系统提供一些建议(如何为代理之间的消息传递建模也是一个非常有趣的话题 - 哦,对不起,我说过我会停下来。 ..)。

您的多代理系统的目的是什么?代理会做什么?它会在一台机器上运行,还是分布式?代理的行为/规则是硬编码的、可配置的还是完全动态的?

最后一个建议:考虑建模简单代理的合理起点是sense-plan-act,它通常与机器人相关联。

编辑:回复您的评论

Tryllian 代理模型更侧重于消息传递,而不是与模拟物理环境的紧密交互。查看您发布的示例站点,性能似乎非常重要,尤其是当代理数量增加时。您不会利用 Tryllian 代理的优势:代码移动性、基于任务的编程、通用性,因此我认为它不是此类模拟的最佳工具。

您提到了“网格”与“平滑”方法。我认为在计算机模拟中,您总是需要在某种离散的坐标系统中表示代理的大小、坐标、速度和方向。因此总会有某种网格,但您可以将“单元格”变小以使其看起来更平滑。

也许在游戏领域可以找到一些有用的资源? (精灵、碰撞检测等)

祝你好运,玩得开心!

【讨论】:

  • 非常有用的回复。你能补充一些关于动画的细节吗?你可以看到一个类似于我想要完成的事情的例子。这是我最近对我原来的问题的评论。谢谢!
  • 多智能体系统与基于智能体的建模有明显不同的重点。似乎您的答案集中在前者,但@Peter 对后者感兴趣。
  • 此回复未解决问题。
  • @David 你是对的。在彼得用xjtek.com 的链接添加评论后,我意识到了这一点。我想我在那里有点得意忘形(-:仍然彼得现在正在阅读关于小行星游戏的教程,所以我想我的最后建议可能仍然有用。
  • @Adrinn 虽然这可能不是正确的论坛,但我想了解更多关于基于代理的建模和多代理系统之间潜在的相似之处和不同之处。
【解决方案3】:

我不知道你到底在问什么。也许您正在问(或打算问)这三个问题?

  1. “对于我的基于代理的模型,我应该如何在空间中表示我的代理?”

    在进行基于代理的建模时,您必须以对您的领域有意义的方式设计您的模拟。除非他们对您的领域有所了解,否则这里没有人可以就如何选择空间给您一个合理的答案。

    您可能会使用 2 或 3 维可视化。您可能想要使用环形空间。您可以强加一个网格(例如离散的 x 和 y 维度),或者您可以允许连续空间。你可能有一些关于邻近性的规则(例如,一次只有一个代理可以占用一个网格空间)。您可能想遵循其他一些规则。

    同样,关键是找到一组对您的域有意义的规则。我建议找到最简单的规则集,这些规则仍然可以创建对您的模型至关重要的行为类型。

  2. “我应该考虑哪些基于 Java 的动画库?”

    一旦您确定了基于代理的模型的空间方面,然后您将准备好决定使用哪些技术来显示它。这是一个广泛的主题,但我建议您查看 Processing、Piccolo2D、JavaFX、Java 2D 和 Java 3D。

    实际上,这个问题比我上面所说的要广泛一些。您可能会关心的不仅仅是动画。基于代理的模型可以由 GUI 和/或命令行界面驱动。如果您想要一个 GUI,您将需要各种输入控件,以便可以调整模型参数。您至少需要考虑 Swing 和 JavaFX。

  3. “我应该使用哪些工具包或库来帮助我构建基于代理的模型?”

    Wikipedia comparison of agent-based modeling tools 是迄今为止我见过的最全面的列表,但它可能会让您不知所措。根据我的经验,同事和同行倾向于使用以下一项或多项:NetLogo、RePast Simphony、AnyLogic 或 MASON。有些人(包括我自己)经常发现自己动手做起来更快。如果你走这条路,我强烈建议你看看 Ruby、Scala 或 Python 等高级语言,让自己专注于领域逻辑而不是低级语言细节。

【讨论】:

  • 感谢您的回复。我希望在不使用网格单元的情况下创建一个二维环境(至少,不使用网格单元明显)。我发布的小行星示例展示了具有全向运动的流畅动画。我曾广泛地使用过 Java(尽管从未使用过动画),而且我知道如何创建 GUI。此外,我已经下载了 RePast,我目前正在浏览一些相关的教程,以便了解事情是如何完成的。然而,不想要 RePast 生成的 ~70mb 模型,这导致我尝试推出自己的解决方案。
  • 嗨,Peter,鉴于您有 Java 经验,我认为您可以自己动手做。只需从您认为有用的 ABM 框架中窃取概念即可。就个人而言,我深受 Rails 方法的影响:构建一堆满足您需求的应用程序——只有在您发现一种模式之后,才应该提取一个框架。我还发现 RePast 有点迟钝。也就是说,构建和交流框架并不容易。我认为 ABM 世界应该继续思考这个挑战。