《現(xiàn)代庫存管理:模型、算法與Python實現(xiàn)》 課件 第17章-某家電企業(yè)H的制造網(wǎng)絡庫存優(yōu)化實戰(zhàn)_第1頁
《現(xiàn)代庫存管理:模型、算法與Python實現(xiàn)》 課件 第17章-某家電企業(yè)H的制造網(wǎng)絡庫存優(yōu)化實戰(zhàn)_第2頁
《現(xiàn)代庫存管理:模型、算法與Python實現(xiàn)》 課件 第17章-某家電企業(yè)H的制造網(wǎng)絡庫存優(yōu)化實戰(zhàn)_第3頁
《現(xiàn)代庫存管理:模型、算法與Python實現(xiàn)》 課件 第17章-某家電企業(yè)H的制造網(wǎng)絡庫存優(yōu)化實戰(zhàn)_第4頁
《現(xiàn)代庫存管理:模型、算法與Python實現(xiàn)》 課件 第17章-某家電企業(yè)H的制造網(wǎng)絡庫存優(yōu)化實戰(zhàn)_第5頁
已閱讀5頁,還剩15頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

現(xiàn)代庫存管理:模型、算法與Python實現(xiàn)第17章某家電企業(yè)H的制造網(wǎng)絡庫存優(yōu)化實戰(zhàn)17.1背景介紹企業(yè)H是一家大型的家電制造商,旗下產(chǎn)品覆蓋了絕大部分的家庭電器:同一種原材料一般支撐多個半成品、成品的生產(chǎn),H公司一直以來主要在原材料上放置安全庫存企業(yè)的發(fā)展趨勢和轉(zhuǎn)型需求:各大渠道商對工廠的交付時間有了更高的要求,需要將制造網(wǎng)絡中的安全庫存前置17.1背景介紹公司挑選兩款“明星”產(chǎn)品以及它們的生產(chǎn)涉及的所有半成品和原材料,利用物料清單、各物料的持貨成本、成品需求的預測均值和誤差,以及工廠對客戶的承諾服務時間等數(shù)據(jù),以這兩個產(chǎn)品的制造網(wǎng)絡為基礎,搭建出全網(wǎng)絡安全庫存優(yōu)化方案的原型,探究如下三個問題:應該選擇網(wǎng)絡的哪些節(jié)點放置安全庫存(位置),以及放置多少安全庫存(量)?與安全庫存全部前置在成品的策略相比,全局最優(yōu)的策略能否顯著降低總安全庫存成本?對客戶的承諾服務時間對總安全庫存成本的影響有多大?由于制造中存在很多通用件,在本案例中,使用有向無環(huán)圖對家電企業(yè)H的兩個成品的制造網(wǎng)絡進行建模,并使用分段線性函數(shù)近似算法,建立混合整數(shù)規(guī)劃來求解相應的承諾服務模型17.2數(shù)據(jù)導入及預處理#導入網(wǎng)絡分析包

importnetworkxasnx

#導入數(shù)據(jù)分析包

importpandasaspd

#導入第10章的幾個算法

fromchapter14_network_basicimportcal_cum_lt,cal_demand_bound

#導入copt優(yōu)化求解包

fromcoptpyimport*

importmatplotlib.pyplotasplt

importseabornassns

sns.set_theme(style='darkgrid')

importwarnings

warnings.filterwarnings('ignore')#定義數(shù)據(jù)路徑

data_dir=

'../../data/manufacture/'

#讀取兩個需求節(jié)點(成品)的需求數(shù)據(jù)

demand_df=pd.read_csv(data_dir+

'manufacture_demand_df.csv')

#讀取制造網(wǎng)絡的節(jié)點數(shù)據(jù)

node_df=pd.read_csv(data_dir+

'manufacture_node_df.csv')

#讀取制造網(wǎng)絡的邊數(shù)據(jù)

