☰
系统动力学入门实战:三级物流系统建模与Vensim避坑指南
2026/10/28 8:01:43 网站建设 项目流程

系统动力学这门东西,我第一次接触的时候其实是被一张“存量流量图”劝退的。那会儿觉得这不就是把流程图换了个画法吗,能有多难。结果真上手做三级物流系统的模型,才发现自己完全想错了——它压根不是画图工具,而是一套用来推演“系统为什么会出现反直觉行为”的思维框架。你给它一个补货规则,它能告诉你三年后库存会崩;你调一个延迟参数,它能让你看到本来平稳的订单为什么会突然震荡。这种“提前把未来跑一遍”的能力,对做供应链、做运营、做政策评估的人来说,价值相当大。

这篇内容我想聊的是系统动力学入门,以及Vensim这个工具在实际建模时那些文档里不太写、但一用就卡壳的细节。核心案例就用三级物流系统——从工厂到区域仓、再到前置仓、最后到终端门店这条链。这个案例的好处是足够典型:它有延迟、有反馈、有放大效应,几乎把系统动力学里最容易踩的坑都占全了。不管你是刚听说存量流量图的新手,还是已经能画出模型但总调不出合理结果的老手,下面这些内容应该都能对上你的需求。我会把建模思路、参数怎么定、Vensim里那些容易忽略的操作细节,还有我自己踩过的坑,一条条摊开讲。

1. 先想清楚:系统动力学到底在解决什么问题

1.1 它和普通流程图、Excel预测的本质区别

很多人第一次做物流模型,习惯性打开Excel,拉一列历史销量,套个移动平均,往后推十二个月,完事。这种做法在环境稳定的时候没毛病,但它有个致命缺陷:它假设“系统结构不变”。而现实里的物流系统,恰恰是结构在决定行为——你的补货策略、你的信息传递方式、你的库存上限设置,这些结构性的东西一旦组合起来,就会产生一些你单看任何一个环节都想不到的结果。

系统动力学干的事,就是把这些“结构”显式地画出来,然后让时间在里面流动。它关注三个东西:存量(Stock)、流量(Flow)、反馈回路(Feedback Loop)。存量是系统里攒下来的量,比如仓库里的库存、在途的货物、积压的订单;流量是让存量增加或减少的速率,比如每天进货多少、每天发货多少;反馈回路则是把结果又送回输入端的那条线,比如库存低了就多订货,订货多了又导致库存高,库存高了又少订货。

我常跟人打一个比方:Excel预测像是看后视镜开车,你只能根据已经走过的路判断接下来大概什么方向;系统动力学则是给你一套仪表盘加一个简易的沙盘,你能看到油门踩下去之后,速度、油耗、发动机温度这些量之间是怎么互相牵扯的。三级物流系统里,工厂的产能是存量,每天生产是流入,每天发货给区域仓是流出;区域仓的库存又是另一个存量,它的流入来自工厂、流出流向门店。这些存量流量串起来,再加上“库存低于安全线就补货”这种规则形成的反馈,整个系统的动态就出来了。

1.2 为什么三级物流系统是练手的最佳案例

选三级物流系统做入门案例,不是随便挑的。它有几个特别适合练手的特征。第一,层级清晰:工厂、区域仓、前置仓(或门店)三级,每一级都有自己的库存和补货逻辑,结构上不复杂但足够完整。第二,延迟明显:货物从工厂发到区域仓要时间,从区域仓发到门店又要时间,信息从门店传回工厂还要时间,这些延迟正是系统动力学最擅长刻画的东西。第三,放大效应典型:终端门店销量稍微波动一下,传到工厂那边可能就变成大幅度的产能调整,这就是著名的“牛鞭效应”,用系统动力学跑一遍,你能直观看到它是怎么被结构放大出来的。

