關成斌
(廣東東軟學院 信息管理與工程學院,廣東 佛山 528225)
在組織生產時需要采購原料,除了原料的價格成本外,一般還涉及兩項支出:一是單次訂貨成本,是指因訂貨而支付的費用,常常是按照批次進行收費的;二是庫存成本,是指原料到達工廠后,進行原料存儲所需支付的費用,在一般的研究中,認為庫存成本與數量呈線性關系,即采用單位庫存成本表示[1-2]。
實際上,單次訂貨成本與單位庫存成本呈現出相反的走勢,即單次訂貨批量多,則均攤到每件原料上的單次訂貨成本就低,但同時會造成庫存數量和天數增多,因此單位庫存成本自然就提高了。如何平衡這個問題,雷蒙德·費爾菲爾德等學者們提出了經濟訂貨批量的概念。所謂經濟訂貨批量(Economic Order Quantity,EOQ),是指通過平衡單次訂貨成本和庫存成本核算,以實現總成本最低的最佳訂貨量。經濟訂貨批量是固定訂貨批量模型的一種,可以用來確定企業一次訂貨的數量。當企業按照經濟訂貨批量來訂貨時,可實現單位原料的訂貨成本和庫存成本之和最小化[2-5]。
但是在實際的操作中存在一種超限的情況:工廠倉庫較小,但是可以在附近租借別人的倉庫進行臨時存放,但是相對自有倉庫的庫存成本明顯增加,稱之為存在超限庫存,此時經濟訂貨批量的確定就變得比較復雜。
目前針對訂貨批量的研究方法較多,常見的是解析法,通過數學推導的方式得到經濟訂貨批量的計算公式,然后帶入相應參數進行計算。但是對于超限經濟批量的情況,雖然可以得到解析式,但是相對于典型的經濟訂貨批量公式更加復雜,本文借助Python編程語言提出了一種基于數據分析法的超限經濟訂貨批量確定方法。
本文的研究場景:工廠倉庫較小,但是可以在附近租借別人的倉庫進行臨時存放,但是相對自有倉庫,其庫存成本明顯增加,研究這種情況下的經濟訂貨批量。
研究思路:給出不同情況下的平均單位訂貨成本與庫存成本之和(以下簡稱單位總成本)的計算公式,基于Python及numpy、matplotlib庫計算不同訂貨批量情況下的平均單位總成本,采用數據分析法找出單位總成本最低情況下的訂貨批量,即為經濟訂貨批量,如圖1所示。

圖1 超限情況下經濟訂貨批量研究思路
不超限情況時,單次訂貨批量Q低于額定庫存容量E,這種情況比較簡單,只需要考慮單位原料訂貨成本和單位原料庫存成本即可。
參數假設:Q為單次訂貨批量(套);S為單次訂貨成本;C為單位庫存成本(一套原料一天的庫存成本);E為額定庫存容量(套);D為一天消耗量(套)。
單次訂貨批量為Q情況下的單位原料訂貨成本為:

原料的消耗天數為Q D;在原料的消耗周期內,每天的平均庫存量為Q2;因此在原料消耗周期內的總庫存為:Q2()2D(天·套);總的庫存成本為:Q2C/(2D),平均一套原料的庫存成本為:

因此,在單次訂購批量為Q套原料時,單位總成本為:

參數假設同上,推導思路是,首先將所有原料按照正常庫存成本計算,然后再將超限的部分單獨計算,將兩部分相加即可,其中第一部分的計算同1.2節所述。
第二部分的計算方法如下:
超限的數量為:Q-E;超限部分的消耗天數為:在超限部分的消耗周期內,每天的平均超限數量為:;因此在超限部分消耗周期內的總超限量為:則平均單位原料額外支出的超限成本為:

有兩點需要注意:(1)超限單價取Co-C,主要是考慮這一部分已經按照正常庫存計算了,因此在計算超限成本時要去除正常庫存情況下的成本;(2)分母上的Q,是用于計算這部分成本均攤到此次訂貨批量的單位成本,因此應取Q而非Q-E。
因此,在訂貨批量為Q時,單位總成本為:

