什么是系统
讨论仿真系统之前我们需要明确什么是系统,这个概念可以帮助我们理解边界和范围。
那么什么是系统?
德谟克利特的著作《世界大系统》有一段关于系统的阐述:
任何事物都是在联系中显现出来的,都是在系统中存在的,系统联系规定了每一个事物,而每一个事物又能反映系统的联系的总貌。
中国著名学者钱学森的观点是:
系统是由相互作用相互依赖的若干组成部分结合而成的,具有特定功能的有机整体,而且这个有机整体又是它从属的更大系统的组成部分。
词典对于系统的解释是:
组成一个复杂整体的一组互相作用、互相联系或者依存的事物。
用一个汽车总装线来举例,各种零部件通过传送设备(履带或者其他设备),再有工人(或者是机械手臂)按照顺序组装。在这个系统中,工人,机械手臂,零部件相互作用。履带的速度影响零部件的到达,进而影响装配,流水线自身的划分和设计又影响了整体效率。
从上面这个例子可以感受到我们看系统的时候有两个重要的点:
一是边界,即确认需要研究事物范围,比如货币的供应量从某种程度上也可能对流水线有影响,但是我们并不会考虑它。
二是抽象,针对研究内容的不同,需要考虑的事物的详细程度也是不同的,比如机械手臂的出产公司虽然也是一种外部输入,但是会被统一抽象为机械手臂,对于其的特征建模也可以按照平均来计算。
还有一种更通用的描述系统的方式,即三要素,分别为实体,属性和活动。实体确定了系统构成,属性描述了实体特征,而活动描述了系统内部的相互作用。
什么是仿真
仿真一般是指对现实中的系统进行模仿,观测并产生人造过程记录的过程。
仿真最早用于水利研究,逐渐用于航空、航天和原子能技术等领域。后来随着计算机技术的大力发展,扩展到各行各业。
针对互联网公司,特别是线上线下融合较深的业务,由于线上试错成本高,反馈周期慢,通过仿真可以很好服务以下几点:
- 业务形式新,基本没有可以参考的模型或者参数,加上缺少学术上的积累,仿真可以加速研究一个业务场景中复杂系统间的相互影响。
- 仿真由于是对真实系统的模仿,所以速度和外部参数是可以调整,且对真实系统无影响,可以快速安全进行实验或者验证,加深对于系统行为的理解。
- 仿真模型和实验的产出可能成为新知识的来源,用于优化业务。
仿真系统的构建方法
构建仿真系统流程如下:
系统建模
离散or连续
系统可以是离散,也可以是连续的。当然对于现实中的大多数系统,这两种变化都是共存的,一般我们取其中占多数的为准。
大部分自然系统都是连续系统,比如湖面的水位,由于降雨,自然蒸发等处于一个时刻变化的状态,而离散系统一般只在离散时间点发生变化的系统,绝对部分人造系统都属于离散系统。
除了特别的需要以外,大部分系统设计上都会做成离散系统,因为连续系统可以通过引入采样装置转为离散系统,比如上面提到的湖泊系统,就可以通过引入定时采样水质,水位等的装置让系统变成离散系统以方便处理。
确定核心要素
需要明确系统中的实体(包括属性),事件,活动。
我们以外卖配送来看,实体即骑手,顾客,商家,属性可能包括骑手速度,顾客位置,商家位置等,属性可以是从真实系统中获得,也可以是统计上的数据。
事件主要是对于整个配送有重要影响的,点外卖的时候有一些外卖APP会有进度提示,比如商家接单,商家出餐,骑手抢单,骑手送餐,送达顾客处等,当然这些只是展示出来的事件,系统内部可能更复杂,还有更多事件,确认核心要素的时候一般需要业务专家或者领域专家。
大部分系统单单靠事件就可以驱动了,但是有时候还需要明确活动。一般两个相邻且有先后顺序的事件,如果从逻辑上导致了状态的转移,那可以化为一个活动。比如外卖配送中从待取餐状态转移配送中状态,其实暗含了到店和取餐两个事件。活动并不是必须的,如果研究目的不涉及可以不关注。
确定仿真算法
目前有四种成熟仿真算法:
- 事件调度
- 活动扫描法
- 进程交互法
- 三阶段法
一个仿真系统可以采用一种算法,也可以混合多种使用。
仿真系统的时间由仿真钟控制,算法决定了仿真钟的推进方式。比如事件调度算法,就是每次推进一个固定的仿真钟步长,然后获取当前仿真钟上需要触发的事件,如果多个事件则按照优先级触发。
仿真钟的结束一般有两种,一种是终态仿真,即仿真钟在规定时间内停止,比如仿真一个小时的运行情况。另外一种是稳态仿真,这种仿真的仿真钟是无限的,停止条件由其他方式确定,比如某种特定的置信度达到一个阈值,则由外部停止仿真钟。
建立仿真模型
根据确定的仿真算法,梳理系统内部的状态变量和流转方式。再针对不同的事件确定事件对状态和实体属性的影响,明确事件间的相互影响。
用加油站来举例,车量入站,车辆等待加油,车辆加油完成,车辆离开就是一系列事件,期间可能的影响包括加油站内的车辆数量,可用加油枪的数量,剩余油量,收入等。
比如车辆开始加油事件发生时会在未来生成车辆加油完成这个事件,具体的完成时间需要通过统计学或者其他建模方式给出。
实现仿真系统
实现仿真系统主要有两个流派:
- 基于高级语言自研
- 基于仿真语言开发
还有一种就是从专业的支持公司购买仿真系统,并直接使用,比如anylogic,flexsim等。
自研就不用多说了,多用于新兴系统,且开发资源充足的公司。
仿真语言更适合成熟的系统,或者科研院校,比如Modelica (https://openmodelica.org)。
分析仿真结果
这个和仿真研究目的强关联,一般都是从仿真过程记录中加工获得结果数据。唯一需要注意的有随机性的仿真系统一次仿真只是一次抽象,要注意置信度。
仿真上云
仿真系统和普通的业务系统不同,它对于冷启动不敏感,资源需求大但是不均衡,同时仿真单个任务运行时间长。
一般仿真系统上云可以考虑的就是执行节点的动态伸缩,根据仿真任务的情况适当缩减或者扩容节点,按量付费。
另外还有一个可能的方向就是基于serverless,因为仿真系统本身可以基于事件驱动,搭配MQ可以通过事件来驱动function进行过程流转,中间过程可以落库,也可以写文件。由于没有具体操作过,效果还有费用上的对比没有数据,但是至少基于serverless的话伸缩性会很好。
参考
这里有一些公开的仿真应用:
- NASSCO船厂仿真:https://www.anylogic.com/capacity-analysis-with-anylogic/
- 应急灾害仿真:https://www.anylogic.cn/disaster-response-applications-using-agent-based-modeling/
- 京东的物流仓库仿真:http://www.sohu.com/a/301520549_649545
- 美团的配送仿真系统:https://tech.meituan.com/2017/10/11/o2o-intelligent-distribution.html
- 百度开源的阿波罗:http://apollo.auto/platform/simulation_cn.html
另外补充阅读: