在线咨询
QQ咨询
服务热线
服务热线:13125520620
TOP

C++编程实现对工厂产品生产流程的模拟

发布时间:2018-6-9 浏览:3305

花费二个多月的时间编写了可以实时模拟工厂产品生产流程的程序,工厂产品生产流程的模拟,就是计算在工艺文件所规定的工序下,不同种类的多件产品(同一类别的产品可以有多件)在不同类别的多台设备(同一类别的设备可以有多台)上全部生产完毕所需的总时间。每一件产品可以在生产流程中先后多次在同一类设备上生产而且生产时间可以不同,某一给定时刻多件产品有可能需要在同一台设备上生产,造成设备占用冲突,这时必须按一定的算法对造成冲突的产品在设备等待队列上按优先级排队。产品在设备上加工完毕准备进入下一台设备生产时有同类型的多台设备可供选择,此时必须设计算法选择加工该产品的设备使生产时间尽可能短。每一件产品在生产前可能会有生产准备时间,每一件产品在某一台设备上生产完毕后可能会存在自然时效时间。在生产过程中的任意时刻可以插入待生产的多件新产品,每一台设备都有与之关联的模具,每件模具可以生产特定种类的产品,模具可以由多个零件组成,一个零件又可以作为多件模具的组成部件。设备每过一段时间就要调整或维修,维修分为小修和大修,小修大修时间以及小修大修时间的时间间隔有明确的规定,不会改变。我们需要在以上诸多条件的限制和作用下通过编写程序让计算机计算产品全部生产完成且尽可能接近最短的生产时间,以为工厂处理客户订单提供参考和依据。要注意的是,本文要解决的问题和车间作业计划调度问题有本质区别,后者为NPC问题,需要设计算法自行安排产品在各设备上的加工顺序,使生产时间最短。而在前者中,产品在设备上的加工顺序由优先级关系给定,任务是模拟生产流程,在生产过程中有订单插入的情况下估算生产时间,以判断生产能力能否满足客户需求。笔者不自量力也专门思考过车间调度问题,但发现难度实在太大(光是解空间候选解的数量就让人望而却步),绞尽脑汁仍束手无策,在网上查找过相关资料,了解到最好的精确算法也是指数级的,而且解决问题的方法是在解空间中穷举,于是笔者就放弃了这一难题,转而研究当前问题,当然如果日后P=NP被否证笔者也许会好受一点,至少自信心不会受到打击。
 
本问题具体的限制条件的详细说明如下:
 
与订单处理有关的说明及约束条件
 
 
 
1、某工厂有若干种型号的设备,每种型号设备数量不等有若干台;每台设备有 “在线”(可用)和“下线”(不可用)两种状态。
 
2、工厂可以生产多种产品,每种产品对应一个产品生产工艺(称,由若干零件加工工艺、调试工艺和组装工艺文件组成)。工厂可能同时生产几种产品。每种产品都是由若干零、部件(部件由几个零件组合而成)组装而成,不同产品可以有相同的零部件。
 
产品生产工艺:又称为产品工艺文件,由若干零部件加工工艺文件组成,是从原材料到产品的生产过程,包含确定需要哪些设备、使用的顺序、占用的时间等内容(通常占用时间包括设备准备时间、加工时间)。
 
3、每种产品的每个零件也都有自己的零件生产工艺(称为零件加工工艺文件),各零件生产工艺不同,需要使用到的设备可能不同也可能相同,使用的先后顺序也不同,占用的时间也可能不同。由于零件的加工是且只能是按工艺文件中的工序顺序进行的,其加工周期等于加工工艺文件规定的各个工序加工时间的和。当某一零件加工过程中一道工序完毕进入下一道工序时,这道工序使用的设备如果被别的零件占用,则该零件只能等待而不能跳过这道工序。
 
零件加工工艺文件,规定从原材料到零件成品的加工步骤即工序,确定各工序使用哪些设备,需要的时间等参数。
 
4、某些工艺文件涉及到模具。通常模具与加工工艺的某一工序有关。模具也有两种状态“在线”(使用中)、“下线”(闲置)。模具可以是单件,也可以是由零件组合而成。这些零件的不同组合形成不同的模具。任何时刻,模具都只与一个零件关联,此时,可以与设备关联,也可能不与设备关联,具体要以工艺文件的规定来定。
 
5、如果一个产品的各零部件同时生产,则产品生产周期等于加工时间最长的零部件生产时间加上装配时间、调试时间、包装时间和运输时间;否则,产品生产周期等于第一个零件加工开始到最后一个零部件加工完成所花费的时间,加上装配时间、调试时间、包装时间和运输时间
 
6、任何时刻,一台设备只能加工一个零件。
 
