存储论——经济订货批量的R和Python实现

存储论又称库存理论,是运筹学中发展较早的分支。早在 1915 年,哈李斯(F.Harris)针对银行货币的储备问题进行了详细的研究,建立了一个确定性的存储费用模型,并求得了最佳批量公式。1934 年威尔逊(R.H.Wilson)重新得出了这个公式,后来人们称这个公式为经济订购批量公式(简称为 EOQ 公式)。这是属于存储论的早期工作。存储论真正作为一门理论发展起来还是在二十世纪 50 年代的事。1958 年威汀 (T.M.Whitin)发表了《存储管理的理论》一书,随后阿罗(K.J.Arrow) 等发表了《存储和生产的数学理论研究》,毛恩(P.A.Moran)在 1959 年写了《存储理论》。此后,存储论成了运筹学中的一个独立的分支,有关学者相继对随机或非平稳需求的存储模型进行了广泛深入的研究。

一、存储论概述

现代经济活动的生产和经营活动都离不开存储,为了使生产和经营活动有条不紊地进行,都需要一定数量的储备物资来支持。所谓存贮实质上是将供应与需求两个环节以存储中心联结起来,起到协调与缓和供需之间矛盾的作用。存储模型的基本形式如下图所示:

1.1 库存管理的基本要素

(1)需求率:单位时间内对某种物品的需求量,用 D 表示。
(2)订货批量:一次订货中,包含某种货物的数量,用Q 表示。
(3)订货间隔期:两次订货之间的时间间隔,用 T 表示。

1.2 库存管理的基本费用

(1)购置费:购置物品时花费的费用,即因购置物品而支出的货款,等于物品的单价乘以需求量。由于供应商一般会给一次订购某一数量的商品折扣价格,因此购置费可能会随着每次订购商品批量不同而改变。
(2)存储费\(C_1\)。指为保存物品而支付的费用,如利息、折旧、损耗、财产税、保险等。现代管理把库存占用资金的机会成本(即这些资金若投资于他处所能获得的收益)也计入保管费中,而机会成本占保管费的比例在40%以上。保管费用可占到库存价值的20%~35%。保管费用往往用占库存价值的百分比来估算。
(3)订货费\(C_3\)。指为补充而需要订购物品时支付的费用。其构成有两类,一是与订货次数有关的费用,如准备订单、洽商等。二是与订货次数无关的费用,如运费,办公管理等费用。
(4)缺货费\(C_2\)。由于存储不能满足需求而造成的损失。为补充订货往往比正常订货要增加额外的开支,为补足短缺造成加班加点的额外支出,未按期交货引起客户索赔、撤消合同甚至丧失市场等经济损失。

1.3 库存管理策略

所谓一个管理策略,是指决定什么情况下对存贮进行补充,以及补充数量的多少。 下面是一些比较常见的库存管理策略。
(1)t 循环策略:不论实际的存贮状态如何,总是每隔一个固定的时间t ,补充 一个固定的存储量Q 。
(2)(t,S) 策略:每隔一个固定的时间 t 补充一次,补充数量以补足一个固定的最大存储量 S 为准。因此,每次补充的数量是不固定的,要视实际存储量而定。当存储(余额)为 I 时,补充数量为Q = S − I 。
(3)(s,S) 策略:当存储(余额)为 I ,若 I > s ,则不对存储进行补充;若 I ≤ s , 则对存储进行补充,补充数量Q = S − I 。补充后达到最大存储量 S。s 称为订货点(或 保险存贮量、安全存贮量、警戒点等)。
在很多情况下,实际存储量需要通过盘点才能 得知。若每隔一个固定的时间t 盘点一次,得知当时存储 I ,然后根据 I 是否超过订货点 s,决定是否订货、订货多少,这样的策略称为(t,s,S)策略。

二、确定性存储模型

存储论的数学模型一般分成两类:一类是确定性模型,它不包含任何随机因素,另一类是带有随机因素的随机存贮模型,这里主要总结确定性存储模型。

2.1 经典的EOQ订货模型