合并以上兩種情況,可以得到考慮超限情況下訂貨批量為Q時,單位總成本計算公式為:

按照傳統的解析法,需要利用式(6)對Q求導,并令其為0,即可得到TC為最小值時Q的計算公式,也就是經濟訂貨批量[2,6]。但是,對于式(6)來說,采用解析法存在兩個方面的問題:(1)由于Q<E、Q≥E兩種情況分別對應兩個計算公式,因此需要進行兩次計算,兩次計算的結果還需要帶入式(6)進行驗證,判斷到底應該取哪個結果,因此處理起來略顯麻煩[4,6];(2)對于Q≥E的情況進行求導計算相對比較麻煩,而且推導出來的結果也較復雜,應用不便[7]。
為了解決上述問題,本文采用Python程序設計語言及其numpy、matplotlib等模塊編寫程序,利用數據分析法進行超限經濟訂貨批量的確定和處理[8]。
基本的思路是從式(6)入手,通過編程計算不同Q值情況下的TC(Q)值,并繪制出曲線,找出曲線上最小的點,則該點對應的Q值為經濟訂貨批量,曲線的最小值則為單位原料最小總成本。為更簡單便捷的實現,程序引用numpy庫,該庫是Python的一種開源的數值計算擴展,可用來存儲和處理大型矩陣,支持大量的維度數組與矩陣運算,也針對數組運算提供大量的數學函數庫。為更直觀地展示訂貨批量與各成本的關系,引入matplotlib庫,它是一個Python的2D繪圖庫,可以便捷地生成直方圖、功率譜、條形圖、錯誤圖、散點圖等常用的可視化圖形[9-10]。
程序流程圖如圖2所示。

圖2 超限經濟訂貨批量數據分析法程序流程圖
程序代碼如下:
#-*-coding:utf-8-*-
"""
Created on Sat Jun 19 10:10:34 2021@author:gcb
"""
import numpy as np
from matplotlib import pyplot as plt
###=====參數設定=======
[S,D,E,C,Co]=[int(input("固定訂貨成本:")),
int(input("一天消耗量:")),
int(input("額定庫存:")),
float(input("單位庫存成本:")),
float(input("超限單位庫存成本:"))][Qmin,Qmax,Qd]=[int(input("最小計算庫存:")),
int(input("最大計算庫存:")),
int(input("計算庫存間隔:"))]
###====================
###=====成本計算========
Q=np.asarray(range(Qmin,Qmax,Qd))#生成計算庫存列表
COR=[] #超限成本
TC=[] #總成本列表
for ii in range(len(Q)):
Oc=S/Q[ii] #單位訂貨成本
Sc=Q[ii]*C/2/D #不考慮超限情況下的單位庫存成本
if Q[ii]<=E: #判斷有無超限
Cor=0 #超限成本
else:
Cor=(Q[ii]-E)*(Q[ii]-E)*(Co-C)/(2*D*Q[ii])#超限成本
COR.append(Cor)
TC.append(Oc+Sc+Cor)
OC=S/Q #單位訂貨成本列表
SC=Q*C/2/D #單位庫存成本列表
jj=np.where(TC==min(TC))[0]
print("當采購量為:{}套時,最小單位成本為:{:0.2f}元。".format(Q[jj][0],min(TC)))
###====================
###=====可視化=========
plt.figure(figsize=(10,8))
plt.rcParams['font.sans-serif']=['STSong']#正常顯示漢字,后面的是字體
plt.xlabel("訂貨量",fontsize=20)
plt.ylabel("單位平均成本",fontsize=20)
A,=plt.plot(Q,TC,':',label='總成本')
B,=plt.plot(Q,OC,'-.',label='訂貨成本')
C,=plt.plot(Q,SC,'-x',label='正常庫存成本')
D,=plt.plot(Q,COR,'--',label='超庫存成本')
E,=plt.plot([Q[jj],Q[jj]],[0,30],label='經濟訂貨批量')
font1={'family':'STSong','weight':'normal','size':20}
legend=plt.legend(handles=[A,B,C,D,E],prop=font1)
plt.axis([Qmin,Qmax,0,30])
plt.tick_params(labelsize=20)
plt.text(Q[jj][0],min(TC),"({},{:.2f})".format(Q[jj][0],
min(TC)),
fontsize=20,horizontalalignment='center')#將經濟訂貨批量及其對應成本顯示在圖形中plt.show()
###=====================
從流程圖和代碼可見程序主要分成三部分,第一部分為參數設置部分,主要用于輸入關鍵參數,包括固定訂貨成本、一天消耗量、額定庫存、單位庫存成本、超限單位庫存成本,以及計算參數最小計算庫存、最大計算庫存、計算庫存間隔;第二部分為成本計算部分,主要是利用輸入的參數以及前文所述的式(6)計算單位平均訂貨成本、單位平均庫存成本、單位平均超限庫存成本以及單位平均總成本;第三部分為可視化部分,采用圖形的方式直觀顯示各成本曲線以及最小訂貨批量與各成本之間的關系。
為了驗證本文提出的方法,設置多種案例進行計算分析。
參數設定:固定訂貨成本40 000,每日消耗量400,單位庫存成本1.5,超限單位庫存成本7,額定庫存3 000,最小計算庫存1 000,最大計算庫存10 000,計算庫存間隔100。
如圖3所示,運行程序,在Console欄按照提示輸入相關參數后,程序會執行運算并繪制圖形,在Console區域顯示經濟訂貨批量和最小單位成本。