7、工厂有多个用户,通常以用户购买工厂产品多少来确定用户的优先级,意味着多个用户同时提交订单时,优先级高的用户的订单会被优先处理,而且,这些用户的临时紧急需求,也需要尽量被满足。因此处理订单时,优先安排优先级高的用户,待其订单满足后再处理优先级较低的用户的订单。
 
 
 
八个初始化文件负责向程序提供输入数据,他们分别为:
 
StateQuery  RepairTimeOfDevice ProductCategoryWorkingProcedure PriorityProducePerpareTime Mould Insert  Device Component
 
StateQuery 规定每台设备在开始时刻最近一次进行的是大修还是小修
 
RepairTimeOfDevice  规定各设备类别下的设备的大修小修时间,以及大修小修之间的时间间隔
 
ProductCategoryWorkingProcedure 规定各产品类别在工艺文件描述的工序中需要经历的各设备的设备类别及对应的自然时效时间
 
PriorityProducePerpareTime  规定不同类别的设备上各类产品的生产优先级以及不同类别的设备在不同类别的产品对应的生产序列中的下标及相应的生产准备时间和生产时间
 
Mould 规定各模具的属性和状态
 
Insert 规定要插入产品的时间点及时间点下要插入的产品以及产品要插入的设备的类别
 
Device 规定与设备关联的模具的状态
 
Component 规定组成模具的零件的属性和状态
 
上述8文件格式规范:
 
ProductCategoryWorkingProcedure 各产品类别及对应的工艺流程的集合 注意各文件中的数据必须彼此相符,不能出现矛盾和冲突,否则程序的行为是未定义的!
设备编号即为"设备类别编号+设备序号" 产品编号即为"产品类别编号+产品序号" 模具编号即为"模具"能够生产的产品类别编号+模具序号
#b1
   产品类别
   #b2
      设备类别 该产品在该设备上生产完成后的自然时效时间 ---
   #e2
#e1
 
---
 
 
 
PriorityProducePerpareTime 设备类别和其能够生产的产品类别及对应的生产时间优先级构成的集合,外层map关键字为产品类别编号,映射值为映射表,即为该类别的设备在该产品类别的工艺流程表中对应各下标及相应的生产准备时间和生产时间
#b1
   设备类别
           #b2
              产品类别
                      #b3
                         优先级
                         下标 生产准备时间 生产时间
                         ---
                      #e3
           #e2
           ---
#e1
---
 
 
 
RepairTimeOfDevice 设备类别和维修时间之间的映射关系
#b1
   设备类别编号
   #b2
      小修至大修时间间隔 大修至小修的时间间隔 小修时长 大修时长
   #e2
#e1
---
 
 
 
StateQuery 设备编号(关键字)和设备状态之间的映射关系
#b1
   设备编号
   #b2
      最近一次进行的是大修还是小修的标志,0小修,1大修
   #e2
#e1
---
 
 
 
Device 设备属性
#b1
   设备编号
   #b2
      产品类别 模具编号 模具状态(T上线F下线)
      ---
   #e2
#e1
---
 
 
 
Component 零件编号和其属性的映射关系
#b1
   零件编号
   #b2
      该零件占用的模具能够生产的产品类别编号 该零件占用的模具的模具序号
   #e2
   #b3
      由该零件组成的模具的编号的集合
   #e3
#e1
---
 
 
 
Mould 模具编号和其属性的映射关系
#b1
   模具编号
   #b2
      模具所属设备编号 模具状态(T上线F下线)
   #e2
   #b3
      组成模具的零件编号 零件是否被该模具占用的标志(T是F否)
      ---
   #e3
#e1
---
 
 
 
Insert 设备类别和各时间点下要插入的产品的对应关系
#b 插入产品的时间点,第一个必须为0 --- #e
#b1
   带插入设备类别
   #b对应时间点下要插入的产品编号的集合#e
   ---
#e1
---
 
上述8文件输入样例:
 
ProductCategoryWorkingProcedure.txt
 
#b1
   1
   #b2
      1 4 2 4 1 4
   #e2
#e1
 
#b1
   2
   #b2
      2 4 1 4 2 4
   #e2
#e1
 
PriorityProducePerpareTime.txt
 
#b1
   1
    #b2
       1
        #b3
           3
           0 4 32
           2 4 36
        #e3
    #e2
    #b2
       2
        #b3
           4
           1 4 40
        #e3
    #e2
#e1
#b1
   2
    #b2
       2
        #b3
           4
           0 4 32
           2 4 36
        #e3
    #e2
    #b2
       1
        #b3
           3
           1 4 40
        #e3
    #e2
#e1
 
RepairTimeOfDevice.txt
 
#b1
   1
   #b2
      48 52 56 60
   #e2
#e1
#b1
   2
   #b2
      44 48 52 56
   #e2
#e1
 