edge_df=pd.read_csv(data_dir+

'manufacture_edge_df.csv')17.2數(shù)據(jù)導入及預處理數(shù)據(jù)集概況:demand_df表:展示了兩個成品的需求信息node_idmeanstd0N00190163.1164901.3218181N00166113.9650239.74188217.2數(shù)據(jù)導入及預處理數(shù)據(jù)集概況:edge_df表:BOM的邊信息表’predecessor’:上游節(jié)點’successor’:下游節(jié)點’quantity’:配比node_df表:BOM的節(jié)點信息表’node_id’:節(jié)點的id’lt’:提前期’hc’:單位持貨成本’sla’:對客戶的承諾服務時間predecessorsuccessorquantity0N002230N0019011.0001N001693N0019011.0002N001664N0016931.2003N000519N0016930.0014N000416N0016930.001node_idlthcsla0N00160840.478034NaN1N00274740.860900NaN2N00302420.483988NaN3N00096860.311728NaN4N00052890.807896NaN17.2數(shù)據(jù)導入及預處理數(shù)據(jù)集概況:利用NetworkX,對H企業(yè)的制造BOM進行可視化展示:盡管只有兩個成品,整個制造網(wǎng)絡依然非常復雜,存在很多共享節(jié)點17.2數(shù)據(jù)導入及預處理數(shù)據(jù)集預處理:計算出每個節(jié)點的累計提前期調(diào)用計算需求上界的函數(shù)cal_demand_bound計算服務水平為0.95時的需求上界表將后續(xù)要反復使用的數(shù)據(jù)轉(zhuǎn)換成字典格式數(shù)據(jù)集預處理代碼如下:lt_dict=dict(zip(node_df['node_id'],node_df['lt']))

cum_lt_dict=cal_cum_lt(edge_df[['predecessor','successor']].values,lt_dict)

cum_lt_df=pd.DataFrame.from_dict(

cum_lt_dict,orient='index').reset_index().rename(

columns={'index':'node_id',0:'cum_lt'})

node_df=node_df.merge(cum_lt_df,on='node_id',how='left')

print(node_df.head())17.2數(shù)據(jù)導入及預處理數(shù)據(jù)集預處理代碼:all_nodes=set(node_df['node_id'])

#提前期

lt_dict=dict(zip(node_df['node_id'],node_df['lt']))

#累計提前期

cum_lt_dict=dict(zip(node_df['node_id'],node_df['cum_lt']))

#單位持貨成本

hc_dict=dict(zip(node_df['node_id'],node_df['hc']))

#對客戶承諾服務時間sla

sla_dict=dict(zip(node_df['node_id'],node_df['sla']))

#每個節(jié)點對應覆蓋時間的安全庫存量

ss_ct_dict={(node,time):ssfornode,time,ssin

demand_bound_df[['node_id','time','ss_qty']].values}17.3應用分段線性函數(shù)近似算法求解近似最優(yōu)的策略

17.3應用分段線性函數(shù)近似算法求解近似最優(yōu)的策略

17.3應用分段線性函數(shù)近似算法求解近似最優(yōu)的策略代碼如下:defcal_ar_br(demand_bound_df):

#對時間取差

demand_bound_df['t_diff']=demand_bound_df['time'].diff()

demand_bound_df.loc[demand_bound_df['time']==

0,'t_diff']=

0

#對需求上界取差

demand_bound_df['db_diff']=demand_bound_df['demand_bound'].diff()

demand_bound_df.loc[demand_bound_df['time']==

0,'db_diff']=

0

#根據(jù)ar和br的公式,計算ar與br

demand_bound_df['ar']=demand_bound_df['db_diff']/

\

demand_bound_df['t_diff']-

\

demand_bound_df['mean']

demand_bound_df['br']=demand_bound_df['demand_bound']-

\

demand_bound_df['mean']*

\

demand_bound_df['time']-

\

demand_bound_df['ar']*demand_bound_df['time']

demand_bound_df.loc[demand_bound_df['time']==

0,'ar']=

0

demand_bound_df.loc[demand_bound_df['time']==

0,'br']=

0

#轉(zhuǎn)換成字典格式,方便后續(xù)讀取

ar_dict={(node,time):arfornode,time,ar

indemand_bound_df[['node_id','time','ar']].values}

br_dict={(node,time):brfornode,time,br

indemand_bound_df[['node_id','time','br']].values}