圖3 程序運行案例分析
程序可視化圖形如圖4所示,在同一張圖上展示了單位平均訂貨成本、單位平均正常庫存成本、單位平均超限庫存成本、單位平均總成本隨訂貨量變化的曲線,并展示了單位平均總成本最低對應的訂貨批量,即經濟訂貨批量,而且展示了經濟訂貨批量對應的單位平均總成本。由圖4可知,單位平均訂貨成本隨訂貨量的增加而降低,單位平均庫存成本隨訂貨量的增加而增加,單位平均超庫存成本為一個多階增函數,總成本呈現為凹函數,因此一定存在一個極小值,該極小值即為經濟訂貨批量對應的最小單位平均總成本。
由圖4可知,在此案例條件下,經濟訂貨批量為3 400套,對應的單位總成本為18.46元/套,經濟訂貨批量是高于額定庫存的,因此可以通過租用最多400套原料的倉庫來降低單位平均總成本。

圖4 案例一可視化圖形
固定訂貨成本設定為10 000,其余參數同案例一。將上述參數輸入程序,輸出結果如圖5所示。在固定訂貨成本從40 000元降低為10 000元,其他條件不變的情況下,計算出來的經濟訂貨批量為2 300套,此時并沒有超出額定庫存量,也就是說,并不需要租用其他倉庫。

圖5 案例二可視化圖形
以上兩個案例的經濟訂貨批量都是整百的,實際上是由我們設置的計算庫存間隔決定的,由于兩個案例設置的計算間隔均為100,因此計算出來的經濟訂貨批量也必然是整百的數,為了提高準確度,可以采用二次分析法。即第一次采用低分辨率找到經濟訂貨批量的大概位置,第二次計算時縮小計算范圍,提高分辨率。
如針對案例一進行第二次運算時,可以將最小計算庫存設置為3 300,最大計算庫存設置為3 500,計算庫存間隔設為1,輸出的可視化圖形如圖6所示,此時的經濟訂貨批量為3 412,計算結果更精確。

圖6 案例一二次計算輸出圖形
本文對超限經濟訂貨批量的確定方法進行了研究,根據一種實際應用場景,提出并實現了基于Python及其numpy、matplotlib等模塊的超限經濟訂貨批量數據分析法,經過具體案例分析,得出以下結論:(1)通過可視化的手段可以比解析法更直觀地展示更多信息;(2)數據分析法實現簡單、原理清晰,更適合處理復雜情況的經濟訂貨批量;(3)本文的研究為采用現代信息技術和手段解決傳統問題提供了一種思路。