模型1 模型2 模型3 模型4
模型假设 需求是连续的、均匀的,需求速度是常数 R(单位时间的需求量);补充可以瞬间实现,补充时间 t 近似为 0;单位 C1 存储费不变;每次订货量 Q 不变,订购费 C3 不变,货物单价 K 不变;单位缺货成本 C2 为无穷大 在模型1假设基础上,补货需要一定时间,不考虑拖延时间,只考虑生产(装配)时间,生产速度是连续均匀的周期的,生产速度为常数 P(P>R) 与模型一相比,允许缺货!!!,补货时间极短 与模型一相比,补货时间较长,容许缺货
模型状态图
单位时间的总平均费用 \(C(t)=\frac{C_3}{t}+KR+\frac{1}{2}C_1Rt\) \(C(t)=\frac{1}{t}[\frac{1}{2}C_1(P-R)\frac{Rt^2}{P}+C_3]\) \(C(t, S)=\frac{1}{t}[\frac{C_1S^2}{2R}+\frac{C_2(Rt-S)^2}{2R}+C_3]\) \(C(t, t_2)=\frac{1}{2}\frac{(P-R)R}{P}[C_1 t-2 C_1 t_2+(C_1+C_2) \frac{t_2^2}{t}]+\frac{C_3}{t}\)
最佳定货周期 \(t^*=\sqrt{\frac{2 C_3}{C_1 R}}\) \(t^*=\sqrt{\frac{2 C_3}{C_1 R}}\cdot \sqrt{\frac{P}{P-R}}\) \(t^*=\sqrt{\frac{2 C_3}{C_1 R}}\cdot \sqrt{\frac{C_2}{C_1+C_2}}\) \(t^*=\sqrt{\frac{2 C_3}{C_1 R}} \cdot \sqrt{\frac{C_1+C_2}{C_2}} \cdot \sqrt{\frac{P}{P-R}}\)
最大缺货量 0 0 $$B^* = \sqrt{\frac{2 C_1 C_3 R}{C_2(C_1+C_2)}} $$ \(B^*=\sqrt{\frac{2 C_1 C_3 R}{\left(C_1+C_2\right) C_2}} \cdot \sqrt{\frac{P-R}{P}}\)
最佳定货量 \(Q^*=R t^*=\sqrt{\frac{2 C_3 R}{C_1}}\) \(Q^*=\sqrt{\frac{2 C_3 R}{C_1}}\cdot \sqrt{\frac{P-R}{P}}\) \(Q^*=\sqrt{\frac{2 C_3 R}{C_1}} \cdot \sqrt{\frac{C_1+C_2}{C_2}}\) \(Q^*=\sqrt{\frac{2 C_3 R}{C_1}} \cdot \sqrt{\frac{C_1+C_2}{C_2}} \cdot \sqrt{\frac{P}{P-R}}\)
最大存储量 \(Q^*=\sqrt{\frac{2 C_3 R}{C_1}}\) $ S^* = \sqrt{\frac{2 C_3 R}{C_1}} \cdot \sqrt{\frac{P-R}{P}} $ \(S^*=\sqrt{\frac{2 C_3 R}{C_1}} \cdot \sqrt{\frac{C_2}{C_1+C_2}}\) \(S^*=\sqrt{\frac{2 C_3 R}{C_1}} \cdot \sqrt{\frac{C_2}{C_1+C_2}} \cdot \sqrt{\frac{P-R}{P}}\)
最小费用 $C^*=\sqrt{2 C_1 C_3 R} $ $C^*=\sqrt{2 C_1 C_3 R}\cdot \sqrt{\frac{P}{P-R}} $ $C^*=\sqrt{2 C_1 C_3 R}\cdot \sqrt{\frac{C_2}{C_1+C_2}} $ \(C^*=\sqrt{2 C_1 C_3 R} \cdot \sqrt{\frac{C_2}{C_1+C_2}} \cdot \sqrt{\frac{P-R}{P}}\)

2.2 经济订购批量的折扣模型