StateQuery.txt
 
#b1
   1+1
   #b2
      0
   #e2
#e1
#b1
   1+2
   #b2
      0
   #e2
#e1
#b1
   2+1
   #b2
      1
   #e2
#e1
#b1
   2+2
   #b2
      1
   #e2
#e1
 
Device.txt
 
#b1
   1+1
   #b2
      1 1+1 T
      2 2+2 F
   #e2
#e1
#b1
   1+2
   #b2
      1 1+3 F
      2 2+4 T
   #e2
#e1
#b1
   2+1
   #b2
      2 2+1 F
      1 1+2 F
   #e2
#e1
#b1
   2+2
   #b2
      2 2+3 T
      1 1+4 F
   #e2
#e1
 
Component.txt
 
#b1
   1
   #b2
      2 3
   #e2
   #b3
      2+3 
   #e3
#e1
#b1
   2
   #b2
      2 3
   #e2
   #b3
      2+3 
   #e3
#e1
#b1
   3
   #b2
      1 1
   #e2
   #b3
      1+1 1+2
   #e3
#e1
#b1
   4
   #b2
      1 1
   #e2
   #b3
      1+1 2+1
   #e3
#e1
#b1
   5
   #b2
      2 1
   #e2
   #b3
      2+1 2+2
   #e3
#e1
#b1
   6
   #b2
      1 2
   #e2
   #b3
      1+2
   #e3
#e1
#b1
   7
   #b2
      2 2
   #e2
   #b3
      1+3 2+2
   #e3
#e1
#b1
   8
   #b2
      1 3
   #e2
   #b3
      1+3 1+4
   #e3
#e1
#b1
   9
   #b2
      1 4
   #e2
   #b3
      1+4 
   #e3
#e1
#b1
   10
   #b2
      2 4
   #e2
   #b3
      2+4
   #e3
#e1
#b1
   11
   #b2
      2 4
   #e2
   #b3
      2+4 
   #e3
#e1               
Mould.txt  
 
#b1
   1+1
   #b2
      1+1 T
   #e2
   #b3
      3 T
      4 T
   #e3
#e1
#b1
   1+2
   #b2
      2+1 F
   #e2
   #b3
      3 F
      6 T
   #e3
#e1
#b1
   1+3
   #b2
      1+2 F
   #e2
   #b3
      7 F
      8 T
   #e3
#e1
#b1
   1+4
   #b2
      2+2 F
   #e2
   #b3
      8 F
      9 T
   #e3
#e1
#b1
   2+1
   #b2
      2+1 F
   #e2
   #b3
      4 F
      5 T
   #e3
#e1
#b1
   2+2
   #b2
      1+1 F
   #e2
   #b3
      5 F
      7 T
   #e3
#e1
#b1
   2+3
   #b2
      2+2 T
   #e2
   #b3
      1 T
      2 T
   #e3
#e1
#b1
   2+4
   #b2
      1+2 T
   #e2
   #b3
      10 T
      11 T
   #e3
#e1
 
Insert.txt
 
#b 0 16 17 18 19 20 21 #e
#b1
   1
   #b 1+1 1+2 1+4 1+10 #e
   #b 1+3 1+5 1+6 1+11 #e
   #b 1+7 1+8 1+9 1+12 #e
   #b 1+13 1+14 1+15 1+16 #e
   #b 1+17 1+18 1+21 1+22 #e
   #b 1+19 1+20 1+23 1+24 #e
   #b 1+28 1+25 1+26 1+27 #e
#e1
#b1
   2
   #b 2+1 2+2 2+5 2+10 #e
   #b 2+4 2+6 2+7 2+11 #e
   #b 2+3 2+8 2+9 2+12 #e
   #b 2+13 2+14 2+15 2+16 #e
   #b 2+17 2+18 2+19 2+20 #e
   #b 2+21 2+22 2+23 2+24 #e
   #b 2+25 2+26 2+27 2+28 #e
#e1
 
本程序编译环境viusal studio 2017 将八个初始化文件放置在源文件文件所在目录下编译运行即可得到结果
 
本生产周期计算程序用C++语言编写,代码有2800余行,是博主个人心血的结晶,博主原本不想公开源码,但代码的使用价值不高,意义不大,所以左思右想后还是决定公开源码。请大家尊重博主的劳动成果,在转载时务必注明原文地址和作者ID。由于代码量较为庞大,所以可能隐藏着尚未发现的未知的BUG和漏洞,如果在对程序进行暴力测试过程中发现程序运行结果明显有误或程序运行崩溃以及程序陷入死循环,请及时在评论区留言并向我提供测试数据,我会及时修改源码完善程序,谢谢大家。
 
 

TAG
软件定制,软件开发,瀚森HANSEN
0
该内容对我有帮助