基於Python的ERP系統中主生產計劃(MPS)的計算

一、目的

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章