ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

用Vensim构建系统动力学模型:生产-库存-销售系统仿真实战

用Vensim构建系统动力学模型:生产-库存-销售系统仿真实战 先说个现象。这几年我在数学建模培训和论文评审的过程中发现系统动力学在各类竞赛里的出镜率越来越高。尤其是那种“给定一个政策或决策然后问你一段时间后系统会怎样演化”的题用回归做明显气短用微分方程硬搭又容易卡在细节上而系统动力学直接画图就能把模型立起来还自带一套完整的仿真工具。Vensim就是做这件事最顺手的工具之一免费版够用画因果回路图和存量流量图都在同一个界面里完成方程写起来也接近自然语言几乎不用考虑代码语法。这篇我挑了一个非常经典的场景制造企业的生产、库存、销售系统。需求中途跳变企业通过调整生产计划来补库存最终形成一个带延迟的负反馈系统。我会从因果回路图讲起一路走到方程编写、仿真运行、参数优化和敏感性分析全程给出可复现的操作流程。适合准备数学建模竞赛的同学、做供应链管理研究的人以及任何想把“动态系统思想”落地成仿真模型的人。即使你之前完全没碰过Vensim按这篇一步步操作也能跑出完整结果。1. 内容整体设计与思路拆解1.1 系统动力学解决的问题与建模思维方式系统动力学System Dynamics简称SD的底层逻辑其实很简单一个系统的行为不是由单个变量决定的而是由变量之间的反馈结构决定的。传统统计方法擅长描述“相关关系”比如销量和广告投入之间有显著相关性但碰到“如果长期投入广告、渠道库存又跟着变化最终销量会怎样波动”这种问题统计描述就说不清了。系统动力学恰好补上这个缺口它把系统抽象成“存量”和“流量”用反馈回路解释行为为什么会发生变化。我个人的体会是SD最大的价值不是预测具体数字而是训练一种“结构决定行为”的思维方式。比如你看到库存总是忽高忽低第一反应可能是补货参数没调好但SD会让你再往下想一层为什么补货参数会导致振荡因为从订单发出到实际入库存在时间延迟而人在制定补货策略时往往会过度补偿。只要这个延迟结构不变无论你怎样频繁调整参数系统都可能继续振荡。这种视角在做数学建模竞赛、做政策仿真、做管理决策分析时非常稀缺。这也解释了为什么这几年竞赛里凡是遇到“长周期、多反馈、有政策干预”的题目很多获奖队伍选择系统动力学。因果回路图画在论文里评委一眼就能看懂你的建模逻辑存量流量图加上方程又比纯文字描述严谨得多。Vensim的价值在于它把“画图、写方程、做仿真、跑敏感性”整合在一套流程里省去了大量从零搭建仿真框架的工作。1.2 为什么是Vensim工具选型对比有人可能会问用Python也能做仿真为什么非要Vensim这个问题我经常被问到。答案是要看你想达到什么目的。如果你想做一套自动化的数据处理流程或者模型里有大量智能体交互Python或AnyLogic可能更合适但如果你需要快速搭建一个连续系统反馈模型并且希望整个逻辑透明、可解释、能画图Vensim几乎是最省事的选择。维度VensimPython 自建仿真AnyLogic上手门槛低画图即建模中高需要自己写状态更新循环高涉及多方法学因果回路可视性原生支持画完即用需额外用可视化库画有流程建模但偏离散事件方程透明程度高所有方程集中展示高中竞赛/论文场景效率高改参数即可做情景分析中需要写大量配套代码中低学习成本高典型适用场景连续系统、反馈系统、政策仿真数据处理与定制化仿真微观个体行为、离散事件、交通物流Vensim还有一个很实用的功能叫“因果树”Causes Tree和“回路图”Loop Diagram能把模型中的反馈结构自动画出来。写数学建模竞赛论文时这些图可以直接用省去在画图软件里手动排版的功夫。而且Vensim的方程支持单位自动检查变量之间的量纲对不对、哪里漏了单位模型一跑就能提示出来这种“保姆级”检查对新手尤其友好。1.3 案例选择逻辑为什么拿生产-库存系统开刀我选生产-库存-销售系统来做案例不是因为供应链有多热门而是因为这个系统麻雀虽小、五脏俱全。它包含系统动力学里的几乎所有基础元素存量库存量、在途库存、流量生产速率、销售速率、时间延迟生产周期、订单响应周期、负反馈目标库存与实际库存的偏差调整、正反馈之外的决策规则。把这些元素在一个小模型里彻底弄明白之后迁移到人口增长、传染病传播、生态环境承载力、城市交通等场景时你会发现骨架几乎一样。这个案例的场景设定也足够贴近实际一家制造企业按订单安排生产市场原本稳定在每周100件突然在第12周需求跳到160件。企业有目标库存库存不够就增加生产启动率但生产需要时间不能立刻入库。这里就产生了天然的时间延迟而时间延迟配合反馈调整往往会让库存出现超调或者波动。我们要做的事情就是用Vensim把这个故事复现出来并回答两个问题第一在给定参数下库存会怎样波动第二怎样调整生产策略能让库存更稳2. Vensim核心概念与建模前准备2.1 四大基本元素存量、流量、辅助变量、连线Vensim的模型由四类元素构成。理解这四类元素基本就理解了系统动力学的全部语法。存量Level代表“积累量”好比浴缸里的水。库存量是在库商品在途库存是已下单但还没入库的货。存量只能用流量来改变不会凭空跳变。在Vensim里用矩形框图标表示方程里一般用INTEG函数来描述意思是从初始值开始不断累积流入减去流出的结果。流量Rate代表“变化速率”好比水龙头注入的水和排水口流出的水。生产速率、销售速率都是流量。流量决定存量变化快慢在建模时通常写成速率形式单位里带“/周”“/天”这种时间倒数。流量的值是决策的结果可以依赖存量、常量和其他辅助变量。辅助变量和常量Auxiliary and Constant是连接流量与存量的“计算中间层”。期望库存、库存偏差、库存调整时间这些都属于辅助变量或常量。它们的角色是把决策逻辑拆解成清晰的小步骤让模型可读性更高也便于之后做参数优化。连线Arrow表达变量之间的因果关系或者说是信息传递路径。在因果回路图里连线方向是从“原因”指向“结果”在存量流量图里连线同样是从信息源指向需要使用该信息的决策点。这四类元素组合在一起就构成了一个“反馈系统”。存量反馈影响流量流量又改变存量形成闭环。把这个循环想明白了系统动力学的大部分建模过程就只剩下一件事把业务逻辑翻译成这四类元素然后填方程。2.2 因果回路图先画逻辑再谈数学我强烈建议所有人在打开Vensim填方程之前先在纸上或者通过白板画一张因果回路图。因果回路图不涉及具体数值它只表达“谁影响谁”“影响方向是什么”。比如库存增加会降低库存偏差库存偏差增加会提高生产启动率生产启动率提高会增加在途库存在途库存增加又会提高完工率完工率提高则增加库存。这样一圈下来就形成了一个负反馈回路。回路极性的判断有一个很简单的口诀数负号。每条连线上标正号或负号如果一个回路里的负号数量是偶数整个回路是正反馈加强型负号数量是奇数整个回路就是负反馈平衡型。库存系统里从库存到库存偏差这条线是负号其余几条线是正号负号数量为1所以整个回路是负反馈系统会朝着“让库存靠近目标”的方向自我修正。因果回路图最大的价值是强迫你先想清楚“系统的故事长什么样”。很多人在Vensim里拿到变量就开写方程写到一半发现因果箭头乱成一团量纲怎么都对不上。如果你提前把回路画出来并且在图上标好极性填方程时就会顺畅得多。因果回路图还是论文里的加分项因为它直观体现了你对问题结构的理解。2.3 建模前的三个习惯第一个习惯是“变量命名用英文单位写在方程里”。Vensim对中文变量名和中文路径的支持虽然有所改善但版本兼容性始终是个隐患尤其是换电脑、换版本后中文变量名偶尔会变成乱码。英文命名加注释能让模型稳定得多。单位一定要在方程编辑器里填全比如库存单位写units流速单位写units/week调整时间写week这样量纲检查才有意义。第二个习惯是“先定模型边界再定变量清单”。模型不是越大越好边界画到哪里故事就讲到哪里。比如这个案例中我们不关心原材料采购、不关心销售价格变化只关心“接到订单—安排生产—产品完工入库—发货销售”这一段链路。一开始就明确边界可以避免变量无限膨胀。第三个习惯是“每写一个方程就写一句注释”。Vensim方程编辑器里有Notes区域别嫌麻烦。过了一周再打开模型如果没有注释你很可能想不起某个常量当初为什么设成8而不是4。注释不是写给读者看的是写给未来的自己看的。3. 实战案例构建生产-库存-销售系统的完整建模流程3.1 问题描述与模型边界假设一家制造企业产品需求相对稳定每周卖出100件。企业按“目标库存”来组织生产如果实际库存低于目标库存就提高生产启动率如果高于目标库存就适当降低生产速度。但生产不是瞬间完成的从车间下达生产指令到产品完工入库平均需要2周时间。也就是说在途库存是一个客观存在的积累量。模型的初始状态设为均衡状态销售速率100件/周库存量400件相当于4周的销量在途库存200件相当于2周销量正好覆盖生产延迟生产启动率和完工率都是100件/周。第12周发生一次外部冲击销售速率从100件/周跳升到160件/周之后保持在这一水平。我们观察40周内库存、在途库存、生产启动率和完工率的变化情况。这里特意选了“均衡开始”的初值是为了排除初始状态扰动对结果的影响。很多新手建模时会随手填一个初始库存比如1000件结果前几期仿真曲线剧烈波动误以为是模型有问题实际上是因为初始状态离均衡太远系统在“收拾残局”。从均衡开始模型输出中的变化就纯粹来自外部冲击和系统结构分析起来干净得多。3.2 因果回路图构建与极性判断这个模型里有三条核心反馈链路。第一条是从销售速率到库存的负向链路销售速率增加库存减少库存减少库存偏差期望库存减实际库存增大库存偏差增大生产启动率上升生产启动率上升经过生产延迟后完工率上升完工率上升库存回升。第二条是关于在途库存的负反馈期望在途库存与实际在途库存之间也存在偏差这个偏差会进一步调整生产启动率不让订单量“冒进”。第三条是需求前馈销售速率本身直接进入生产启动率方程相当于企业看到销量增加立刻把订单量同步抬高。在Vensim的Sketch界面上画图时先从变量工具箱拖出Level存量、Rate流量、辅助变量和常量再用带箭头的连线把变量连起来。存量一般放在画面中间偏下的位置流量贴着存量进出辅助变量放在上游和下游。画完以后用“Loop”按钮可以自动分析模型里有哪些回路能帮你确认逻辑有没有连错。3.3 存量流量图与方程编写现在进入正式建模环节。打开Vensim新建模型然后按照下面的变量结构搭建存量流量图。这个结构在供应链文献中有一个专门的名字叫APIOBPCS自动管道库存与订货点控制系统是一个非常经典的库存管理策略。在实际操作中我建议按三个步骤来画第一步先画两个存量框“Inventory”和“WIP”第二步给两个存量分别接上“流入”和“流出”的流量图标第三步补辅助变量、常量和连线。画完草图后双击每个变量在弹出的Equation Editor里输入方程。以下是完整方程代码可以直接照着输入(01) Inventory INTEG(Completion_Rate - Sales_Rate, 400) Units: units (02) WIP INTEG(Order_Rate - Completion_Rate, 200) Units: units (03) Sales_Rate 100 STEP(60, 12) Units: units/week (04) Desired_Inventory Sales_Rate * Inventory_Coverage Units: units (05) Inventory_Gap Desired_Inventory - Inventory Units: units (06) Desired_WIP Sales_Rate * Production_Delay Units: units (07) WIP_Gap Desired_WIP - WIP Units: units (08) Order_Rate MAX(0, Sales_Rate Inventory_Gap / Inventory_Adjust_Time WIP_Gap / WIP_Adjust_Time) Units: units/week (09) Completion_Rate DELAY3(Order_Rate, Production_Delay) Units: units/week (10) Inventory_Coverage 4 Units: week (11) Inventory_Adjust_Time 8 Units: week (12) WIP_Adjust_Time 4 Units: week (13) Production_Delay 2 Units: week逐个解释一下每个方程背后的逻辑。(01)和(02)是两个存量方程。Inventory的流入是完工率流出是销售速率初始值400。WIP的流入是生产启动率流出是完工率初始值200。这里最关键的一点是完工率同时从WIP中流出并流入Inventory它把“在途”和“入库”串联起来。没有这个在途存量模型就会假设下达订单后瞬间完成生产那整个延迟效应就消失了仿真结果会失真。(03)的销售速率使用STEP函数模拟外部冲击。STEP(60, 12)的含义是在第12周数值瞬间增加60也就是从100跳到160。STEP函数是Vensim里做情景冲击最常用的函数比手动改多组参数方便得多。(04)到(07)是辅助变量。期望库存等于当前销售速率乘以库存覆盖周数意味着企业希望手中始终握着等于4周销量的库存。期望在途库存等于销售速率乘以生产延迟意味着企业希望在生产线上保持约2周的“订单量”。库存偏差和在途偏差则分别是期望值与实际值的差距它们是反馈调整的“误差信号”。(08)是整张模型最核心的决策方程。生产启动率由三部分组成当前销售速率前馈库存偏差除以库存调整时间库存反馈在途偏差除以在途调整时间在途反馈。用MAX函数兜底保证生产启动率不会为负。这里的除法本质上是“比例控制”调整时间越小企业对偏差的反应越激进调整时间越大反应越温和。(09)的DELAY3是三阶指数延迟函数。三阶延迟可以理解为把生产周期拆成三个连续的阶段每个阶段平均耗时生产延迟的三分之二周。相比一阶延迟三阶延迟更贴近真实生产的“先备料、再加工、后入库”流程而且对输入的变化反应更平滑但也更容易产生过冲。3.4 模型检查与仿真参数设置方程填完后不要急着跑仿真。先用Vensim自带的两个检查功能扫一遍第一个是“Check Model”它会检查模型里是否有孤立变量、未定义变量、方程结构是否完整第二个是“Units Check”它会根据你填写的单位自动检查方程左右两边量纲是否一致。如果某个方程把“件/周”和“件”加在一起这里会直接报错省去你手工排查的时间。仿真参数在Model Settings里设置。这个案例中初始时间设为0结束时间设为40周时间步长设为0.125周积分方法选Euler或RK4 Auto都可以。时间步长千万不要为了省事设成1周因为模型里存在DELAY3和生产延迟2周步长太大会造成明显的数值误差仿真曲线出现锯齿状波动。如果之后发现结果对步长敏感可以把步长继续缩小到0.0625或者改用RK4 Auto积分方法再对比一次。4. 仿真结果解读、策略优化与敏感性分析4.1 基础仿真结果怎么读点击Run开始仿真后双击“Inventory”“Order_Rate”等变量可以画出各自的时间曲线。以我的操作经验先看生产启动率和完工率这两条曲线再看库存曲线是最合理的分析顺序。需求跳变发生在第12周生产启动率几乎立刻从100件/周跳到220件/周以上。这是因为除了销售速率直接增加60外库存偏差和在途偏差也同时追加了调整量。但完工率受DELAY3影响不会同步跳变而是缓慢爬升大约在2到3周后才逐步接近新的需求水平。库存在这一段“青黄不接”的时间窗口内持续下降最低点大概出现在第15周前后会回落到接近300件左右然后随着完工率超过销售速率而重新回升最终向新的目标库存640件靠拢。这个结果的启示是即使企业已经响应得很快只要生产延迟客观存在库存就一定会经历一段下降过程无法被完全避免。你能做的只是缩短库存的谷底深度和恢复时间但不可能同时做到“立刻补满”和“一点不波动”这是时间延迟约束下的基本规律。4.2 策略优化调库存调整时间的权衡仿真不是终点优化才是题目里所谓的“仿真优化”。最直接、也最能看出问题的手段是参数情景对比。我把库存调整时间分别设为4周、8周、16周其他参数保持不变分别仿真一次结果差异非常明显库存调整时间库存谷底估算过冲情况恢复速度潜在风险4周谷底较浅接近330件明显过冲可能冲上720件快约6周内恢复生产启动率波动剧烈可能伤产能8周谷底约300件轻微过冲中等约10周恢复整体较稳16周谷底较深逼近250件几乎无过冲慢需要15周以上缺货风险上升这里就体现出系统动力学的核心思想参数不是越大越好也不是越小越好而是要看系统整体行为是否能接受。如果企业更看重平滑生产、不希望车间频繁加减产那就应该选较长的库存调整时间代价是库存低谷更深如果企业更怕缺货丢单那就要牺牲生产平稳性选更短的调整时间。如果你用的是Vensim Professional或DSS版本可以直接用“Optimization”工具设定目标函数比如“最小化库存偏差平方和”让软件自动搜索最优参数。但即使只有免费版手动跑几组参数、把结果整理成表格也完全能完成策略优化分析。论文里这样写比堆一堆高大上但没人看得懂的算法更有说服力。4.3 敏感性分析别只看一组参数实战中还有一层更现实的问题真实系统的参数往往是波动的。你以为库存覆盖周数是4周可能实际是3周或5周你以为销售速率稳定在100件/周可能实际有随机扰动。敏感性分析就是用来回答“如果参数不完全确定结论还站得住吗”这个问题。Vensim的Sensitivity Simulation功能需要相应版本支持可以设定参数服从某个概率分布然后跑几百次仿真统计结果的范围。没有高级版本也可以退而求其次手动把库存调整时间从2周到12周每隔2周改一次记录每次仿真的最低库存和恢复时间得到一张近似敏感性表。我在做这个模型时用后一种方法发现库存调整时间在4周到10周之间系统行为都还算稳健一旦小于2周库存曲线就开始出现明显的振荡说明这个模型存在一个“激进参数边界”。敏感性分析的价值在于让你知道哪些参数是必须精确估计的哪些参数差一点没关系。这个判断在实际决策中比任何一组精确数字都重要。竞赛论文里写清楚“我对关键参数做了敏感性分析结论在参数波动范围内保持稳定”也是评审眼中的加分项。5. 常见报错与排坑实录5.1 量纲检查疯狂报红新手最容易卡住的地方就是Units Check通不过。常见原因有三个一是变量单位没填全二是把“件”和“件/周”这类不同量纲的变量直接相加三是DELAY3这类函数的输出单位与输入单位不一致需要在方程里显式标注。我的建议是在刚开始建模型时就把单位当成方程的一部分来写别等到最后一起补。这样量纲检查会实时告诉你哪一步出了问题而不是积攒了几十个变量后一次性爆发。5.2 结果振荡发散是怎么回事如果仿真曲线不是平滑变化而是剧烈波动甚至发散到无穷大优先查三件事第一模型里是否存在正反馈回路比如库存偏差和生产启动率之间接反了方向第二时间步长是否过大试着把步长从1改成0.125第三库存调整时间是不是设成了0或负数分母为零在仿真里会直接导致数值爆炸。还有一个常见的认知误区是“振荡一定是BUG”。实际上负反馈系统配合较大的延迟和较强的调整力度天然就会产生过冲和振荡这是结构特性不是代码错误。遇到振荡先检查参数是否在合理范围再考虑是不是需要重新设计调整逻辑。5.3 DELAY函数带来的异常DELAY3虽然好用但它的输出对输入突变很敏感。如果需求信号本身波动很大DELAY3的输出会先出现一段“偏保守”的低响应然后才逐步追上来这会让库存曲线的谷底比预期的更深。遇到这种情况可以试试把DELAY3换成DELAY1或SMOOTH函数对比结果。有时候一阶延迟和二阶延迟的差异能直接改变你对“库存会不会缺货”这个问题的判断。另外DELAY3的时间参数不能为负也不能比仿真步长还小。如果生产延迟设成0.1周而时间步长是0.125周数值上就会出现取整误差观察不到平滑的延迟曲线。建议延迟时间至少大于4倍时间步长。5.4 问题排查速查表现象可能原因排查与解决办法Units Check报错单位漏填、量纲不匹配逐个变量检查单位确保“件/周”只和“件/周”加减曲线锯齿状时间步长过大把步长降到0.125或更小换RK4积分方法模型发散到无穷正反馈回路、调整时间为0或负检查回路极性确认所有分母为正库存谷底过深调整时间过长或延迟阶数太高调短库存调整时间尝试DELAY1前几期剧烈波动初始状态偏离均衡根据初始销售速率和目标库存反推合理的初始存量Check Model报孤立变量变量没有连接或方程未定义回到Sketch视图检查连线补全边界6. 一些个人体会与后续扩展跑完这个案例再回看系统动力学你会发现它最强的点其实不在数学上而在“倒逼你把问题逻辑想清楚”。你用Vensim建模画因果回路图、写方程、做量纲检查每一步都在迫使你回答“这个变量从哪来、影响谁、怎么影响”。这个过程本身比仿真结果更有价值。我建议新手学完这个生产-库存案例后不要急着去做复杂的宏观模型而是先试着迁移两个方向一个是把“销售速率”从常数改成随机波动或周期性波动感受不同需求模式对库存控制策略的影响另一个是把“生产延迟”改成概率分布引入更多不确定性再做一次敏感性分析。你会发现模型每复杂一点你对于“结构如何决定行为”的理解都会更深一层。最后再分享一个小技巧在数学建模竞赛里模型图的整洁程度直接影响评阅印象。Vensim画完图之后记得整理变量位置把主要回路摆成清晰的环形或上下结构不要舍不得删多余连线。很多人模型本身建得不错但图一塌糊涂很吃亏。这个案例的完整流程跑通后你完全可以把它作为模板遇到新问题就换掉存量、流量和参数剩下的建模思维和方法论是通用的。
返回列表