基于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_Linimport 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 0else: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
基于Python的ERP系统中主生产计划(MPS)的计算相关推荐
- 基于Python的ERP系统中能力需求计划(CRP)的计算
一.目的 1.深入理解.掌握能力需求计划理论, ERP中MRP.工作中心.工艺路线等相关模块的关系,以及ERP系统信息集成的含义. 2.综合运用能力需求计划理论和程序设计技术,设计适合表示能力需求计划 ...
- ERP系统模块完全解析──主生产计划MPS
1.主生产计划MPS 主生产计划的理论非常复杂,需考虑关键工作中心关键工序的能力是否足够,如果完全按理论进行主生产计划计算,企业需维护很多的基础资料,如果基础资料不准确,则计划形成虚设.因此, ...
- SAP-PP 主生产计划MPS
MPS定义:在对全部产品运行物料需求计划之前,对关键件单独运行生产计划,以确保关键件的产出期. 基本原理:根据企业的能力确定要做的事情,通过均衡地安排生产,实现生产目标,使企业在客户服务水平,库存周转 ...
- 第五章 主生产计划MPS 第1~3节 计划方案、MPS计划参数
第一节 计划方案 本案例计划方式包括MPS.MRP.ROP(详见图3- 1). 本案例采用的计划模式:先做主生产计划MPS运算,再在MPS运算结果的基础上做物料需求MRP. ROP计划独立在库存模块下 ...
- ERP系统有效提高生产计划合理性
威海市东海船舶修造有限公司是一个独立经营.独立核算的股份制企业,始建于1974 年,位于威海市经济开发区崮山镇皂埠口,固定资产 3000 万人民币,现有职工人数200多人,其中中高级工程师8人. 船厂 ...
- ERP系统个性化定制生产计划,简化排产流程
数字时代拼的就是"快",可作为生产型企业,你在生产环节是否经常遇到这样的难题:网站.电商.微信.门店订单接二连三,汇总起来手忙脚乱?加单.减单.插单时刻变化,生产计划和生产节奏频频 ...
- 牛鞭效应及其在ERP系统中的应用
"牛鞭效应"(Bullwhip Effect)指的是供应链中需求信号的扩大逐渐增大的现象.在供应链中,小幅的需求波动会在上游逐渐扩大,导致供应链中的库存和生产计划波动更加剧烈.这种 ...
- 通常ERP之:物料需求计划MRP与主生产计划
物料需求计划MRP (Material Requirements Planning)是ERP的前身,要想真正了解ERP就必须对MRP有一个全面深刻的认识.本文论述了MRP的基本概念.原理和相关问题,希 ...
- 物料需求计划MRP(一)主生产计划
物料需求计划MRP (Material Requirements Planning)是ERP的前身,要想真正了解ERP就必须对MRP有一个全面深刻的认识.本文论述了MRP的基本概念.原理和相关问题,希 ...
最新文章
- 《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一导读
- Mysql(Mariadb)数据库主从复制
- 镜像镜像–使用反射在运行时查看JVM内部
- CentOS 7 上安装vim 解決 centos -bash: vim: command not found
- 为吸引三星建170亿美元芯片厂,德克萨斯州将提供大额财产税减免
- JVM 内存管理、自带性能监测调优工具 (jstack、jstat)及 JVM GC 调优
- 第一个被赋予公明身份的机器人_机器人索菲亚扬言要消灭人类!曾经狂妄无比,现在过得如何...
- python熊猫烧香_熊猫烧香完整源代码
- 编写一个程序,将用户输入的由数字字符和非数字字符组成的字符串中的数字提取出来(例如:输入asd123,34fgh_566kkk789,则产生的数字分别是123、34、789)。
- java中 uri的格式_URI与URL详解
- 用观察者模式设计一个气象台
- 39岁阿里P9失业,资产1.5亿,北京4套房!职场人的离职悲喜各不相同
- 关于 css的一些 基本应用 可供回忆
- 天津科技大学计算机科学与信息工程学院,天津科技大学计算机科学与信息工程学院简介...
- 关于tensor的shape理解
- HTML5期末大作业:旅游网页设计与实现——四川成都-(9页 带购物车)
- 科研人快速入门LaTex到日常使用,下载安装配置,语法使用说明等
- 跟我学Kafka:Kafka消费组运维详解
- GPIO之推挽输出和开漏输出
- 天池训练营——基于人脸的常见表情识别(3)——模型搭建、训练与测试