跳转至

蒙卡程序框架设计

简单来说,蒙卡程序的核心就是对构型进行更新,然后通过测量以获得对应的观测量作为样本,不断重复这个采样过程,直到满足所需精度即可。

其中构型这个概念至关重要,如何将实际的物理构型一对一地映射到程序当中的数据结构,是值得深思熟虑的,这影响到之后的更新测量。对于更新,则是依赖于随机过程而进行的,而实现这一随机过程涉及到数据结构与算法的设计以及概率守恒等原理,这是一门大学问。

对于测量,则十分依赖于数据结构以及算法的选取。选择完测量的方式之后便是对样本进行数据处理,这其中涉及到热化步长的判定,观测量均值、误差以及关联的计算,对于大量样本还涉及对不同随机种子的数据进行合并等等。

相对来说比较固定化的部分:记录模拟时间的计时器,输入不同参数的输入器,输出数据文件的输出器,将程序的流程顺序组织在一起的模拟器,产生随机数的随机数产生器以及其他一些辅助函数或类等小零件

程序的封装

我们梳理一下上面提到的概念:

  • 构型
  • 均值观测量
  • 分布观测量
  • 计时器
  • 输入器
  • 输出器
  • 模拟器
  • 随机数产生器
  • 小零件

其中构型最为复杂多变,包括了如何利用数据结构进行构型及其基本属性的存储,如何通过算法进行构型的更新,以及其他一些外部接口:例如输出保存当前构型或是读取载入构型等。

其次是观测量的设计,通常分为均值观测量分布观测量

模拟器是程序的主舞台,通过输入器读取初始化参数,构建各种待表演的“角色”,协调大家相互配合,完成程序。

为了封装的程度更高,尽量不要设置过多的全局变量,将变量都限制在类内部,通过接口进行调用才是标准的做法。

下面按照程序的运行顺序进行详细说明:

计时器

输入器

输出器

模拟器

随机数产生器

构型

均值观测量

简单观测量

$${\rm Ave(O)} = \frac{\sum_i O_i}{N}$$

$${\rm Err(O)} = \sqrt{\frac{1}{N(N-1)}\sum_i (O_i - Ave(O))^2}$$

$${\rm Cor(O)} = \frac{\sum_i (O_{i} - Ave(O))(O_{i+1} - Ave(O))}{\sum_i (O_{i} - Ave(O))^2}$$

组合观测量

分布观测量

小零件

对于实际的程序,构型观测量是必要的部分,其余的都是灵活调整的。例如,可以将模拟器构型合并,从而更加方便地进行流程的设计和更改。