当前位置:文档之家› 单件作业排序问题的基于lingo软件解法(含代码)

单件作业排序问题的基于lingo软件解法(含代码)

海 南 大 学 《数学模型 》课程设计

题目:单件作业排序问题的基于lingo软件解法 班级: 信息与计算科学 姓名: 体贴的瑾色 学号: 指导教师: *** 日期: 2017.05 单件作业排序问题的基于lingo软件解法 摘要 关键词:单件工件加工 排序 lingo 本文针对一个8*5的单件作业排序问题,通过规定加工顺序,后将不满足这个顺序的工件‘拆分’为不同的工件,然后将问题变成了更为简单的流水作业排序问题。通过引入0-1变量,约束本来同属与一个工件的‘工件’加工顺序建立一个数学规划模型,利用lingo 软件进行模型的求解,得到了使得所有工件都加工完成所需时间最少的排序。最后针对模型做了一个中肯的评价,并将模型推广到解决*mn的单件作业排序问题。 一、问题分析 该问题是一个单件作业排序问题,这是一般的工件排序问题,也是最复杂的工件排序问题,即每一个工件都有自己独特的加工路线,工件没有一定的流向,这类排序问题暂时还没有一种很好的解决方案。而与之区别的一种工件排序问题是流水作业排序问题,最大的不同就是流水作业排序中在不同的工件在多个机床上的加工顺序是一致的情况下也能够找到最优解或者近似最优解,这类问题往往能得到比较好的解决。本问题对工件在不同机床上加工的顺序做了限制,而且一个工件可能多次在同一个机床上加工,使得问题比较复杂,而如果我们规定工件在机床上加工的顺序只能为A-B-C-D-E,且若某个工件不满足这个顺序就将其看为多个符合顺序的工件组合。比如问题中的工件1加工顺序为A-B-A-C-D-E,在第三道工序不满足规定的顺序,那么就将其拆分为加工顺序为A-B—C-D-E和A-B-C-D-E的两个工件1.1和1.2,其中工件1.2必须在工件1.1全部加工完成后才可以进行加工,并且工件1.1的CDE三道工序加工时间都为0,工件1.2的工序B加工时间为0。如此该问题就变成了一个20个工件在5个机床上加工的流水作业排序问题。变换后的加工时间表为(为了方便处理,将变换后的零件仍然以自然数编号,单位为h):

这样只要决定了每个工件在每个机床的初始时刻,顺序一旦确定,每个工件在每个机床的加工终止时刻都完全确定,也就能决定最后八批货物的最后交货时间了。 二、符号说明

1,2,...,20i 表示20个工件; 1,2,...,5j 表示5个机床; (,)xij 表示第i个工件在第j个机床的初始加工时间; (,)tij 表示第i个工件在第j个机床的所需加工时间; 1(,)0ikyikik工件在工件前加工,i工件在工件后加工

tt 表示所有工件都加工完成后的时间(默认最先加工的工件初试加工时间为0)。

三、模型假设 (1)、一个工件不能同时在不同的机床上加工。 (2)、一个工件的一个工序完成后立刻完成下一个工序,中间没有时间延误。 (3)、一个机床开始一道工序后必须一直工作知道这个工序完成。 (4)、一个机床同时只能进行一道工序。

四、模型建立 目标函数:mintt max(,5)(,5),1,2,...,20ttxitii

等价于: (,5)(,5),1,2,...,20ttxitii 因为加工时间不可能小于每个机床运行的最小时间,所以由加工时间表知: 69;tt 每个工件的加工顺序约束: (,)(,)(,1),1,2,...,20,1,2,3,4xijtijxijij 不同工件的加工顺序约束(M是充分大的整数,本题取200): (,)(,)(,)(1(,)),1,2,..,20,(,)(,)(,)(,),xijtijxkjMyikiikxkjtkjxijMyik





原属同一个工件的顺序约束: x(1,2)+t(1,2)<=x(2,1);x(11,5)+t(11,5)<=x(12,1);x(3,2)+t(3,2)<=x(4,1);x(12,4)+t(12,4)<=x(13,3);x(4,5)+t(4,5)<=x(5,3);x(13,3)+t(13,3)<=xx(5,3)+t(5,3)<=x(6,1);x(7,5)+t(7,5)<=x(8,2);x(8,2)+t(8,2)<=x(9,1);(14,2);x(14,2)+t(14,2)<=x(15,1);x(18,5)+t(18,5)<=x(19,1); x(19,4)+t(19,4)<=x(20,1);

变量约束: (,)0,1,2,,20,1,2,3,4,5xijij

y(i,k){0,1},1,2,...,20,iik (,)(,)1yikyki y(1,2)=1;y(11,12)=1;y(3,4)=1;y(12,13)=1;y(4,5)=1;y(13,14)=1;y(5,6)=1;y(14,15)=1;y(7,8)=1;y(18,19)=1;y(8,9)=1;y(19,20)=1;