相比之下,如果你拿一个单级库存系统练手,结构太简单,跑不出什么有意思的动态;如果你拿一个全国多级网络练手,变量太多,新手根本理不清哪些该保留哪些该简化。三级刚好卡在“够复杂能出动态”和“够简单能想明白”之间,是性价比最高的入门选择。

1.3 建模前必须回答的三个问题

在打开Vensim之前,我建议你先在纸上回答三个问题,这三个问题答不清楚,模型画出来也是白画。

第一个问题:这个模型的边界在哪?也就是说,哪些东西放进模型里,哪些东西当作外部给定。三级物流系统里,我通常把工厂产能、各级库存、在途货物、订单量放进模型,把原材料供应、外部市场需求当作外生变量给定。边界划太大,模型臃肿跑不动;边界划太小,关键反馈被切断了,跑出来的结果没有参考价值。

第二个问题:我要观察的核心行为是什么?是库存的长期趋势,还是订单的震荡幅度,还是缺货发生的频率?不同的观察目标,决定了你哪些变量要细化、哪些可以合并。比如你关心缺货,那安全库存和补货提前期就得仔细建模;你关心产能利用率,那工厂的生产调整逻辑就得写细。

第三个问题:时间尺度多长?三级物流系统里,日级别波动和月级别趋势是两回事。如果你关心的是季节性备货,时间步长用周甚至月都行;如果你关心的是促销期间的短期缺货,那可能得用天。时间步长选错了,要么算得慢,要么把该看到的波动平滑掉了。

2. 存量流量图怎么画才不返工

2.1 从“名词”里挑存量,从“动词”里找流量

画存量流量图,新手最容易犯的错是把所有变量都堆上去,画出来像蜘蛛网。我的经验是:先做词性分析。把你在系统里能想到的所有东西列出来,名词大概率是存量或参数,动词大概率是流量。

三级物流系统里,名词有:工厂成品库存、区域仓库存、门店库存、在途货物、订单 backlog、安全库存、产能上限。这里面,工厂成品库存、区域仓库存、门店库存、在途货物、订单backlog是存量,因为它们都是“攒下来的量”,有累积效应。而安全库存、产能上限是参数,它们不随时间累积,是给定的常数或规则。

动词有:生产、发货、收货、订货、消耗。这些对应流量:生产速率、工厂发货速率、区域仓收货速率、区域仓发货速率、门店订货速率、门店销售速率。每个流量都连着至少一个存量,要么是流入要么是流出。

这么一拆,图的基本骨架就出来了,不会乱。我见过有人把“订单”既画成存量又画成流量,结果模型里同一个东西出现两次,跑出来的数对不上,排查半天才发现是概念混淆。

2.2 三级链条的存量流量骨架搭建

具体到三级物流系统,骨架是这样的:工厂成品库存是一个存量,流入是生产速率,流出是工厂向区域仓的发货速率。区域仓库存是一个存量,流入是区域仓收货速率(等于工厂发货速率经过运输延迟),流出是区域仓向门店的发货速率。门店库存是一个存量,流入是门店收货速率,流出是销售速率。在途货物可以单独设一个存量,用来刻画运输延迟,也可以直接用Vensim的延迟函数处理,这个后面细说。

订单流是另一条线。门店根据库存和需求生成订货量,这个订货量传到区域仓,区域仓再根据自身库存和门店订货生成向工厂的订货,工厂再安排生产。这条信息流上每一级都有延迟,而且每一级的订货规则都会放大波动。把这条线和库存线并排画出来,你就能看到“物流”和“信息流”两条腿走路的结构。

提示:画图时养成习惯,存量用矩形框,流量用带箭头的双线(Vensim里是阀门符号),信息流用单箭头细线。三种线型区分清楚,后面排查错误时一眼就能看出哪条线连错了。

2.3 反馈回路标注:正反馈与负反馈别搞反

存量流量图画完,接下来要标反馈回路。这是很多人跳过的一步,但恰恰是系统动力学的灵魂。三级物流系统里至少有两个关键回路。