经济订购批量折扣模型是经济订购批量存贮模型的一种发展,即商品的价格 是不固定的,是随着订货量的多少而改变的。就一半情况而论,物品订购的越多,物品的单价也就越低,因此折扣模型就是讨论这种情况下物品的订购数量。 一年花费的总费用由三个方面组成:年平均存贮费、年平均订货费和商品的购买费用,即

\[C=\frac{1}{2}QC_1++\frac{C_3D}{Q}+Dk(Q) \]

比如说订购量为 \(Q\), 其单价 \(K(Q)\) :

\[K(Q)= \begin{cases}K_1 & 0 \leq \mathrm{Q}<\mathrm{Q}_1 \\ K_2 & \mathrm{Q}_1 \leq Q<\mathrm{Q}_2 \\ \vdots & \\ K_j & \mathrm{Q}_{j-1} \leq Q<\mathrm{Q}_{\mathrm{j}} \\ \vdots & \\ K_m & \mathrm{Q}_{m-1} \leq Q\end{cases} \]

对应的平均单位货物所需费用为:

\[C^j(Q)=\frac{1}{2} C_1 \frac{Q}{R}+\frac{C_3}{Q}+K_j \quad(j=1,2, \cdots, m) \]

\(C^1(Q)\) 求得极值点为 \(Q_0\), 若 \(Q_{j-1} \leq Q_0<Q_j\), 求

\[\min\{C^j(Q_0), C^{j+1}(Q_j), \cdots, C^m (Q_{m-1})\} \]

设从此式得到的最小值为 \(C^l\left(Q_{l-1}\right)\), 则取 \(Q^*=Q_{l-1}\)

三、存储策略的R计算

3.1 模型4经济订货批量

例1:对某产品的需求量为350件/年(设一年以300工作日计),已知每次订货费为50元,该产品的存贮费为13.75元/(件·年),缺货时的损失为25元/(件·年),订货提前期为5天。该种产品由于结构特殊,需用专门车辆运送,在向订货单位发货期间,每天发货量为10件。试求:(1)经济订货批量及最大缺货量;(2)年最小费用。

#输出四位数字
options(digits=4)
#初始化,时间单位为年
C1=13.75     #存储成本
C2=25        #缺货成本
C3=50        #订购费用
P=3000       #年生产量
R=350        #年需求量
#计算程序
T<-(2*C3/(C1*R))^0.5 *(P/(P-R))^0.5 *((C1+C2)/C2)^0.5 
Q=(2*C3*R/C1)^0.5 *  ((C1+C2)/C2)^0.5 *(P/(P-R))^0.5
S=(2*C3*R/C1)^0.5 * (C2/(C1+C2))^0.5 * ((P-R)/P)^0.5
C=(2*C1*C3*R)^0.5 * ((P-R)/P)^0.5* (C2/(C1+C2))^0.5
cat("最佳定货周期:",T*300,'\n')
cat("最佳定货量:",Q,'\n')
cat("最大存储量:",S,'\n')
cat("最小费用:",C,'\n')
最佳定货周期: 57.28 (天) 
最佳定货量: 66.83 
最大存储量: 38.09 
最小费用: 523.7 
import math
# 初始化,时间单位为年
C1 = 13.75  # 存储成本
C2 = 25     # 缺货成本
C3 = 50     # 订购费用
P = 3000    # 年生产量
R = 350     # 年需求量

# 计算程序
T = round((2 * C3 / (C1 * R))**0.5 * (P / (P - R))**0.5 * ((C1 + C2) / C2)**0.5, 2)
Q = round((2 * C3 * R / C1)**0.5 * ((C1 + C2) / C2)**0.5 * (P / (P - R))**0.5, 2)
S = round((2 * C3 * R / C1)**0.5 * (C2 / (C1 + C2))**0.5 * ((P - R) / P)**0.5, 2)
C = round((2 * C1 * C3 * R)**0.5 * ((P - R) / P)**0.5 * (C2 / (C1 + C2))**0.5, 2)

print("最佳定货周期:", round(T * 300, 2))
print("最佳定货量:", Q)
print("最大存储量:", S)
print("最小费用:", C)