returnar_dict,br_dict

ar_dict,br_dict=cal_ar_br(demand_bound_df)17.3應用分段線性函數(shù)近似算法求解近似最優(yōu)的策略代碼如下:jt_list=list(ar_dict.keys())

jt_dict={j:list(range(0,int(cum_lt_dict[j])+

1))forjinall_nodes}#生成COPT的環(huán)境

env=Envr()

#建立空的模型

m=env.createModel('pwl')CardinalOptimizerv4.0.2.BuilddateFeb232022

CopyrightCardinalOperations2022.AllRightsReserved#服務響應時間

S=m.addVars(all_nodes,vtype=COPT.CONTINUOUS,lb=0,nameprefix='S')

#被服務時間

SI=m.addVars(all_nodes,vtype=COPT.CONTINUOUS,lb=0,nameprefix='SI')

#覆蓋時間

CT=m.addVars(all_nodes,vtype=COPT.CONTINUOUS,lb=0,nameprefix='CT')

#用來控制只選擇一段的0-1變量

U=m.addVars(jt_list,vtype=COPT.BINARY,nameprefix='U')

#用于近似覆蓋時間的變量

Z=m.addVars(jt_list,vtype=COPT.CONTINUOUS,lb=0,nameprefix='Z')17.3應用分段線性函數(shù)近似算法求解近似最優(yōu)的策略代碼如下:m.setObjective(quicksum(

hc_dict[j]*(ar_dict[j,t]*Z[j,t]+br_dict[j,t]+U[j,t])forj,t

injt_list),COPT.MINIMIZE)m.addConstrs(

(CT[j]==quicksum(Z[j,t]fortinjt_dict[j])forjinall_nodes),

nameprefix='approx_CT')m.addConstrs(((t-

1)*U[j,t]<=Z[j,t]forj,tinjt_list),

nameprefix='time_interval_lhs')

m.addConstrs((t*U[j,t]>=Z[j,t]forj,tinjt_list),

nameprefix='time_interval_rhs')m.addConstrs((quicksum(U[j,t]fortinjt_dict[j])==

1

forjinall_nodes)

,nameprefix='choose_one')17.3應用分段線性函數(shù)近似算法求解近似最優(yōu)的策略代碼如下:m.addConstrs((CT[j]==SI[j]+lt_dict[j]-S[j]forjinall_nodes),

nameprefix='covering_time')m.addConstrs((SI[succ]-S[pred]>=

0

for(pred,succ)inedge_df[[

'predecessor','successor']].values),nameprefix='edge')m.addConstrs((S[j]<=int(sla_dict[j])forjinall_nodes

ifpd.notnull(sla_dict[j])),nameprefix='sla')#整數(shù)規(guī)劃啟發(fā)式算法的參數(shù)

m.setParam(COPT.Param.HeurLevel,3)

#求解精度

m.setParam(COPT.Param.RelGap,0.01)

m.solve()17.3應用分段線性函數(shù)近似算法求解近似最優(yōu)的策略策略成本比較:計算策略的安全庫存成本,并與將安全庫存全部放置在成品的策略進行比較#計算網(wǎng)絡最優(yōu)策略的成本

opt_ss_dict={node:ss_ct_dict.get((node,CT),0)

fornode,CTinopt_sol['CT'].items()}

opt_ss_cost=sum([hc_dict[node]*opt_ss_dict[node]

fornodeinall_nodes])

#計算將安全庫存都放置在成品的安全庫存成本

product_node_df=node_df[node_df.sla.notna()]

product_node_df['CT']=product_node_df['cum_lt']-product_node_df['sla']

product_ct_dict=dict(zip(product_node_df['node_id'],product_node_df['CT']))

product_ss_dict={node:ss_ct_dict.get((node,CT),0)

fornode,CTinproduct_ct_dict.items()}

product_ss_cost=sum([hc_dict[node]*product_ss_dict[node]

fornodeinproduct_node_df['node_id']])

print("使用安全庫存全部放置在成品的策略的安全庫存成本為%.2f"

%product_ss_cost)

print("使用網(wǎng)絡最優(yōu)策略的安全庫存

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論