一个是库存调节回路(负反馈):门店库存低于目标水平,订货量增加,货物经过延迟到达,库存回升,订货量回落。这个回路的作用是让库存稳定在目标附近,是系统的“稳定器”。另一个是需求放大回路(正反馈倾向):终端需求上升,门店多订货,区域仓看到订货上升以为需求真的涨了,于是向工厂多订货,工厂扩大产能,结果产能上来之后需求可能已经回落,造成库存积压。这个回路是“放大器”,牛鞭效应就是它搞出来的。

在Vensim里,反馈回路可以用回路标注工具标出来,也可以自己在纸上画个圈标注极性。极性判断有个简单办法:沿着回路走一圈,数负号(即“反向影响”)的个数,偶数个负号是正反馈,奇数个是负反馈。别小看这个,回路极性搞反了,模型跑出来的行为和预期完全相反,你会怀疑人生。

3. Vensim实操:那些文档不写的细节

3.1 方程写法的几个硬规矩

Vensim的方程语法看起来简单,但有几个规矩不遵守就直接报错或者跑出诡异结果。第一,存量方程必须写成INTEG形式,比如门店库存写成门店库存 = INTEG(收货速率 - 销售速率, 初始库存)。那个初始库存不能省,省了默认是0,如果你的系统初始状态不是0,跑出来前几个时间步全是负库存,看着吓人。第二,流量方程里引用的存量要用对时间下标,Vensim默认用的是当前时刻的值,如果你要引用上一时刻,得用DELAY或者SMOOTH函数,不能直接写下标。第三,单位要统一,Vensim有单位检查功能,但很多人图省事不填单位,结果量纲对不上也发现不了。我建议所有变量都填上单位,库存用“件”,速率用“件/天”,时间用“天”,这样单位检查一跑,量纲错误立刻现形。

还有一个细节:Vensim里变量名支持中文,但我不建议全用中文,尤其是变量多的时候,中文名在方程编辑器里显示容易挤在一起,排查错误时看着累。我的习惯是核心存量用中文(方便对照业务),中间计算变量用英文缩写,混着来,自己看得懂就行。

3.2 延迟函数的选择:DELAY还是SMOOTH

三级物流系统里延迟无处不在,运输有延迟,信息传递有延迟,产能调整也有延迟。Vensim提供了好几种延迟函数,最常用的是DELAY和SMOOTH,但两者适用场景不一样。

DELAY函数(具体是DELAY1、DELAY3、DELAY N)模拟的是“物料延迟”,也就是东西实实在在在路上走,输入多少 eventually 输出多少,总量守恒。运输延迟就该用DELAY,比如工厂发货到区域仓,货在路上走三天,用DELAY3(工厂发货速率, 3)就比较合适,DELAY3表示三阶延迟,相当于把延迟过程拆成三段,输出更平滑,更接近真实运输的分布。

SMOOTH函数模拟的是“信息平滑”或“认知延迟”,输入变化之后,输出按指数方式逐渐逼近输入,但总量不一定守恒。比如区域仓看到门店订货量上升,不会立刻全信,而是慢慢调整自己的判断,这种“将信将疑”的调整过程用SMOOTH更合适。

我踩过的坑是:一开始所有延迟都用DELAY,结果信息流上的延迟把订单信号搞得过于平滑,牛鞭效应反而看不出来了。后来把信息延迟改成SMOOTH,波动才正常显现。这个区别文档里写得比较学术,实际用的时候记住一句话:运东西用DELAY,传消息用SMOOTH。

3.3 时间步长与仿真精度的取舍

Vensim模型设置里有个TIME STEP,默认是1,很多人不改。但时间步长选多少,直接影响仿真精度和速度。原则是:时间步长要小于系统里最短延迟的1/2,最好小于1/4。三级物流系统里如果最短延迟是1天(比如门店日补货),那时间步长设0.25比较稳妥;如果最短延迟是3天,设0.5甚至1都行。