3.2 折扣下的经济订货批量

例2:某公司计划订购一种商品用于销售。该商品的年销售量为 40000 件,每次订货费为 9000 元,商品的价格与订货量的大小有关,为

\[ K(Q)=\begin{cases} 35.225 & 0\leq Q < 10000 \\ 34.525 & 10000 \leq Q <20000 \\ 34.175 & 20000 \leq Q < 30000 \\ 33.825 & 30000 \leq Q \end{cases}\]

每年的单位存储成本为6元,问如何安排订购量和订购时间。

#经济订货批量折扣模型
#初始化,时间单位为年
#D=96000
k=35.225       #价格折扣初始值
C1=6           #存储成本
C3=9000        #订购费用
R=40000        #年需求量

l=c(0,10000,20000,30000)   #订货数量分段值
Q=(2*C3*R/C1)^0.5          #EOQ订货批量

#定义数量折扣分段函数
fun1=function(x){
  if (x>0 & x<10000) a=35.225
  else if (x>=10000 & x<20000) a=34.525  
      else if (x>20000 & x<=30000) a=34.175  
        else if (x>=30000) a=33.825
          else  a=0
 return (a)
}

#定义成本函数
fun2=function(x) {0.5*C1*x/R +C3/x +fun1(x)}

#最佳订货批量Q1
b=fun2(Q)
for (i in 1:length(l)) {if (fun2(l[i])<=b) b=fun2(l[i])}
l[1]=Q
for (i in 1:length(l)) {if (fun2(l[i])==b) Q1=l[i]}
#订货时间T
T=Q1/R
Q1=20000(个);T=0.5(年)  #计算结果
import numpy as np
# 初始化,时间单位为年
# D = 96000
k = 35.225       # 价格折扣初始值
C1 = 6           # 存储成本
C3 = 9000        # 订购费用
R = 40000        # 年需求量

l = np.array([0, 10000, 20000, 30000])   # 订货数量分段值
Q = (2 * C3 * R / C1)**0.5               # EOQ订货批量

# 定义数量折扣分段函数
def fun1(x):
    if 0 < x < 10000:
        return 35.225
    elif 10000 <= x < 20000:
        return 34.525
    elif 20000 < x <= 30000:
        return 34.175
    elif x >= 30000:
        return 33.825
    else:
        return 0

# 定义成本函数
def fun2(x):
    if x == 0:
        return np.inf  # Handle division by zero
    return 0.5 * C1 * x / R + C3 / x + fun1(x)

# 最佳订货批量 Q1
b = fun2(Q)
for i in range(len(l)):
    if fun2(l[i]) <= b:
        b = fun2(l[i])
l[0] = Q
for i in range(len(l)):
    if fun2(l[i]) == b:
        Q1 = l[i]

# 订货时间 T
T = Q1 / R

# 输出结果保留两位小数
print(f"最佳订货批量 Q1: {Q1:.2f}")
print(f"订货时间 T: {T:.2f}")

例3:某厂每年需某种元件 30000 个,每次订购费 1000 元,保管费每件每年100元,不允许缺货。元件单价 K 随采购数量不同而有变化。

\[ K(Q)=\begin{cases} 200 & 0\leq Q < 1500 \\ 198 & 1500 \leq Q \end{cases}\]

求最佳订货批量。

经济订货批量折扣模型
#初始化,时间单位为年

k=200       #价格折扣初始值
C1=100       #存储成本
C3=1000        #订购费用
R=30000        #单位时间需求

l=c(0,1500)   #数量分段值
Q=(2*C3*R/C1)^0.5          #EOQ订货批量


#数量折扣分段函数
fun1=function(x){
  if (x>0 & x<1500) a=200
  else if (x>=1500) a=198
  else  a=0
  return (a)
}

#成本函数
fun2=function(x) {0.5*C1*x/R +C3/x +fun1(x)}