五、问题解决 求解模型后得到最优解: 69tth

结果分析: 由该图知道顺序应该为: 11->10->3->18->4->1->12->7->5->2->13->17->8->19->16->14-

>6->9->20->15 而回到题目那么顺序应该为(每个工件均按照其加工流程加工): 5(E)->4(ABCE)->2(B)->8(ABE)->2(ADE)->1(AB)->5(ABD)->3(ACDE)

->2(C)->1(ACDE)->5(C)->7(ABCDE)->3(B)->8(ACD)->6(ABCDE)->5(B)->2(AB)->3(AB)->8(A)->5(A) 去除了加工时间为0的工序后每个工件的每个步骤的开始时刻和结束时刻为: 六、模型评价和推广 本模型运用创造性思维将单机排序问题转换成流水排序问题,实现了从繁到简的过程,较好的解决了这个问题,计算出结果的时间也不足两分钟。不足的地方有本模型限制条件过多,用lingo求解容易输错条件,另外本模型只能针对机床的数量都只有一个的排序问题,不能很好地推广到。 本文解决的问题是针对八个工件五个机床的单机排序问题,推广到一般情况,对*mn个工件,具体描述如下:

某加工车间机床种类为n个,数量都为一个,现有m批工件需要加工,每批工件的加工顺序和加工时间如下表所示,试安排机床和工件作业计划,使得尽早完工交货,并求出完工时间。 按照本文的模型,将工件进行‘分解’,给出加工矩阵。在同样的对条件进行约束即可得到最优解。

七、心得体会 通过对上述问题的解决,我最大的收获就是明白了创造性的重要性,本题一个从未见过的很复杂的问题,运用创造性的思维就很轻易的转换成我们做过的问题,十分简便的解决了这个问题。其次的收获就是改正了一个缺点,那就是编程中总是喜欢给变量随便取名,没有一定的规律性,解决本题的时候因为后期出现了一点问题,然后重新检查程序,因为自己都不知道变量名代表了什么着实耽误了很久。最后,通过解决这道问题,我对lingo和matlab两个软件都熟悉了很多。总之,通过这道问题,我可谓是收益匪浅。

参考文献: [1]姜启源,谢金星.数学模型(第四版).北京:高等教育出版社,2011,1. [2]谢金星,薛毅.LINGO软件的基本使用方法.北京:清华大学出版社,2005,1 [3]王万雷. 基于遗传算法的车间作业调度问题研究[D].昆明理工大学,2002.

附: LINGO程序: sets: jiafang/1..20/:; yifang/1..5/:; mianshi(jiafang,yifang):t,x; shunxu(jiafang,jiafang):y; endsets data: t=@OLE('D:\jianmo1.xlsx',data1); enddata min=tt; tt>69; @for(jiafang(i):tt>=x(i,5)+t(i,5)); @for(jiafang(i):x(i,1)+t(i,1)<=x(i,2);x(i,2)+t(i,2)<=x(i,3);x(i,3)+t(i,3)<=x(i,4);x(i,4)+t(i,4)<=x(i,5)); @for(yifang(j):@for(shunxu(i,k)|i#lt#k:x(i,j)+t(i,j)<=x(k,j)+200*(1-y(i,k)))); @for(yifang(j):@for(shunxu(i,k)|i#lt#k:x(k,j)+t(k,j)<=x(i,j)+200*y(i,k))); @for(shunxu(i,k)|i#lt#k:@bin(y(i,k))); @for(shunxu(i,k)|i#lt#k:y(k,i)+y(i,k)=1); y(1,2)=1; y(3,4)=1; y(4,5)=1; y(5,6)=1; y(7,8)=1; y(8,9)=1; y(11,12)=1; y(12,13)=1; y(13,14)=1; y(14,15)=1; y(18,19)=1; y(19,20)=1; x(1,2)+t(1,2)<=x(2,1); x(3,2)+t(3,2)<=x(4,1); x(4,5)+t(4,5)<=x(5,3); x(5,3)+t(5,3)<=x(6,1); x(7,5)+t(7,5)<=x(8,2); x(8,2)+t(8,2)<=x(9,1); x(11,5)+t(11,5)<=x(12,1); x(12,4)+t(12,4)<=x(13,3); x(13,3)+t(13,3)<=x(14,2); x(14,2)+t(14,2)<=x(15,1); x(18,5)+t(18,5)<=x(19,1); x(19,4)+t(19,4)<=x(20,1); data: @ole('D:jianmo1.xlsx',data2)=Y; @ole('D:jianmo1.xlsx',data3)=X; enddata 运行结果:

Matlab 程序: clear all; clc load T %t(i,j) load Y_b

相关主题