基于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控制台输出结果:

基于Python的ERP系统中主生产计划(MPS)的计算_第1张图片

2.写入到Excel文件中:

基于Python的ERP系统中主生产计划(MPS)的计算_第2张图片

七、所使用的数据文件

链接:https://pan.baidu.com/s/11AiEbSR7eYRVbX0RE0MCtg  密码:j0wn

你可能感兴趣的:(ERP)