干货 | AnyLogic建模仿真介绍+武汉疫情案例实战
文案 向柯玮
审核修改 邓发珩
前言
多方法?系统仿真?都是些啥啊?

别急,今天就让小玮陪你一起走进一款多方法仿真软件AnyLogic,来了解了解多方法仿真是什么以及简单的使用AnyLogic这样的多方法仿真软件。

目录
前言
目录
系统评估方法
测量方法
解析方法
仿真方法
为什么要使用仿真建模
仿真建模方法
系统动力学
离散事件
智能体
AnyLogic的基本使用
什么是AnyLogic
下载安装
案例简介
系统评估方法
这是一个非常直观的概念,大家可以从字面上就可以知道系统评估的意思,没错就是对我们的系统的结果进行一定程度上的评估。
常用的评估方法只要有以下三种。
测量方法

利用测量工具。直接获得系统指标值。例:使用尺子测量长度。使用秒表获得100米跑时间。
解析方法

利用公式。简单计算获得系统指标值。例:计算圆周长公式 L = 2×π×r 单服务系统(到达泊松分布,服务指数分布)。平均等待时间W=λb²/(1-λb)。
仿真方法

利用计算机。对系统的结构、功能和行为 等进行动态性比较逼真的模拟仿 真获得系统相关指标值。例:利用AnyLogic仿真建模。
为什么要使用仿真建模
我们可以通过一个例子来说明我们为什么要使用仿真建模。
去银行办理业务,平均每小时10位客户,柜台只有1名柜员,平均服务时间为5分钟,我们需要求出平均的等待时间。

在这里我们可以使用数学公式

但是我们可以知道这只是假设每个人都是独立的前来,如果是几个人一块儿来呢?

如果柜员有多个呢?如果服务时间有不同的分布呢?这些问题综合起来,即便是一个很简单的系统,我们也很难获得一个解析解
而且,在现实生活往往会更加的复杂
- 只有一些特定的员工可以做一些交易
- 客户可能被引导给其他员工
- 出纳员可能共享资源
- 如打印机或复印机
- 不同的员工可能有不同的技术和能力
- 等等……

这些让我们几乎不可能从原来的方法中获得我们满意的结果。
这个时候,有可预见的复杂性和保证结果的分析方法就是:仿真建模
仿真建模方法
介绍使用仿真建模的原因,下面我们来讨论讨论建模的方法。
系统动力学
通常用于长期、战略性模型。假设被构建对象高度聚合:人、产 品、事件及其他离散物品在模型中 用数量代表。
比如说现在武汉疫情的变化趋势,我们就可以通过系统动力学来进行建模。

离散事件
我们周围的世界表现是“连续 的”,分析连续的过程是,合适的 做法是对连续的本质进行抽象,只 考虑那些系统过程中“重要的”时 刻和时间。
比如说供应链中的问题,我们就可以通过离散事件来进行建模。

智能体
以个体为中心的建模。确定智能体(人、建筑物、产品等),定义其行为(驱动力、状态、行为等),将其放到一个中心环境中,或可建立连接。则系统层(整体)行为就展现为 很多个体行为交互的结果。
比如说我们之前举的银行办理业务的模型,我们就可以通过智能体来进行建模。
AnyLogic的基本使用
前面介绍了一些关于仿真建模的基本知识,现在我们来介绍咱们的工具。
什么是AnyLogic
正所谓工欲善其事,必先利其器,有一款高效的建模工具,会对我们的工作产生巨大的便利,那么今天给大家介绍的就是一款建模神器AnyLogic。
这是一款100%基于java的软件,所以为了建立一个比较酷炫的模型,还是很有必要了解一定的java知识。

下载安装
首先我们前往AnyLogic官网[1],点击右上角的download进行下载。

在安装的过程中我们要注意不要点击install,而是点击下面的按钮,这样我们就可以选择软件语言,当然,我们也可以在这里直接点击install,在进入软件之后再调节语言,但是能简便一点是一点嘛。
设置好安装路径之后就可以打开软件了。点击新建模型,设置好模型名称和模型路径,我们就相当于正式进入了AnyLogic模型的建设了。
把鼠标放在左侧图标处,我们就可以看到我们的工具箱。有很多东西,在接下来,我们通过一个简单的例子来让大家熟悉熟悉基本操作。

