缺货不补随机库存系统WITNESS仿真建模
1.系统描述
某公司经销单类产品,顾客需求时间间隔DIT(Demand Interval Time)为服从均值为0.1个月的指数随机变量,需求量D是随机变量,其概率函数为:
需求量D | 发生概率 |
1 | 1/6 |
2 | 1/3 |
3 | 1/3 |
4 | 1/6 |
公司采取的采购和销售策略分别为:
(1)采购策略:
定期订货(s,S,T):即每隔一段时间T检查一次库存,如果存储数量高于一个数值s,则不订货,否则进行订货,订货数量为S-q,其中q为检查库存时的库存量。
(2)销售策略:
缺货补足:当客户需求到达时,如果仓库中没有足够的产品,则仅以现有库存满足客户需求,剩余未满足的客户需求等待下批送达的物品给予满足。
当公司相关库存费率如下时:
存储费率C1=1.5元/件.月;
缺货费率C2=10元/件.月,即如果某个顾客有1个单位的物品满足延迟了1个月,则会生产缺货费用5元;
订货费率C3=K+mQ=32+3Q,其中:
K—订货附加费,电话、订单传递等;
m—单件订货费,例如运输费,保险等;
Q—订货量;
通过建立仿真模型并进行仿真实验,分析公司采用如下9种采购策略中的哪一种策略,在100天内可以获得最低的系统总成本,其中:存储成本、缺货成本、订货成本各为多少?
L |
20 |
20 |
20 |
20 |
40 |
40 |
40 |
60 |
60 |
S |
40 |
60 |
80 |
100 |
60 |
80 |
100 |
80 |
100 |
注:为了便于进行模型,假设营业员每隔0.1个月检查一次顾客需求订单,如果有顾客需求订单,则以当前库存量采用缺货补足方式满足客户需求。
具体建成的模型界面如图1所示,模型下载。
图1 缺货补足库存系统WITNESS仿真模型界面
2. 系统分析
2.1 元素说明
库存系统需要能够模拟满足顾客需求的过程、库存检验以及采购过程,同时需要能够统计出存储费、缺货费、订货费以及总费用,为了实现这些功能,设计模型的具体元素如表1。
表1 建模元素说明
元素名称 |
元素类型 |
元素数量 |
元素作用 |
需求订单 | part | 1 | 模拟到达间隔服从均值为0.1个月负指数分布的顾客需求 |
库存检查员 |
Part |
1 |
每隔1月到达一次,进行库存检查和采购决策,模拟库存系统中的库存检验员 |
物品 |
Part |
1 |
客户需要的物品 |
营业员 |
Part |
1 |
每隔0.1个月处理一次顾客需求 |
仓库 |
Buffer |
1 |
存储物品的仓库 |
需求订单队列 | Buffer | 1 | 存储待满足的顾客需求订单 |
采购过程 |
Machine:Batch |
1 |
根据NeedPurchase和purchaseQ来进行物品采购 |
发货 |
Machine:Batch |
1 |
模拟依据canMeetQty值向顾客需求订单发货的过程 |
BigS |
Variable:Integer |
1 |
存储库存决策中的S |
Cost |
Variable:Real |
4 |
统计库存系统存储费、缺货费、订货费和三项费用之和 |
LittleS |
Variable:Integer |
1 |
存储库存决策中的s |
NeedPurchase |
Variable:Integer |
1 |
控制变量,当其为1是,表示需要采购;当其为0时,表示不需采购 |
purchaseQ |
Variable:Integer |
1 |
当期采购批量 |
DmdQty |
Distribution |
1 |
某一客户需求的数量 |
canMeetQty | Variable:Integer | 1 | 当批可以满足顾客的需求数量 |
comingTime | Attribute:Real | 1 | 存储每个需求订单到达仓库的时间 |
waitingMeetDmdQty | Attribute:Real | 1 | 存储每个需求订单当前尚需满足的需求数量 |
2.2 运行时间
仿真运行100个时间单位(每个时间单位为现实系统1个月),统计不同采购决策参数BigS和LittleS下的库存系统成本。
3. 元素细节设计
3.1 Part类型元素“缺货物品”和“物品”细节设计
“物品”模拟系统中顾客需求的实际物品,将由“采购过程”元素将其引入模型;而“缺货物品”模拟在仓库货物不足时提供给顾客的虚拟货物以便累积缺货数量,计算缺货费用,该元素将在库存不足时由“客户需求”元素将其引入模型,因此这两类元素均设定为被动型Part,保留Witness系统对Part的缺省设置即可。
3.2 Part类型元素“检查员”细节设计
Part元素“检查员”需要实现的功能为每间隔1个月对库存元素“仓库”中所剩余的物品数量进行检查,如果所剩物品数量小于LittleS,则计算采购物品的数量,向采购过程发送采购指令,因此对其进行细节设置如图2所示。
图2 检验员细节设计对话框
在type栏中选择active选项,表示检验员是主动进入系统;
在inter arrival栏中输入1,表示检验员每隔1个时间单位(月)进入系统检验一次;
在Lot size栏中输入1,表示每次检验员只来一个人。
点击To…按钮,输入“push to ship”,表明检验员进入系统 之后处理了采购决策后立即离开系统;
点击actions on create按钮,输入下列语句:
!每月检查一次,如果当前库存量小于littleS,则将needPurchase设定为1,同时
!将purchaseQ设定为bigS-当前库存量
IF needPurchase = 0 !当以前采购订单全部送达仓库时,再进行下一次采购决策
IF NPARTS (仓库) < littleS !如果当前“仓库”中物品数量小于littleS的值,则进行下列处理
needPurchase = 1
purchaseQ = bigS - NPARTS (仓库)
ENDIF
ENDIF
!
!实时更新库存成本、缺货成本
cost (1) = TIME * APARTS (仓库) * 1.5 !库存成本为截止目前时刻“仓库”的平均库存量*存储费率(1.5)*总时长(TIME)
cost (4) = cost (1) + cost (2) + cost (3) !截止目前时刻系统总成本为三项分成本之和
点击确定按钮,完成设计。
3.3 Part类型元素“需求订单”细节设计
Part元素“需求订单”需要实现的功能为模拟以均值为0.1个月的负指数分布的顾客需求订单,当其到达仓库时,将排入“需求订单队列”等待营业员处理,其细节设置如图3所示。
图3 顾客需求订单细节设计对话框
在type栏中选择active选项,表示需求订单是主动进入系统;
在inter arrival栏中输入“negexp(0.1)”,表示 需求订单到达间隔服从均值为0.1个月的负指数分布;
在Lot size栏中输入1,表示每次只来一个需求订单;
点击To…按钮,输入“push to 需求订单队列”,表明 需求订单到达仓库时,首先进入订单队列;
点击actions on create按钮,输入下列语句,对每个需求订单附上需求量和到达时间:
waitingMeetDmdQty = dmdQty (4) !顾客需求量为经验分布dmdQty()产生
comingTime = TIME !存储顾客进入系统的时间
3.4 Part类型元素“营业员”细节设计
Part元素“营业员”需要实现的功能为每个0.01个月判断一次需求订单队列以及仓库中的物品数量,决定对需求订单队列中第一个订单的发货数量,其细节设置如图4所示。
图4 营业员细节设计对话框
在type栏中选择active选项,表示需求订单是主动进入系统;
在inter arrival栏中输入“0.1”,表示营业员每间隔0.1个 月到仓库检查一次需求队列,并决定发货数量;
点击To…按钮,输入“push to SHIP”,表明营业员来处理发货决策后即退出系统;
点击actions on create按钮,输入下列语句,实现根据需求队列中顾客需求数量和仓库中库存量决定是否本次发货的数量。
IF canMeetQty = 0
IF NPARTS (需求订单队列) > 0 !有需求订单在队列中
canMeetQty = MIN (需求订单队列:waitingMeetDmdQty,NPARTS (仓库))
!可供满足需求订单的物品量为队列中第一个订单待满足物品量与仓库存量之间的最小值
ENDIF
ENDIF
注:
MIN()函数返回多个数据中的最小值;
需求订单队列:waitingMeetDmdQty,返回需求订单队列中第一个需求订单上的待满足需求量
3.4 Distribution类型元素“dmdQty”细节设计
dmdQty元素需要实现能够随机的返回[1,2,3,4]这四个数值中一个,而且返回这四个数的概率分别为1/6,1/3,1/3,1/6,以便模拟顾客需求到达时所需的物品数量,具体设计如图5所示。
图5 需求量经验分布设计界面
如图4所示,distribution设计中主要有两项内容:
Value:经验分布执行一次返回的值;
Weight:经验分布执行一次返回对应值的权重;
在本模型中,返回值为[1,2,3,4]的权重分别为[1,2,2,1],则总的权重数之和为6,而返回值1的权重为1,则该经验分布执行一次返回值为1的可能性为1/6;返回值为2的可能性为2/6=1/3;返回值为3的可能性为2/6=1/3;返回值为4的可能性为1/6。从而实现对顾客需求量模式的模拟。
3.3 Machine类型元素“采购过程”细节设计
Machine类型元素“采购过程”需要实现的功能为:当检验员通过库存检查和库存决策变量判断需要进行采购时,根据采购决策变量needPurchase=1,以及采购批量purchaseQ,向供应商采购物品,并通过1个月的采购以及运输时间将物品送达仓库,因此对其进行细节设置如图6所示。
图6 采购过程细节设计界面
点击Type下拉列表,选择“Batch”,实现该机器采购一批物品;
在Batch Min中输入“purchaseQ”,即每次采购量为purchaseQ的数量;
点击from…按钮,输入下列语句,实现采购过程:
!!当采购决策变量needPurchase=1时,才进行物品的采购
IF needPurchase = 1
PULL from 物品 out of WORLD
ELSE
Wait
ENDIF
在Cycle Time中输入“1”,实现采购提前期为1个月;
点击Actions on Start..按钮,输入语句“cost (3) = cost (3) + 32 + purchaseQ * 3”,实现采购成本的累积计算;
点击to…按钮,输入“push to 仓库”, 实现采购过来的物品将送入“仓库”中;
点击Actions on Output...按钮,输入下列语句,将采购决策变量置0,以便下一次检查员进行库存决策:
!当所采购的物品进入仓库,则将采购决策变量置0
needPurchase = 0
purchaseQ = 0
3.5 Machine类型元素“发货”细节设计
“发货”元素实现的功能为:当发货量canMeetQty大于0时,则从需求订单队列中提取第一个需求订单,并从仓库中提取canMeetQty件物品用于满足需求订单,并将需求订单中待满足需求量waitingMeetDmdQty进行更新,具体设计如图7所示。
图7 发货元素细节设计界面
点击Type下拉列表,选择“Batch”,每次提取单个部件每隔客户需求量可能为多个物品;
在Input Quantity中输入“1+canMeetQty”,即每次发货都提取1个需求订单和canMeetQty数量的物品;
点击from…按钮,输入下列语句,实现当能够发货的数量大于零时,从需求队列中提取一个需求订单,并从仓库中提取canMeetQty个物品:
IF canMeetQty > 0 !判断要能够满足部分或全部客户需求
SEQUENCE /Wait 需求订单队列#(1),仓库#(canMeetQty)
ELSE
Wait
ENDIF
点击Actions on Start...按钮,在编辑框中输入下列语句,更新需求订单的待满足量waitingMeetQty,并累计当前被满足的需求量的缺货成本;
!需求订单的待满足需求量更新为需求订单原有待满足量减去当前满足量
发货:waitingMeetDmdQty = 发货:waitingMeetDmdQty - canMeetQty
!累积缺货费用
cost (2) = cost (2) + (TIME - comingTime) * canMeetQty * 15
!将canMeetQty重置为0
canMeetQty = 0
点击To...按钮,输入下列语句,实现将完全满足的订单和物品送出系统,而将尚没有完全得到其所需物品(waitingMeetDmdQty>0)的订单排入需求队列
IF TYPE = 需求订单 !如果当前需要输出的元素名称为“需求订单”,则使用下面根据零件属性waitingMeetDmdQty是否等于0进行输出目的地的选择
IF waitingMeetDmdQty = 0
PUSH to SHIP
ELSE
PUSH to 需求订单队列
ENDIF
ELSE
PUSH to SHIP
ENDIF注:
(1)Type:TYPE是一个名型系统属性,存储当前零件、输送器、车辆和劳动者单元的名称。例如,如果当前零件是名字叫BOX,TYPE的值为BOX。
如果在模型中需要针对不同零件、输送器、车辆和劳动者进行特定的处理,TYPE属性可以派上用途。
如“发货”设备To...按钮中的第一句:
IF TYPE = 需求订单
(2)ElementName {at position}:AttributeName:适用于指代或提取元素ElementName上处于位置position上Part元素的AttributeName。
当指ElementName元素上第1个位置上的第一个Part元素的属性时,可以省略位置信息;
当指发生事件的本元素上的第一个位置上的Part元素属性时,ElementName参数可以省略;
例如:
在“发货”设备Actions on Start...中的第一句:
发货:waitingMeetDmdQty = 发货:waitingMeetDmdQty - canMeetQty,即将在开工时刻,将发货设备上的第一个零件Part的waitingMeetDmdQty减去canMeetQty后对其waitingMeetDmdQty进行更新,这里带上零件所处的寄主元素名称“发货”;
在“发货”设备To...按钮中的第二句:
IF waitingMeetDmdQty = 0
判断发货设备上零件的waitingMeetDmdQty属性值是否等于0,这里省却ElementName参数,即寄主元素名称“发货”。
3.6 模型初始化设计
该库存模型需要不断改变的为库存决策参数BigS和LittleS的组合,需要模型在仿真实验之前就对这两个参数赋值。通过系统菜单项Model-->Initialization Actions...(该操作见图8)打开初始化设计对话框,向对话框中输入 下面两行赋值语句进行决策参数的赋值。
littleS = 20
bigS = 40
图8 初始化过程菜单项操作
4. 仿真实验及结果分析
对每种(s,S)的组合进行仿真实验,得到的成本统计数据如表3所示 ,仿真结束时间100,从表中可以看出最优决策参数配置为[60,80],可以获得最低总成本14666。
表3 不同(s,S)组合下的库存成本
方案 |
s |
20 |
20 |
20 |
20 |
40 |
40 |
40 |
60 |
60 |
S |
40 |
60 |
80 |
100 |
60 |
80 |
100 |
80 |
100 |
|
存储费 |
245 |
1650 |
3040 |
4653 |
1837 |
4080 |
5596 |
4344 |
6936 |
|
缺货费 |
229531 |
7574 |
4729 |
2559 |
6046 |
1324 |
1044 |
988 |
385 |
|
采购费 |
7752 |
9281 |
9024 |
8941 |
9486 |
9312 |
9101 |
9585 |
9372 |
|
总费用 |
237377 |
18505 |
16793 |
15863 |
17158 |
14716 |
15490 |
14666 |
16693 |
注:由于客户需求的随机性,需要进行多次实验后,对每种(s,S)配置下的库存系统Cost数值求平均后,数据方具有实际比较意义。