2

我正在用 Java 创建一个基于代理的建模程序

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

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

有什么建议么?

谢谢!

编辑:

环境将是简单的二维的。将有从一个代理到数百个代理的任何地方。

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

第二次编辑:

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

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

4

3 回答 3

2

2000-2006 年间,我在荷兰公司 Tryllian 工作,该公司专门研究多智能体系统。该公司现在不活跃。

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

这是 Gossip 客户端的样子

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

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

我会在这个答案开始变得长之前停下来(-;

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

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

最后一个建议:考虑对简单代理进行建模的合理起点是通常与机器人相关的感知计划行为。

编辑:回复您的评论

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

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

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

祝好运并玩得开心点!

于 2011-09-11T08:23:12.250 回答
2

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

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

最后,NetLogo使您描述的内容变得非常容易。尽管可以将 NetLogo 与其他 Java 代码集成,但它有自己的小语言,可以进行非常快速的开发。

于 2011-09-12T02:56:01.143 回答
1

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

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

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

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

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

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

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

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

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

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

于 2011-09-13T00:52:33.200 回答