案例简介
本次我们的案例是武汉疫情的SIR简易模型,我们采用的方法是系统动力学。本次案例的效果如下:
在本例中,我们简单的把疫情的几个模块分为
- 易感染者
- 感染者
- 移出者(包括死亡者和治愈者)
参数有:
- 总人口=5000
- 接触人数=10
- 传染概率=0.1
- 疾病周期=10
在最初,我们认为
- 易感染者=总人口-1(初始只有一个感染者)
- 感染者=(初始为1)
- 移出者=(初始为0)
这个过程中,我们认为:
- 感染者的增加规律为(接触人数感染者/总人口传染概率*易感染者)
- 移出者的增加规律为(感染者/疾病周期)
(这些不是很严谨的设法,只是单纯做个案例讲解--)
下面我们开始。
把鼠标放在左侧,我们可以看到系统动力学的选项,点一下就可以看见系统动力学的工具栏。
首先用左键拖动一个存量出来,然后按住ctrl键并用左键拖动存量,我们可以发现,我们复制了一个存量出来,我们需要三个存量,所以我们需要再拖一次。
在这里我们需要解释一下存量的意思,顾名思义,其实就是储存变量的意思,其实就是编程意义上的变量,那么我们在之前说的参数其实就是常变量。
这些模型我们是可以随意变化大小的,我们做一些调整,然后给这些存量进行命名。

然后我们再拖动参数图像出来,按照我们之前的参数设置,一共应该有4个参数,拖出来,复制,命名。

这个时候我们不要急,我们现在需要给这些存量进行赋初始值,对参数赋默认值。用鼠标点击存量在右侧窗口我们可以看到赋值处。依次填入我们的初始值。

对于参数,我们需要点击前面的那个点,点击后面的文字是不起作用的,需要点击前面的点,记住奥。同样的填入初始值。

其实在这个面板,大家就可以更加清晰的理解到这个参数的意义了吧?因为看到了类型嘛。很容易就可以和程序联系起来。
但是,到目前为止,我们还不够,我们要让各个存量,参数之间建立联系,这个时候,我们就需要借助流量这个东西了。

双击从一个存量中间的点拉到另外一个存量中间的点,我们就可以看到生成了一个箭头。
我们是可以对箭头进行命名的,先点击箭头,然后就可以命名了。

在这里我们介绍一下流量的意思,就是类似于一个管道,把一个存量中的东西按照一定的规则转移到另外一个存量中去。
我们点击箭头,可以出现以下界面。

在flow位置就是我们的规则,在之前我们已经介绍了从易感染者到感染者的规则是(接触人数感染者/总人口传染概率*易感染者),填进去就可以了。
但是,这个时候我们会发现在flow的边框那里出现了一个红色的小x,这是因为我们还没有让流量和我们相应的参数建立起关系。

点击处于灰色位置的X,我们就可以让参数和流量建立起联系了,当我们把所有的联系建好了以后,我们会出现如图所示的画面。

在这个时候,我们差不多已经建立了一个简单的模型,我们点击运行就可以看到我们的程序了(要记住点击左下角的启动按钮),会出现下面的画面。

但是呢,我们可能觉得这个还不是很酷炫,我们还可以加一些数据分析的东西进去。
回到我们的主程序,选择工具栏中的分析。
选择时间折线图或者别的图,其实原理都是一样的,我们在这里介绍一下时间折线图的使用。
还是老样子,我们把时间折线图拖出来,就可以设置我们的参数名称以及值的大小。
我们发现,这里面只有两个值让我们填,那么有的时候如果我们有更多的怎么办呢?其实点击下方的“+”好就可以了。

再次运行程序就差不多完成了本次的建模,其实还有更多更复杂的操作,在这个位置,我们先不介绍了,以后有机会会再给大家介绍的。
最终的一些展示。

中国加油,武汉加油!

参考资料
[1]AnyLogic官网: https://www.anylogic.com/