一、目的
1、深入理解、掌握主生產計劃理論。
2、綜合運用主生產計劃理論和程序設計技術,設計適合表示主生產計劃參數及計劃結果的數據結構,並使用程序設計語言實現。
3、綜合運用主生產計劃理論和程序設計技術,設計主生產計劃計算的算法,並使用程序設計語言實現。
4、設計並實現主生產計劃結果顯示形式。
5、對於給定的主生產計劃參數實例,制定可行的主生產計劃。
二、內容
1、設計並實現適合存儲主生產計劃參數及計算結果的數據結構。
2、設計並實現主生產計劃計算的算法。
3、設計並實現主生產計劃結果顯示形式。
4、根據數據文件的說明完成數據文件的解析,讀取計算主生產計劃的相關參數,根據讀入的參數完成主生產計劃的計算,並顯示(如表、圖等,也可以輸出到Excel中)計算結果
三、存儲相關參數的文件及說明
period.dat:時段數據文件。文件可能包含若干行。每行對應一種物料。每行的格式如下:
物料名稱 計劃展望期時間跨度(包含過去時段,用時段0表示過去時段,時段1爲當前計劃的第一個時段) 需求時界 計劃時界
例如
X 11 3 7
表示物料X的計劃展望期爲11個時段(包含過去時段,即實際需要計算的計劃展望期爲10個時段,可結合課件或教材的MPS表格理解),時段3和時段4的交界爲需求時界,時段7和8的交界爲計劃時界
matinfo.dat:物料信息文件。文件可能包含若干行。每行對應一種物料。每行的格式如下:
物料名稱 批量大小 安全庫存 提前期
例如
X 10 5 1
表示物料X的批量大小爲10,安全庫存量爲5,提前期爲1個時段
prediction.dat:預測量數據文件。文件可能包含若干行。每行對應一種物料。每行的格式如下:
物料名稱 過去時段預測量 時段1預測量 ... 時段n預測量
例如
X 0 25 20 35 20 25 20 20 30 30 25
表示物料X在過去時段、時段1、...、時段10中,各個時段的預測量。時段的數量可由period.dat文件中該物料的第一個字段得到。
對於本例來說,period.dat中X物料的第一個字段爲11,所以一共11個時段,分別是:過去時段、時段1、時段2、...、時段10
order.dat:訂單量數據文件。文件可能包含若干行。每行對應一種物料。每行的格式如下:
物料名稱 過去時段訂單量 時段1訂單量 ... 時段n訂單量
例如
X 0 32 26 25 33 20 25 30 25 35 20
表示物料X在過去時段、時段1、...、時段10中,各個時段的訂單量。時段的數量可由period.dat文件中該物料的第一個字段得到。
對於本例來說,period.dat中X物料的第一個字段爲11,所以一共11個時段,分別是:過去時段、時段1、時段2、...、時段10
ScheduledReceipts.dat:計劃接收量數據文件。文件可能包含若干行。每行對應一種物料。每行的格式如下:
物料名稱 過去時段計劃接收量 時段1計劃接收量 ... 時段n計劃接收量
例如
X 0 20 0 0 0 0 0 0 0 0 0
表示物料X在過去時段、時段1、...、時段10中,各個時段的計劃接收量。時段的數量可由period.dat文件中該物料的第一個字段得到。
對於本例來說,period.dat中X物料的第一個字段爲11,所以一共11個時段,分別是:過去時段、時段1、時段2、...、時段10
PrevInventory.dat:過去時段可用庫存。文件可能包含若干行。每行對應一種物料。每行的格式如下:
物料名稱 過去時段可用庫存
例如
X 10
表示物料X在過去時段的可用庫存爲10
四、相關理論知識
1. 毛需求量的計算:當在需求時段,毛需求量 = 訂單量,當在計劃階段, 毛需求量 = max(訂單量,預測量),當在預測階段,毛需求 = 預測量。
2. 淨需求的計算:如果PAB初值 >= 安全庫存,淨需求 = 0 ;如果PAB初值 < 安全庫存量,淨需求 = 安全庫存量 – PAB初值。
3. PAB的計算:PAB(預計可用庫存) = 前一時段預計可用庫存 + 本時段計劃接收量 – 本時段毛需求量。
4. 計劃產出量的計算:當N是一個大於或等於1的整數時、當N * 生產批量 >= 淨需求量 > (N-1) * 生產批量時、計劃產出量 = N * 生產批量。
5. 計劃投入量的計算:將計劃產出量的所有數據提前一個時段,得到相應的計劃投入量。
6. 可供銷售量(ATP)的計算:ATP = 本時段計劃產出量 + 本時段計劃接收量 – 下一次出現計劃產出量之前各時段的訂單量之和。
7. 讀取數據文件的方法:
def ReadMatInfo(filepath): with open(filepath,"r") as f: contents = f.read() tmp=contents.split(' ',-1) return tmp
8. 寫入到Excel使用的模塊:import xlsxwriter
關鍵代碼:
workbook = xlsxwriter.Workbook("/xxxx.xlsx") worksheet = workbook.add_worksheet(name="xxx") worksheet.write_row("xx",xxxx) worksheet.write_column("xx",xxxx) workbook.close()
五、源代碼
#批量大小 #安全庫存 #提前期 #數據文件(period.dat) #各時段訂單量(order.dat) #各時段預測量(prediction.dat) #各時段計劃接收量(ScheduleReceipts.adt) #過去時段的預計可用庫存(PrevInventory.dat) #1.計算所有時段毛需求量 #2.按照從時段1到時段n的順序計算n個時段毛需求量 #3.以此計算該階段淨需求、計劃產出量及預計可用庫存 #4.依次計算所有時段計劃投入量 #5.依次計算所有時段可供銷售量 #by Jiefeng_Lin import xlsxwriter #讀取文件函數 def ReadMatInfo(filepath): with open(filepath,"r") as f: contents = f.read() tmp=contents.split(' ',-1) return tmp # 從文件現有初始預計可用庫存量 now_stock = [] now_stock.insert(0,int(ReadMatInfo('./data_files/PrevInventory.dat')[1])) # 從文件讀取安全庫存量 safe_stock = int(ReadMatInfo('./data_files/matinfo.dat')[2]) # 從文件批量大小 product_batch = int(ReadMatInfo('./data_files/matinfo.dat')[1]) # 從文件讀取提前期 pre_date = int(ReadMatInfo('./data_files/matinfo.dat')[3]) #從文件讀取總時段 total_period = int(ReadMatInfo('./data_files/period.dat')[1]) #從文件讀取需求時界 require_period = int(ReadMatInfo('./data_files/period.dat')[2]) #從文件讀取計劃時界 plan_period = int(ReadMatInfo('./data_files/period.dat')[3]) # 從文件讀取預測量 pre= [] for i in range(total_period): pre.insert(i,int(ReadMatInfo('./data_files/prediction.dat')[i+1])) # 從文件讀取訂單量 order = [] for i in range(total_period): order.insert(i,int(ReadMatInfo('./data_files/order.dat')[i+1])) #從文件讀取計劃接收量 schedule_receipt = [] for i in range(total_period): schedule_receipt.insert(i,int(ReadMatInfo('./data_files/ScheduledReceipts.dat')[i+1])) #定義淨需求量數組 neet_reqiire = [] neet_reqiire.insert(0,0) #定義毛需求量數組 gross_require = [] #定義可供銷售量數組 ATP = [] ATP.insert(0,0) #定義計劃產出量數組 plan_production = [] plan_production.insert(0,0) #定義計劃投入量數組 plan_release = [] plan_release.insert(total_period-1,0) #計算毛需求量 for i in range(total_period): #當在需求時段,毛需求=訂單量 if i <= require_period: gross_require.insert(i,order[i]) #當在計劃階段,毛需求=max(訂單量,預測量) if i > require_period and i <= plan_period: gross_require.insert(i,max(order[i],pre[i])) #在預測階段,毛需求=預測量 if i > plan_period and i < total_period: gross_require.insert(i,pre[i]) #定義批量大小增量的函數 def calculate_increse_of_product_batch(n): #n是大於或等於1的整數 if n == 0: return 0 else: for i in range(1,11): #當 i*生產批量 >= 淨需求量 > (i-1)*生產批量的時候,滿足計劃產出量計算要求 if (i-1)*product_batch < n and i*product_batch >= n: return i * product_batch #計劃產出量 = i * 生產批量 #計算淨需求量 for i in range(1,total_period): #淨需求 = 本時段毛需求量 + 安全庫存 - 前時段可用庫存 - 計劃接收量 neet_reqiire.insert(i,gross_require[i] + safe_stock - now_stock[i-1] - schedule_receipt[i]) #計劃產出直接應用上面的函數 plan_production.insert(i, calculate_increse_of_product_batch(neet_reqiire[i])) #預計可用庫存 = 前時段預計可用庫存 + 預計接收量 + 計劃產出量 - 毛需求 now_stock.insert(i, now_stock[i - 1] + schedule_receipt[i] + plan_production[i] - gross_require[i]) #計算計劃投入量 for i in range(total_period-1): #本時段計劃投入量 = 下時段計劃產出量 plan_release.insert(i,plan_production[i+1]) #計算可供銷售量ATP for i in range(total_period-1): #ATP = 本時段計劃產出量 + 本時段計劃接收量 + 上時段預計可用庫存 - 本時段訂單量 if i==1: ATP.insert(i,plan_production[i]+schedule_receipt[i]+now_stock[i-1]-order[i]) #ATP = 本時段計劃產出量 + 本時段計劃接收量 - 本時段訂單量 else: ATP.insert(i,plan_production[i]+schedule_receipt[i]-order[i]) #將數據寫入到Excel並創建表格 #創建excel文檔 print("正在進行excel錄入中") workbook = xlsxwriter.Workbook("/Users/jayphone/Desktop/calculation_of_MPS.xlsx") #創建一個sheet worksheet = workbook.add_worksheet(name="calculation_of_MPS") #確定橫軸縱軸屬性 calculation_item = ['預測量','訂單量','毛需求量','計劃接收量','預計可用庫存','淨需求量','計劃產出量','計劃投入量','可供銷售量'] headline=['時區/計算類別','過去時段','1','2','3','4','5','6','7','8','9','10'] #寫入到表格中 worksheet.write_row("A1",headline) worksheet.write_column("A2",calculation_item) worksheet.write_row("B2",pre) worksheet.write_row("B3",order) worksheet.write_row("B4",gross_require) worksheet.write_row("B5",schedule_receipt) worksheet.write_row("B6",now_stock) worksheet.write_row("B7",neet_reqiire) worksheet.write_row("B8",plan_production) worksheet.write_row("B9",plan_release) worksheet.write_row("B10",ATP) workbook.close() print("excel錄入成功") #在控制檯輸出數據: print("預測量是:") print(pre) print("訂單量是:") print(order) print("毛需求是:") print(gross_require) print("計劃接收量是:") print(schedule_receipt) print("預計可用庫存是:") print(now_stock) print("淨需求量是:") print(neet_reqiire) print("計劃產出是:") print(plan_production) print("計劃投入是:") print(plan_release) print("可供銷售是:") print(ATP)
六、結果
1.在Pycharm控制檯輸出結果:
2.寫入到Excel文件中:
七、所使用的數據文件
鏈接:https://pan.baidu.com/s/11AiEbSR7eYRVbX0RE0MCtg 密碼:j0wn