时间步长设太大,延迟过程会被粗糙地离散化,跑出来的曲线有锯齿,甚至出现数值不稳定(比如库存莫名其妙震荡)。设太小,仿真速度慢,模型大了之后等结果等到花儿都谢了。我的经验是先用默认1跑一遍看趋势,如果曲线有明显锯齿或者和预期不符,再把步长减半重跑,对比两次结果,稳定了就用较大的那个步长。

注意:Vensim里改时间步长在Model Settings里,改完之后记得把仿真时间范围也检查一遍,别步长改了时间范围没改,跑出来的图横轴对不上。

3.4 用表函数刻画非线性补货规则

现实里的补货规则很少是线性的。库存低于安全线时拼命补,库存高到一定程度就不补了,这种“分段”或“饱和”的行为,用表函数(Lookup)刻画最方便。Vensim里表函数用WITH LOOKUP或者直接定义Lookup变量。

三级物流系统里,门店订货规则可以这么设:库存低于安全库存的50%时,订货量是正常量的2倍;库存介于50%到100%安全库存之间时,订货量线性下降;库存高于安全库存时,只补正常量的一半。这种规则用表函数画出来是一条折线,比写一堆IF THEN ELSE清爽得多,而且调整起来直观——直接拖表上的点就行。

表函数有个细节要注意:自变量范围要覆盖模型可能出现的所有取值。如果你的表函数只定义了库存从0到1000的对应关系,结果模型跑出来库存到了1200,Vensim会默认用端点值外推,可能给出离谱的结果。我一般会把表函数的自变量范围设得比预期宽20%到30%,留足余量。

4. 参数怎么定:拍脑袋和讲道理之间

4.1 初始库存与安全库存的设定逻辑

参数设定是系统动力学建模里最容易被诟病“拍脑袋”的环节。但拍脑袋也分高低,低级的拍脑袋是随便填个数,高级的拍脑袋是“有依据的估计”。初始库存怎么定?最靠谱的办法是用历史平均库存,如果没有历史数据,就用“日均销量乘以补货周期再乘以一个系数”。比如门店日均卖100件,补货周期3天,那初始库存设在300到450之间比较合理,系数取1到1.5,取决于你对缺货的容忍度。

安全库存的设定更讲究。经典公式是安全库存等于服务水平对应的Z值乘以需求标准差再乘以提前期的平方根。这个公式来自库存管理理论,在系统动力学模型里可以直接用,但要注意:系统动力学关心的是动态行为,安全库存设成常数还是设成随需求变化的动态值,跑出来的结果差别很大。我建议入门阶段先设常数,把系统跑稳了,再尝试让安全库存随需求波动,观察系统稳定性怎么变化。

4.2 运输延迟与信息延迟的取值依据

延迟参数是三级物流系统里最敏感的参数,取大了取小了结果天差地别。运输延迟相对好定,看实际物流数据,工厂到区域仓几天、区域仓到门店几天,照实填。信息延迟难定一些,因为“信息传递”在现实里往往是隐性的,订单从门店传到区域仓,可能走系统自动传输(几乎无延迟),也可能走人工汇总(延迟一两天)。

我的处理办法是:信息延迟先设一个保守值(比如1天),跑一遍看牛鞭效应的幅度,如果幅度和行业经验对不上,再调整。行业里有个粗略的经验,快消品供应链的牛鞭效应幅度(工厂订单波动除以终端销售波动)大概在2到4倍之间,如果你的模型跑出来是10倍,那多半是信息延迟设太大了或者补货规则太激进。

4.3 用敏感性测试代替“精确参数”