#最佳订货批量Q1
b=fun2(Q)
for (i in 1:length(l)) {if (fun2(l[i])<=b) b=fun2(l[i])}
l[1]=Q
for (i in 1:length(l)) {if (fun2(l[i])==b) Q1=l[i]}
Q1
Q1=1500(个)
import numpy as np

# 初始化,时间单位为年
k = 200  # 价格折扣初始值
C1 = 100  # 存储成本
C3 = 1000  # 订购费用
R = 30000  # 单位时间需求

# 数量分段值
l = np.array([0, 1500])

# EOQ订货批量
Q = np.sqrt(2 * C3 * R / C1)

# 数量折扣分段函数
def fun1(x):
    if 0 < x < 1500:
        a = 200
    elif x >= 1500:
        a = 198
    else:
        a = 0
    return a

# 成本函数
def fun2(x):
    if x == 0:
        return float('inf')  # Avoid division by zero
    return 0.5 * C1 * x / R + C3 / x + fun1(x)

# 最佳订货批量 Q1
b = fun2(Q)
for i in range(len(l)):
    if fun2(l[i]) <= b:
        b = fun2(l[i])
l[0] = Q
for i in range(len(l)):
    if fun2(l[i]) == b:
        Q1 = l[i]

print("最佳订货批量 Q1:", Q1)

四、综合练习

例4:甲公司是一家标准件分销商,主要业务是采购并向固定客户供应某种标准件产品。有关资料如下:(1)该标准件上一年订货次数为60次,全年订货成本为80万元,其中固定成本总额为26万元,其余均为变动成本。单位变动成本和固定成本总额不变;(2)该标准件仓储总费用中,每年固定租金成本为120万元,每增加一件标准价就增加1元仓储费。每件标准件的占用资金为50元,资金利息率为6%;(3)该标准件年需要量为180万件。一年按照360天计算;(4)该标准件从发出订单到货物送达需要5天。
要求:(1)计算每次订货变动成本;(2)计算单位变动储存成本;(3)根据经济订货模型,计算该标准件的经济订货批量和最佳订货周期(按天表示);(4)计算再订货点。

(1) 每次订货变动成本=(80-26)10000/60=9000(元)
【解析】订货总成本80万,其中固定成本26万,可知变动成本总额是80-26=54万元,全年订货60次,总订货变动成本54万元,则每次订货变动成本=54万元/60次=0.9万元=9000元
(2)单位变动储存成本=1+50
6%=4(元/件)
【解析】储存成本包括固定储存成本+变动储存成本。每增加一件标准价就增加1元仓储费,这不就是变动成本的定义吗?可知1元为单位变动成本。以往的客观题也练习过存货的机会成本也是变动储存成本,单位机会成本=占用资金资金利息率=506%。综上,单位变动储存成本由上述两部分构成。
(3)经济订货批量= =90000(件)
每年最佳订货次数=1800000/90000=20(次)
最佳订货周期=360/20=18(天)
【解析】经济订货批量套公式就是了,没什么好说的。
最佳订货次数=全年需要量/经济订货批量
最佳订货周期=360/最佳订货次数
(4)每日平均需用量=1800000/360=5000(件)
再订货点=55000=25000(件)
【解析】再订货点=每日需要量
送货期

总结

存储系统可以用“供-存-销”三个活动来描述,通过订货以及货后的存储与销售来满足顾客的需求,或者说由于生产或销售的需求,从存储系统中取出一定量的库存货物,这就是存储系统的输出。存储的货物由于不断的输出而减少,必须及时的补充,补充就是存储系统的输入,补充可以通过外部订货,采购等活动来进行,也可以通过内部的生产活动来进行,在这个系统中,决策者可以通过控制订货时间的间隔和订货量的多少来调节系统的运行,使得在某种准则下系统运行达到最优。因此,存储论中研究的主要问题可以概括为,何时订货(补充存贮),每次订多少货(补充多少库存)这两个问题,文中给出了数学模型化解决方案。

参考文献

存储论(一):基本概念、无约束的确定型存贮模型
EOQ经济批量模型上篇(模型基础)

posted @ 2023-04-06 09:46  郝hai  阅读(1036)  评论(0编辑  收藏  举报