第二组加工顺序.docx
《第二组加工顺序.docx》由会员分享,可在线阅读,更多相关《第二组加工顺序.docx(14页珍藏版)》请在冰豆网上搜索。
第二组加工顺序
加工顺序问题
第二组
摘要
本文主要是分别对各个加工工件的完工时间之和最小,机床花费的总时间最小,超时补偿费最小的探讨加工工件怎样安排加工顺序的问题。
第一问采用了二种方法,第一种用C++编程;第二个方案是借用LINGO软件分别求出了加工各个工件的最少时间;第二问,由题目所给的表格画出了加工工件的有向图,列出约束条件结合目标函数求出最优解。
第三问通过对进行分析,可以得到当时,其排列顺序与第一问中的排列顺序相同,而其他情况通过一定的算法可以分析得到.
第一问的最终结果为:
加工顺序为4→10→9→7→11→5→3→8→6→1→2→14→12→13时,各工件的完工时间和最小,为2588。
第二问的最终结果为:
加工顺序为4→7→11→10→9→5→3→8→6→2→1→14→12→13时,机床花费的总时间最小为459。
第三问的最终结果为:
加工顺序为4→7→11→10→5→9→3→8→6→1→2→14→12→13时,总补偿费最小,为14242。
关键词:
加工工件0-1因子
一、问题的重述
加工顺序问题
现在14件工件等待在一台机床上加工,某些工件的加工必须安排在另一些工件完工以后才能开始,第j号工件的加工时间及先期必须完工的工件号i由下表给出:
工件号j
1
2
3
4
5
6
7
8
9
10
11
12
13
14
20
28
25
16
42
12
32
10
24
20
40
24
36
16
前期工件号
3,4
5,7,8
5,9
—
10,11
3,8,9
4
3,5,7
4
—
4,7
6,7,14
5,12
1,2,6
(1)若给出一个加工顺序,则确定了每个工件的完工时间(包括等待与加工两个阶段),试设计一个满足条件的加工顺序,使各个加工工件的完工时间之和最小。
(2)若第j号工件紧接着第i号工件完工后开工,机床需要花费的准备时间是,
试设计一个满足条件的加工顺序,使机床花费的总时间最小。
(3)假设工件的完工时间(包括等待与加工两个阶段)超过一确定时间,
则需要支付一定的补偿费用,其数值等于超过的时间与费用率之积(各工件的补偿率见下表):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
12
10
15
16
10
11
10
8
5
4
10
10
8
12
安排一个加工顺序,使得总补偿费最小。
二、符号说明
符号意义
表示第号工件的加工序号
表示各个加工工件的完工时间之和
—机床花费的总时间
—加工时的总补偿费
表示从节点i到节点j的准备时间
0表示第i个节点到第j个节点不需要准备时间,1表示第i个节点到第j个节点需要准备时间
三模型的假设
1.每个工件都合格的完成加工,不会影响下一工件的加工。
2.没有多余时间的浪费。
3.每个工件都能按照规定时间完成。
四、模型的建立与求解
问题一:
方案一:
借助VC6.0软件求解:
建立三个矩阵,,矩阵为要加工的工件号,矩阵中每列为前期要加工的工件号,0表示没有要求前期加工过工件。
矩阵为这些工件所对应的加工时间。
,
我们把a,b,t写进一个数组里。
当b中的某一列全为0,该列(即工件号)就进行加工,其他的各列就进行等待,并且把b中的该列号变为0;当b中有某些列全为0,则该各列号下的t中哪个元素最小,此列就进行加工,其他列(除已经加工的工件)就进入等待状态。
依此下去,当b中元素全为0,则循环结束。
就说明所有的工件加工完毕。
用任何编译器按上述算法编程可得VC6.0程序见附录1:
计算得总完工时间之和最小的加工次序为:
计算得总完工时间之和最小的加工次序为:
4-10-9-7-11-5-3-8-6-1-2-14-12-13
总时间为:
2588
方案二:
各个加工工件的完工时间之和包括各工件的等待时间之和与各工件的加工时间之和。
因为各工件的加工时间之和是一定的为345,所以此问可转化为求各工件等待时间之和最小时加工工件的次序.
在算总时间时,第个工件有个工件等待,加上第个工件本身的加工时间,因此,加工各个工件的时间之和为:
借助lingo软件求解:
目标函数:
约束条件:
x1+x2+x3+x4+x5+x6+x7+x8+x9+x10+x11+x12+x13+x14=91;
x1-x3>1;x1-x4>1;
x2-x5>1;x2-x7>1;x2-x8>1;
x3-x5>1;x3-x9>1;
x5-x10>1;x5-x11>1;
x6-x3>1;x6-x8>1;x6-x9>1;
x4-x7>1;
x8-x3>1;x8-x5>1;x8-x9>1;
x9-x4>1;
x11-x4>1;x11-x7>1;
x12-x6>1;x12-x7>1;x12-x14>1;
x14-x1>1;x14-x2>1;x14-x6>1;
x13-x5>1;x13-x12>1;
在加上由题目可知的约束条件得出了结果是
计算得总完工时间之和最小的加工次序为:
4-10-9-7-11-5-3-8-6-1-2-14-12-13
加工工件的总完工时间为:
2588
问题二:
要计算机床花费的总时间最小,就必须知道总时间包括哪几部分,通过分析知道,机床可以由三部分组成:
机床的等待时间,机床的准备时间,机床的加工时间。
通过进一步的分析,可以由题意得知:
机床的等待时间可以为0,机床的工作时间可以为各个工件都完成的时间。
所以,我们求得最少的准备时间的路线即为总时间最小的路线。
通过对表中的数据可以得到一下的图形:
由题中给出的表格画出了上图。
图中的圆圈为要加工的工件号,连线箭头表示了加工工件的次序,建立了目标函数,表示从节点i到节点j的准备时间,(0表示第i个节点到第j个节点不需要准备时间,1表示第i个节点到第j个节点需要准备时间。
通过对上图的分析,可以得到以下的目标函数,目标函数即表示建立一个14*14的矩阵,而其中每一行每一列都只有一个元素需要等待时间为,并且求出这个等待时间的最小值。
而第一工件不需要等待时间,所以里边的等待时间个数一共为十三个。
根据上面的分析,可以得到以下的目标函数和约束条件。
s.t.
通过对解的分析,我们找到了第一号加工的工件到第十四号工件的准备总时间为:
85
路径为:
4→7→11→10→9→5→3→8→6→2→1→14
由于我们的程序得到的是第一号工件到第十四号工件的准备的总时间,通过进一步分析,得到的总准备时间为:
114
最终的路径为:
4→7→11→10→9→5→3→8→6→2→1→14→12→13
问题三:
补偿时间本来跟三个因素有关,即:
工件的等待时间和加工时间、机床的准备时间。
但我们得知机床的准备时间是一个定值,且值为0。
所以补偿时间只跟等待时间、加工时间有关,当大于100时,之后的加工顺序与第一问的完全相同。
因为大于100时,我们考虑的因素可以归纳为:
(其中a为等待时间,b为加工时间),其中已然是个定值,只要a的和最小,整个的补偿时间就最小。
而第一问我们已经得到了a(等待时间)最小的一个顺序。
所
以当大于100后的顺序就相同了。
当<100时,
算法:
通过对第一问前面的六个数进行分析,至于为什么采用前边的六个顺序元素进行分析,因前边的六个元素的加工时间进行从小到大的顺序进行计算使之刚好大于100,然后在找到对应的工件号正好在前六个元素里边.所以我们只讨论第一问答案的前六个元素.前六个元素的顺序我们放在d数组中.与之对应的加工时间放在e中.其补偿率放在f中.我们用e中的元素进行循环相加,并且当加上那个数正好大于100时,对它进行减去100再乘f的操作得到一个数G.操作完成之后,并在一个数组中保存与之相对应d的顺序.依次循环.就可以得到G大小的许多值,通过比较这个值,那个最小的值就是补偿时间.与之对应的顺序就是补偿时间最小的顺序.
通过VC6.0可以得到:
总的顺序为:
4→7→11→10→5→9→3→8→6→1→2→14→12→13
五、模型改进
该问题并没有考虑机器的故障时间和休息时间。
并且在工厂里也并不是一台机器单独工作,而是特别灵活地调用其他的机器协调工作。
所以,在实际中,不仅要综合考虑,而且更加注意机器之间的协调工作。
六、模型的优缺点及其评价
优点:
在第一问中,我们找到了一种解决问题的算法,通过计算机的快速循环遍历就可以得到对于任意多个工件的最精确的答案。
在第二问、第三问中,我们巧妙采用了这样的因子构建目标函数,在找到目标函数的所有约束条件,使得本问题迎刃而解。
缺点:
第一问中,算法用计算机语言表达比较难,更加使用于专业程序员解决。
第二、三问中,约束条件比较难找,并且约束条件用lingo描述比较长。
评价:
本问题,通过两种巧妙方法的结合。
得到了最准确的答案。
并且此模型也适用于车辆调度问题、垃圾处理问题。
七、参考文献
[1] 刘育兴,钟剑,垃圾运输问题的模型及其求解,赣南师范学院学报
[2]谢金星,薛毅,优化建模与LINGO软件,北京:
清华大学出版社,2005年。
附录1:
#include
intuniform(structgraphw[]);
voidIntiGraph(structgraphw[]);
voiddowithliennum(structgraphw[],intnum);
structgraph
{
inta;
intb[3];
intt;
};
structTIME
{
intwaiting;
intworking;
inttotal;
};
intmain()
{
intorder[14];
structgraphw[14];
structTIMEtime[14];
intflag=0;
intnum=0;
intt=0;
inti=0;
intj=0;
IntiGraph(w);
for(;i<14;i++)
{
num=uniform(w);
dowithliennum(w,num);
time[num].waiting=t;
time[num].working=w[num].t;
t=t+w[num].t;
time[num].total=t;
order[i]=num+1;
}
printf("加工过程为:
\n");
i=0;
for(;i<14;i++)
{
printf("工件号是:
%d该工件的等待时间:
%d",order[i],time[order[i]-1].waiting);
printf("加工时间:
%d该工件完成所要的时间:
%d\n",time[order[i]-1].working,time[order[i]-1].total);
}
printf("************所有工件加工所需时间之和:
%d\n",t);
getchar();
getchar();
return1;
}
/*intuniform(structgraphw[])
{
inttempnum[10];
intnum=50;//只要为一个比各个工件加工时间都大即可
inti=0;
intj=0;