系统动力学有个很重要的理念:参数不需要精确,但结构必须正确。意思是,你不需要把每个参数都调到小数点后两位,但你要知道哪些参数对结果影响大、哪些影响小。做法就是敏感性测试:把某个参数上下浮动20%,看输出曲线变化大不大。变化大的参数,说明系统对它敏感,值得花时间去精确估计;变化小的参数,随便取个合理值就行。

三级物流系统里,我实测下来,补货提前期和订货放大系数是最敏感的两个参数,浮动20%就能让库存曲线从平稳变成震荡。而初始库存和安全库存相对不敏感,只要在合理范围内,对长期趋势影响不大。所以建模时间应该优先花在前两个参数上,后两个快速估一下就行。

5. 跑完模型之后:怎么读结果、怎么排查问题

5.1 曲线震荡的三种典型成因

模型跑出来曲线乱震,是新手最常遇到的状况。根据我的经验,震荡通常来自三个地方。第一,延迟太长加上反馈太强,这是最经典的组合,系统里有个长延迟,同时补货规则又很激进(库存一低就猛补),结果就是补过头、再补过头,来回震荡。解决办法是缩短延迟或者软化补货规则。第二,时间步长太大,数值离散化引入的伪震荡,这种震荡的特点是频率很高、幅度不大,把步长减半就消失了。第三,回路极性搞反,本该是负反馈稳定器的回路被画成了正反馈,系统自然失控。排查办法是逐个回路单独跑,看哪个回路一开就震。

5.2 牛鞭效应的量化与验证

牛鞭效应不能光靠“看着像”来判断,得量化。最简单的指标是波动放大比:工厂订单量的标准差除以终端销售量的标准差。在Vensim里,可以用内置的统计函数算标准差,也可以把数据导出来用别的工具算。我一般会在模型里加两个辅助变量,一个记录终端销售的移动标准差,一个记录工厂订单的移动标准差,两者相除就是实时的放大比。

验证的时候,拿模型跑出来的放大比和行业经验值对比。如果差太多,先检查信息延迟和订货规则,这两个是牛鞭效应的主要推手。有时候你会发现,把信息延迟从2天改成1天,放大比就从5降到2.5,这说明信息传递效率对系统行为影响巨大,现实中优化信息流往往比优化物流更划算。

5.3 常见报错与诡异结果速查

Vensim用久了,有些报错和诡异结果是反复出现的,我整理了一个速查表,遇到问题先对照着看。

现象可能原因排查动作
库存出现负值初始库存没设或设太小;流出速率大于流入速率且无约束检查INTEG初始值;给流量加非负约束
曲线呈锯齿状高频震荡时间步长太大步长减半重跑对比
订单量无限增长正反馈回路失控,缺少负反馈约束检查补货规则是否有上限;检查回路极性
单位检查报错变量单位未填或量纲不一致补全所有变量单位;统一时间单位
延迟后总量对不上该用DELAY的地方用了SMOOTH物料流用DELAY,信息流用SMOOTH
表函数外推离谱自变量范围没覆盖实际取值扩大表函数自变量范围

这张表里的每一条,我都是真真切切踩过才写下来的。尤其是第一条“库存负值”,第一次遇到的时候我以为是方程写错了,排查了半天才发现是INTEG的初始值忘了填,Vensim默认给0,而我的模型初始库存明明是正的,结果第一个时间步流出就把库存干成负的了。

6. 几个让模型更靠谱的实操心得

6.1 先跑通再跑准,别一上来就追求完美

我见过太多人,模型画了一半就开始纠结某个参数该取3.2还是3.5,纠结一下午模型还没跑起来。正确的节奏是:先用粗略参数把整个模型跑通,确认存量流量连接没错、反馈回路方向没错、结果趋势大致合理,然后再逐个参数精细化。系统动力学建模是个迭代过程,第一版模型的作用是“验证结构”,不是“给出精确预测”。结构对了,参数可以慢慢调;结构错了,参数调得再准也是白搭。

6.2 给模型加注释,三个月后你会感谢自己

