我是模拟世界的新手,想学习程序员如何在java中开发真正的模拟项目.我会用eclipse.任何人都可以指出我需要知道的其他事情(例如其他包裹,软件等及其目的)?
我担心这个问题可能看起来有点模糊,因为我不清楚我在谈论哪种类型的项目.但作为一个新手,让我说开始如何编写一个模拟项目.
如果你正在建设一个蒙特卡罗模型的离散事件仿真和仿真模型定价的衍生品,你会发现有一个身体的框架 代码已经在那里.如果您正在进行数值模拟,例如有限元模型,那么您将基于矩阵 计算库进行模拟. 存在其他类型的模拟,但这些是最可能的两种情况.
我从来没有写过有限元模型,对这些模型几乎一无所知,尽管我确实有机会一次将一个端口移植到DEC Visual FORTRAN.虽然程序(SAFIR,如果有人关心)用法语注释,但移植练习包括修改两个日期函数,总共6行FORTRAN代码 - 并编写一个makefile.
蒙特卡罗模型包括测量一些基础种群以获得一个或多个感兴趣变量的分布.然后你得到一个具有良好统计和几何属性的伪随机数生成器(Mersenne Twister算法广泛用于此)并编写一个函数将其输出转换为具有适当分布的随机变量. 您可能能够找到执行此操作的库函数,除非您的变量具有非常不寻常的分布.
然后,您构建或获取模拟框架并编写一个例程,该例程接受随机变量并执行您希望为模型执行的任何计算.运行它,存储每个模拟的结果,直到误差在某个所需的容差范围内.之后,您可以从模拟模型的所有运行中计算统计数据(均值,分布等).
网上有相当多的资源,还有很多关于模拟建模的书籍,特别是在衍生品定价领域.你应该四处寻找,看看你能找到什么.
顺便说一句random
,Python上的模块具有很多发行版的转换函数.如果你想要一个,你可以得到它并将适当的转换函数移植到java.您可以使用具有相同随机数种子的python的输出来测试java的正确性.
对于可以在特定时间发生的单个事件建模的问题,离散事件模拟是一个很好的选择.主要活动包括:
根据经验数据随机生成时间和持续时间,以及
在模拟运行时累积统计数据.
例如,您可以模拟停车场中的活动,作为汽车的进入和离开以及因车库已满而无法进入的客户流失.这可以通过两个模型类(Car和Garage)和三个基础结构类,一个Event类(如下所述),一个管理事件的Schedule和一个用于累积数据的Monitor来完成.
这是一个如何工作的简要草图.
Event有一个时间,表示在特定类的对象上调用特定方法.
计划保留事件队列,按事件时间排序.时间表通过简单的循环驱动整体模拟.只要有剩余事件(或直到标记模拟运行结束的事件):
从队列中取出最早的事件,
将"世界时钟"设置为该事件的时间,并且
调用Event指定的任何动作.
Car类保存了到达间隔和持续时间的统计数据.
当汽车到达时,它:
使用显示器记录它的到来情况,
咨询世界时钟,确定下一辆车应该到达的时间,并将该到达事件发布在附表上.
询问车库是否满员:
如果已满,则汽车会将其作为丢失的客户的离开记录在监控器上.
如果不满,汽车:
使用Monitor记录其条目,
告诉它已进入的车库(以便车库可以减少其可用容量),
确定它将保留多长时间,并将其离开事件与时间表一起发布.
当汽车离开时,它:
告诉车库(因此车库可以增加可用容量),和
记录它与显示器的离开.
车库跟踪当前内部的汽车,并了解其可用容量.
监视器记录您感兴趣的统计数据:客户数量(成功到达的汽车),丢失的客户数量(当地段已满时到达的人数),平均停留时间,收入(基于收取的费率)停车)等
通过将两个事件放入计划中来启动模拟:
第一辆汽车的到来(通过实例化Car对象并调用其"到达"事件来建模)和
模拟结束.
重复基本模拟循环,直到遇到模拟结束事件.此时,要求车库报告其当前居住者,并要求监测人员报告会议的整体统计数据.