關(guān)成斌
(廣東東軟學院 信息管理與工程學院,廣東 佛山 528225)
在組織生產(chǎn)時需要采購原料,除了原料的價格成本外,一般還涉及兩項支出:一是單次訂貨成本,是指因訂貨而支付的費用,常常是按照批次進行收費的;二是庫存成本,是指原料到達工廠后,進行原料存儲所需支付的費用,在一般的研究中,認為庫存成本與數(shù)量呈線性關(guān)系,即采用單位庫存成本表示[1-2]。
實際上,單次訂貨成本與單位庫存成本呈現(xiàn)出相反的走勢,即單次訂貨批量多,則均攤到每件原料上的單次訂貨成本就低,但同時會造成庫存數(shù)量和天數(shù)增多,因此單位庫存成本自然就提高了。如何平衡這個問題,雷蒙德·費爾菲爾德等學者們提出了經(jīng)濟訂貨批量的概念。所謂經(jīng)濟訂貨批量(Economic Order Quantity,EOQ),是指通過平衡單次訂貨成本和庫存成本核算,以實現(xiàn)總成本最低的最佳訂貨量。經(jīng)濟訂貨批量是固定訂貨批量模型的一種,可以用來確定企業(yè)一次訂貨的數(shù)量。當企業(yè)按照經(jīng)濟訂貨批量來訂貨時,可實現(xiàn)單位原料的訂貨成本和庫存成本之和最小化[2-5]。
但是在實際的操作中存在一種超限的情況:工廠倉庫較小,但是可以在附近租借別人的倉庫進行臨時存放,但是相對自有倉庫的庫存成本明顯增加,稱之為存在超限庫存,此時經(jīng)濟訂貨批量的確定就變得比較復(fù)雜。
目前針對訂貨批量的研究方法較多,常見的是解析法,通過數(shù)學推導(dǎo)的方式得到經(jīng)濟訂貨批量的計算公式,然后帶入相應(yīng)參數(shù)進行計算。但是對于超限經(jīng)濟批量的情況,雖然可以得到解析式,但是相對于典型的經(jīng)濟訂貨批量公式更加復(fù)雜,本文借助Python編程語言提出了一種基于數(shù)據(jù)分析法的超限經(jīng)濟訂貨批量確定方法。
本文的研究場景:工廠倉庫較小,但是可以在附近租借別人的倉庫進行臨時存放,但是相對自有倉庫,其庫存成本明顯增加,研究這種情況下的經(jīng)濟訂貨批量。
研究思路:給出不同情況下的平均單位訂貨成本與庫存成本之和(以下簡稱單位總成本)的計算公式,基于Python及numpy、matplotlib庫計算不同訂貨批量情況下的平均單位總成本,采用數(shù)據(jù)分析法找出單位總成本最低情況下的訂貨批量,即為經(jīng)濟訂貨批量,如圖1所示。
圖1 超限情況下經(jīng)濟訂貨批量研究思路
不超限情況時,單次訂貨批量Q低于額定庫存容量E,這種情況比較簡單,只需要考慮單位原料訂貨成本和單位原料庫存成本即可。
參數(shù)假設(shè):Q為單次訂貨批量(套);S為單次訂貨成本;C為單位庫存成本(一套原料一天的庫存成本);E為額定庫存容量(套);D為一天消耗量(套)。
單次訂貨批量為Q情況下的單位原料訂貨成本為:
原料的消耗天數(shù)為Q D;在原料的消耗周期內(nèi),每天的平均庫存量為Q2;因此在原料消耗周期內(nèi)的總庫存為:Q2()2D(天·套);總的庫存成本為:Q2C/(2D),平均一套原料的庫存成本為:
因此,在單次訂購批量為Q套原料時,單位總成本為:
參數(shù)假設(shè)同上,推導(dǎo)思路是,首先將所有原料按照正常庫存成本計算,然后再將超限的部分單獨計算,將兩部分相加即可,其中第一部分的計算同1.2節(jié)所述。
第二部分的計算方法如下:
超限的數(shù)量為:Q-E;超限部分的消耗天數(shù)為:在超限部分的消耗周期內(nèi),每天的平均超限數(shù)量為:;因此在超限部分消耗周期內(nèi)的總超限量為:則平均單位原料額外支出的超限成本為:
有兩點需要注意:(1)超限單價取Co-C,主要是考慮這一部分已經(jīng)按照正常庫存計算了,因此在計算超限成本時要去除正常庫存情況下的成本;(2)分母上的Q,是用于計算這部分成本均攤到此次訂貨批量的單位成本,因此應(yīng)取Q而非Q-E。
因此,在訂貨批量為Q時,單位總成本為:
合并以上兩種情況,可以得到考慮超限情況下訂貨批量為Q時,單位總成本計算公式為:
按照傳統(tǒng)的解析法,需要利用式(6)對Q求導(dǎo),并令其為0,即可得到TC為最小值時Q的計算公式,也就是經(jīng)濟訂貨批量[2,6]。但是,對于式(6)來說,采用解析法存在兩個方面的問題:(1)由于Q<E、Q≥E兩種情況分別對應(yīng)兩個計算公式,因此需要進行兩次計算,兩次計算的結(jié)果還需要帶入式(6)進行驗證,判斷到底應(yīng)該取哪個結(jié)果,因此處理起來略顯麻煩[4,6];(2)對于Q≥E的情況進行求導(dǎo)計算相對比較麻煩,而且推導(dǎo)出來的結(jié)果也較復(fù)雜,應(yīng)用不便[7]。
為了解決上述問題,本文采用Python程序設(shè)計語言及其numpy、matplotlib等模塊編寫程序,利用數(shù)據(jù)分析法進行超限經(jīng)濟訂貨批量的確定和處理[8]。
基本的思路是從式(6)入手,通過編程計算不同Q值情況下的TC(Q)值,并繪制出曲線,找出曲線上最小的點,則該點對應(yīng)的Q值為經(jīng)濟訂貨批量,曲線的最小值則為單位原料最小總成本。為更簡單便捷的實現(xiàn),程序引用numpy庫,該庫是Python的一種開源的數(shù)值計算擴展,可用來存儲和處理大型矩陣,支持大量的維度數(shù)組與矩陣運算,也針對數(shù)組運算提供大量的數(shù)學函數(shù)庫。為更直觀地展示訂貨批量與各成本的關(guān)系,引入matplotlib庫,它是一個Python的2D繪圖庫,可以便捷地生成直方圖、功率譜、條形圖、錯誤圖、散點圖等常用的可視化圖形[9-10]。
程序流程圖如圖2所示。
圖2 超限經(jīng)濟訂貨批量數(shù)據(jù)分析法程序流程圖
程序代碼如下:
#-*-coding:utf-8-*-
"""
Created on Sat Jun 19 10:10:34 2021@author:gcb
"""
import numpy as np
from matplotlib import pyplot as plt
###=====參數(shù)設(shè)定=======
[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='經(jīng)濟訂貨批量')
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')#將經(jīng)濟訂貨批量及其對應(yīng)成本顯示在圖形中plt.show()
###=====================
從流程圖和代碼可見程序主要分成三部分,第一部分為參數(shù)設(shè)置部分,主要用于輸入關(guān)鍵參數(shù),包括固定訂貨成本、一天消耗量、額定庫存、單位庫存成本、超限單位庫存成本,以及計算參數(shù)最小計算庫存、最大計算庫存、計算庫存間隔;第二部分為成本計算部分,主要是利用輸入的參數(shù)以及前文所述的式(6)計算單位平均訂貨成本、單位平均庫存成本、單位平均超限庫存成本以及單位平均總成本;第三部分為可視化部分,采用圖形的方式直觀顯示各成本曲線以及最小訂貨批量與各成本之間的關(guān)系。
為了驗證本文提出的方法,設(shè)置多種案例進行計算分析。
參數(shù)設(shè)定:固定訂貨成本40 000,每日消耗量400,單位庫存成本1.5,超限單位庫存成本7,額定庫存3 000,最小計算庫存1 000,最大計算庫存10 000,計算庫存間隔100。
如圖3所示,運行程序,在Console欄按照提示輸入相關(guān)參數(shù)后,程序會執(zhí)行運算并繪制圖形,在Console區(qū)域顯示經(jīng)濟訂貨批量和最小單位成本。
圖3 程序運行案例分析
程序可視化圖形如圖4所示,在同一張圖上展示了單位平均訂貨成本、單位平均正常庫存成本、單位平均超限庫存成本、單位平均總成本隨訂貨量變化的曲線,并展示了單位平均總成本最低對應(yīng)的訂貨批量,即經(jīng)濟訂貨批量,而且展示了經(jīng)濟訂貨批量對應(yīng)的單位平均總成本。由圖4可知,單位平均訂貨成本隨訂貨量的增加而降低,單位平均庫存成本隨訂貨量的增加而增加,單位平均超庫存成本為一個多階增函數(shù),總成本呈現(xiàn)為凹函數(shù),因此一定存在一個極小值,該極小值即為經(jīng)濟訂貨批量對應(yīng)的最小單位平均總成本。
由圖4可知,在此案例條件下,經(jīng)濟訂貨批量為3 400套,對應(yīng)的單位總成本為18.46元/套,經(jīng)濟訂貨批量是高于額定庫存的,因此可以通過租用最多400套原料的倉庫來降低單位平均總成本。
圖4 案例一可視化圖形
固定訂貨成本設(shè)定為10 000,其余參數(shù)同案例一。將上述參數(shù)輸入程序,輸出結(jié)果如圖5所示。在固定訂貨成本從40 000元降低為10 000元,其他條件不變的情況下,計算出來的經(jīng)濟訂貨批量為2 300套,此時并沒有超出額定庫存量,也就是說,并不需要租用其他倉庫。
圖5 案例二可視化圖形
以上兩個案例的經(jīng)濟訂貨批量都是整百的,實際上是由我們設(shè)置的計算庫存間隔決定的,由于兩個案例設(shè)置的計算間隔均為100,因此計算出來的經(jīng)濟訂貨批量也必然是整百的數(shù),為了提高準確度,可以采用二次分析法。即第一次采用低分辨率找到經(jīng)濟訂貨批量的大概位置,第二次計算時縮小計算范圍,提高分辨率。
如針對案例一進行第二次運算時,可以將最小計算庫存設(shè)置為3 300,最大計算庫存設(shè)置為3 500,計算庫存間隔設(shè)為1,輸出的可視化圖形如圖6所示,此時的經(jīng)濟訂貨批量為3 412,計算結(jié)果更精確。
圖6 案例一二次計算輸出圖形
本文對超限經(jīng)濟訂貨批量的確定方法進行了研究,根據(jù)一種實際應(yīng)用場景,提出并實現(xiàn)了基于Python及其numpy、matplotlib等模塊的超限經(jīng)濟訂貨批量數(shù)據(jù)分析法,經(jīng)過具體案例分析,得出以下結(jié)論:(1)通過可視化的手段可以比解析法更直觀地展示更多信息;(2)數(shù)據(jù)分析法實現(xiàn)簡單、原理清晰,更適合處理復(fù)雜情況的經(jīng)濟訂貨批量;(3)本文的研究為采用現(xiàn)代信息技術(shù)和手段解決傳統(tǒng)問題提供了一種思路。