Vensim的变量可以加注释(Comment),很多人不用。我强烈建议每个存量、每个流量、每个关键参数都写一句注释,说明它代表什么、单位是什么、取值依据是什么。三级物流系统里变量几十个,当时画的时候记得清清楚楚,过两个月回来看,保证你对着“辅助变量7”发呆。注释不用长,一句话就行,比如“区域仓库存:单位件,初始值取历史均值”。这个习惯花不了几分钟,但省下来的排查时间是以小时计的。

6.3 保存多个版本,用版本号管理迭代

Vensim模型文件不大,多存几个版本不占地方。我的习惯是每做一个结构性改动(加一个回路、改一个延迟函数、换一种补货规则)就另存一个版本,文件名带上日期和改动说明,比如“三级物流_v3_信息延迟改SMOOTH”。这样万一改坏了,能快速回退到上一个能跑的版本。别指望Vensim的撤销功能,改多了之后撤销栈根本不够用,而且跨会话的撤销是没有的。

6.4 用SyntheSim做交互式调参

Vensim有个功能叫SyntheSim,可能很多人没注意。它允许你在仿真运行的同时拖动参数滑块,实时看曲线怎么变。做敏感性分析的时候特别好用——你不用反复改参数、重跑、看结果,直接拖滑块,曲线跟着动,哪个参数敏感一目了然。三级物流系统里,我常用它来快速定位补货提前期的临界值:慢慢拖提前期滑块,看库存曲线从平稳到震荡的那个拐点在哪,比跑十次批量仿真还快。

6.5 模型验证:历史重现与极端条件测试

模型跑通了不代表模型靠谱,还得做验证。最基础的两个验证:历史重现和极端条件测试。历史重现是拿模型跑过去一段时间的实际数据,看输出和实际值能不能对上,对不上说明结构或参数有问题。极端条件测试是把某个输入推到极端(比如需求突然翻十倍、运输延迟突然变一个月),看模型会不会给出物理上不可能的结果(比如库存变负、订单量无穷大)。这两个测试花不了多少时间,但能揪出大部分隐藏的结构错误。

三级物流系统做极端测试时,我一般会把终端需求设成0,看系统能不能自然收敛到低库存状态;再把需求设成正常值的五倍,看工厂产能约束有没有生效、缺货会不会无限累积。这两个测试跑下来,模型里那些忘了加约束的流量、忘了设上限的产能,全都暴露出来了。

7. 从三级物流往外延伸:这套方法还能用在哪

系统动力学这套建模方法,学会三级物流之后,迁移到别的场景其实很快。核心就三件事:找存量、找流量、找反馈。库存管理、项目管理里的任务积压、人力资源里的招聘与流失、甚至个人时间管理里的任务堆积,本质上都是存量流量加反馈的结构。

比如项目管理,未完成任务是一个存量,新任务产生是流入,任务完成是流出,团队产能是约束,任务积压导致压力上升、压力上升又影响效率,这就是一个带反馈的系统。用Vensim画出来,跑一跑,你能看到为什么有些团队越忙越乱——因为压力回路的正反馈把系统推向了失控。

再比如个人时间管理,待办事项是存量,新任务进来是流入,完成任务是流出,拖延行为可以建模成一个随待办数量增加而增强的正反馈。这个模型跑出来,你会直观看到“待办越积越多、越多越不想做”的恶性循环是怎么形成的,以及设置一个“待办上限”作为负反馈约束有多重要。

说到底,系统动力学给我的最大收获不是会用一个软件,而是养成了一种“看结构”的习惯。遇到一个反复出现的问题,不再急着找直接原因,而是先问:这个系统里有哪些存量在累积,哪些流量在驱动,哪些反馈回路在起作用。这么一问,很多看似无解的问题,往往能找到结构性的解法。三级物流系统只是个起点,真正有意思的是把这套思维用到你自己关心的领域里去。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询