缺货不补随机库存系统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)销售策略:

      缺货补足:当客户需求到达时,如果仓库中没有足够的产品,则仅以现有库存满足客户需求,剩余未满足的客户需求等待下批送达的物品给予满足。

   当公司相关库存费率如下时:

      通过建立仿真模型并进行仿真实验,分析公司采用如下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 检验员细节设计对话框

 

!每月检查一次,如果当前库存量小于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 顾客需求订单细节设计对话框

 

waitingMeetDmdQty = dmdQty (4) !顾客需求量为经验分布dmdQty()产生
comingTime = TIME
!存储顾客进入系统的时间

3.4 Part类型元素“营业员”细节设计

    Part元素“营业员”需要实现的功能为每个0.01个月判断一次需求订单队列以及仓库中的物品数量,决定对需求订单队列中第一个订单的发货数量,其细节设置如图4所示。

 

图4 营业员细节设计对话框

 

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 采购过程细节设计界面

!!当采购决策变量needPurchase=1时,才进行物品的采购
IF needPurchase = 1
    PULL from 物品 out of WORLD
ELSE
    Wait
ENDIF

!当所采购的物品进入仓库,则将采购决策变量置0
needPurchase = 0
purchaseQ = 0

 

3.5 Machine类型元素“发货”细节设计

    “发货”元素实现的功能为:当发货量canMeetQty大于0时,则从需求订单队列中提取第一个需求订单,并从仓库中提取canMeetQty件物品用于满足需求订单,并将需求订单中待满足需求量waitingMeetDmdQty进行更新,具体设计如图7所示。

 

  

 

图7 发货元素细节设计界面

IF canMeetQty > 0 !判断要能够满足部分或全部客户需求
    SEQUENCE /Wait 需求订单队列#(1),仓库#(canMeetQty)
ELSE
    Wait
ENDIF

!需求订单的待满足需求量更新为需求订单原有待满足量减去当前满足量
发货:waitingMeetDmdQty = 发货:waitingMeetDmdQty - canMeetQty
!累积缺货费用
cost (2) = cost (2) + (TIME - comingTime) * canMeetQty * 15
!将canMeetQty重置为0
canMeetQty = 0

IF TYPE = 需求订单   !如果当前需要输出的元素名称为“需求订单”,则使用下面根据零件属性waitingMeetDmdQty是否等于0进行输出目的地的选择
    IF waitingMeetDmdQty = 0
        PUSH to SHIP
    ELSE
        PUSH to 需求订单队列
    ENDIF
ELSE
    PUSH to SHIP
ENDIF

注:

(1)Type:TYPE是一个名型系统属性,存储当前零件、输送器、车辆和劳动者单元的名称。例如,如果当前零件是名字叫BOXTYPE的值为BOX

如果在模型中需要针对不同零件、输送器、车辆和劳动者进行特定的处理,TYPE属性可以派上用途。

     如“发货”设备To...按钮中的第一句

          IF TYPE = 需求订单

 

(2)ElementName {at position}:AttributeName适用于指代或提取元素ElementName上处于位置position上Part元素的AttributeName。

例如:

     在“发货”设备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数值求平均后,数据方具有实际比较意义。