6

我是模拟世界的新手,想了解程序员如何用java开发真正的模拟项目。我会使用日食。谁能指出我需要知道的其他事情(例如其他软件包、软件等及其用途)?

我担心这个问题可能看起来有点模糊,因为不清楚我在谈论哪种类型的项目。但作为一个新手,让我说这是开始如何编写模拟项目。

4

6 回答 6

11

如果您正在为离散事件模拟或为衍生品定价的模拟模型构建Monte-Carlo 模型,您应该会发现已经有大量框架代码。如果您正在进行数值模拟,例如有限元模型,您的模拟将基于矩阵计算库。 存在其他类型的模拟,但这是最可能的两种情况。

我从来没有写过有限元模型,对这些几乎一无所知,尽管我确实有机会将一个移植到DEC Visual FORTRAN。尽管该程序(SAFIR,如果有人关心的话)是用法语注释的,移植练习包括修改两个日期函数,总共 6 行 FORTRAN 代码 - 并编写一个 makefile。

蒙特卡洛模型包括测量一些基本人口以获得一个或多个感兴趣变量的分布。然后,您采用具有良好统计几何特性的伪随机数生成器( Mersenne Twister算法被广泛用于此)并编写一个函数将其输出转换为具有适当分布的随机变量。除非您的变量具有非常不寻常的分布,否则您 可能会找到执行此操作的函数。

然后,您构建或获得一个模拟框架并编写一个例程,该例程采用随机变量并执行您想要为模型执行的任何计算。您运行它,存储每个模拟的结果,直到误差在某个所需的容差范围内。之后,您从模拟模型的所有运行中计算统计数据(均值、分布等)。

网络上有很多资源,还有很多关于模拟建模的书籍,尤其是在衍生品定价领域。你应该四处寻找,看看你能找到什么。

顺便说一句, Python上的random模块具有许多发行版的转换功能。如果你想要一个,你可以得到它并将适当的转换函数移植到 java。您可以使用具有相同随机数种子的 python 的输出来测试 java 的正确性。

于 2009-02-07T12:26:58.697 回答
8

对于可以建模为在特定时间发生的单个事件的问题,离散事件模拟是一个不错的选择。主要活动有:

  • 根据经验数据随机生成时间和持续时间,以及
  • 在模拟运行时累积统计数据。

例如,您可以将停车场中的活动模拟为汽车的进出以及由于车库已满而无法进入的客户的流失。这可以通过两个模型类,一个 Car 和 Garage,以及三个基础设施类,一个 Event 类(如下所述),一个管理事件的 Schedule 和一个用于积累数据的 Monitor 来完成。

这是它如何工作的简要草图。

事件

Event 有一个时间,表示调用特定类的对象的特定方法。

日程

Schedule 保留一个事件队列,按事件时间排序。时间表通过一个简单的循环来驱动整个模拟。只要还有剩余的事件(或直到标志着模拟运行结束的事件):

  1. 从队列中取出最早的事件,
  2. 将“世界时钟”设置为该事件的时间,并且
  3. 调用事件指定的任何操作。

Car 类包含到达间隔和停留时间的统计信息。

当汽车到达时,它:

  1. 用监视器记录它的到来,

  2. 查阅世界时钟,确定下一辆车应该在多长时间之前到达,并将该到达事件发布到时间表上。

  3. 询问车库是否已满:

    1. 如果满了,汽车会在监视器上记录它的离开作为失去的客户。

    2. 如果没有满,汽车:

      1. 使用监视器记录其条目,

      2. 告诉车库它已经进入(以便车库可以减少其可用容量),

      3. 确定它将停留多长时间,并将其离开事件与时间表一起发布。

当汽车离开时,它:

  1. 告诉车库(这样车库可以增加可用容量),并且

  2. 用监视器记录它的离开。

车库

车库跟踪当前在里面的汽车,并知道它的可用容量。

监视器

监控器会跟踪您感兴趣的统计数据:客户数量(成功到达的汽车)、丢失的客户数量(在地段已满时到达的客户)、平均停留时间、收入(基于收取的费率)停车)等。

模拟运行

通过将两个事件放入计划中来开始模拟:

  1. 第一辆汽车的到来(通过实例化一个汽车对象并调用它的“到达”事件来建模)和

  2. 模拟结束。

重复基本的模拟循环,直到遇到模拟结束事件。此时,要求车库报告其当前居住者,并要求监视器报告会话的整体统计数据。

于 2009-02-07T13:30:25.370 回答
1

简短的回答是情况而定。

除非你能把问题说得更具体,否则没有办法给出答案。

你想模拟什么?

例如,如果你想模拟两个数字相加,你可以使用类似的方法:

a = b + c;

如果您想模拟球的弹跳,您可以使用一点数学方程式和图形库来实现。

如果你想模拟一个网络浏览器,你也可以这样做。

所以确切的答案取决于你想做什么模拟。

于 2009-02-07T09:59:04.297 回答
0

Come up with a problem first.

There's no such things as a generic "simulation". There are lots of techniques out there.

If you're just a gamer who wants to have pseudo-physics, maybe something like this would be what you had in mind.

于 2009-02-07T15:42:11.373 回答
0

这是一个老问题,但对于 Java 中的模拟,我刚刚安装并测试了泰恩河畔纽卡斯尔大学 Mark Little 的 JavaSim。据我所知,如果您有一个可以转换为离散事件模拟的模型,它会非常有效。请参阅 Mark 的网站http://markclittle.blogspot.com.au/2008/03/csimjavasim.html。我还尝试使用 Desmo-J,它非常广泛并且具有 2-D 图形模式,但无法在 Mac 上的 JDK 1.6 下运行。

于 2012-09-29T10:15:01.810 回答
0

看看 Repast Symphony:http ://repast.sourceforge.net/repast_simphony.html

“Repast Simphony 2.0 Beta 于 2010 年 12 月 3 日发布,是一个紧密集成、丰富交互、跨平台的基于 Java 的建模系统,可在 Microsoft Windows、Apple Mac OS X 和 Linux 下运行。它支持极其灵活的开发用于工作站和小型计算集群的交互代理模型。 

Repast Simphony 模型可以开发成几种不同的形式,包括 Logo 的 ReLogo 方言、点击式流程图、Groovy 或 Java,所有这些都可以流畅交错,也可以导入 NetLogo 模型。

Repast Simphony 已成功应用于许多应用领域,包括社会科学、消费品、供应链、未来可能的氢能基础设施和古代行人交通等。”

于 2011-11-24T21:24:13.433 回答