基于遗传算法求解作业车间调度问题生产运作实践.docx
《基于遗传算法求解作业车间调度问题生产运作实践.docx》由会员分享,可在线阅读,更多相关《基于遗传算法求解作业车间调度问题生产运作实践.docx(31页珍藏版)》请在冰豆网上搜索。
基于遗传算法求解作业车间调度问题生产运作实践
生产运作实践大作业
问题一:
基于遗传算法求解作业车间调度问题
1.问题介绍
1.1作业车间调度问题表述
作业车间是指利用车间资源完成的某项任务,在实际生产中,这项任务可能是装配一种产品,也可能是完成一批工件的加工,为了研究方便,我们将这项任务限定为加工一批工件。
在此基础上,可对作业车间调度问题进行一般性的描述:
假定有N个工件,要经过M台机器加工,一个工件在一台机器上的加工程序称为一道“工序”,相应的加工时间称为该工序的“加工时间”,用事先给定的“加工路线”表示工件加工时技术上的约束,即工件的加工工艺过程,用“加工顺序”表示各台机器上各个工件加工的先后顺序。
在车间作业调度问题中,每个工件都有独特的加工路线,我们要解决的问题就是如何分配N个零件在M个机器上的加工顺序以使得总的加工时间最短。
1.2作业车间调度问题研究的假设条件
在研究一般的作业车间调度问题中往往需要明确两类重要假设条件:
1.工艺路径约束:
工件的任一工序必须在其前道工序完成后才能开始,并保证同一工件不会同时在两台机器上加工,反映了工件不同工序间的时序关系;
2.资源独占性约束:
任一台机器每次只能加工一个工件,且一旦开工就不能中断,反映了加工队列中工件间的时序关系。
根据上面以及求解方便,我们做出以下具体假设:
1.每一台机器每次只能加工一个工件,每一个工件在机器上的加工被成为一道工序。
2.不同工件的加工工序可以不同;
3.所有工件的工序数不大于设备数;
4.每道工序必须在指定的某种设备上加工,所有机器处理的加工类型均不同;
5.在作业优化过程中既没有新的工件加入也没有取消的工件;
6.不考虑工件加工的优先权,即工件之间没有优先约束关系限制的;
7.工序允许等待,即前一个工序未完成,则后面工序需要等待;
8.工件的加工时间事先给定,且在整个加工过程中保持不变。
1.3车间作业调度问题的数学模型
建立车间作业调度问题的数学模型,是我们研究该问题的出发点,同时也为其后的研究奠定了基础。
假设有n个工件,要在m台机器上加工,每个工件有Pi道工序,每台机器上总共要加工Lj道工序。
我们定义以下基本数学符号[6]:
J:
所有工件的集合,
;
M:
所有机器的集合,
;
:
工件Ji的工序集合,
;
P:
所有工序的集合,此为
矩阵。
P(i,j)表示i工件的第j道工序。
,表示i工件的所有工序按优先顺序的排列。
不足
,那么其空余的位置用0填满。
(1.1)
:
机器顺序阵,此为
矩阵。
(i,j)表示i工件的第j道工序的机器号,
表示i工件的所有工序按优先顺序加工的各机器号的排列。
注意:
如果某工件的工序数不足
,那么其空余的位置用0填满。
(1.2)
T:
加工时间阵,此为
矩阵。
T(i,j)表示工件i的第j道工序在
(i,j)上的加工时间。
同样地,如果某工件的工序数不足
,那么其空余的位置用0填满。
(1.3)
:
工件排列阵,此为
矩阵。
表示在i机器上排在第j位加工的工件号,
表示i机器上依次加工的各工件的排列。
同上,如果某工件的工序数不足
,那么其空余的位置用0填满。
事实上,工件排列阵就是调度的一种表示形式。
由此,我们可以给出一般性的车间作业调度数学模型的定义:
如果对应于一个确定的
,满足
或
。
即
使得目标函数
取值最小(或最大),且与
相容,则称
为车间作业调度问题在此目标函数下的最优解。
2.基本遗传算法
遗传算法是一种基于自然群体遗传演化机制的高效探索算法,由美国学者Holland于1975年首先提出来的,通过模拟达尔文的遗传选择和自然淘汰的生物进化过程来求解。
它将问题域中的可能解看作是群体的一个个体或染色体,并将每一个体编码成符号串形式,对群体反复进行基于遗传学的操作(遗传,交叉和变异),根据预定的目标适应度函数对每个个体进行评价,依据适者生存,优胜劣汰的进化规则,不断得到更优的群体,同时以全局并行搜索方式来搜索优化群体中的最优个体,求得满足要求的最优解。
2.1遗传算法的基本思路
1.首先确定问题的求解空间;
2.将求解空间中的每一个点进行编码,并从求解空间中任选N个点组成初始群体;
3.计算当前群体中每个个体的适应度函数值,然后运用选择、交叉、变异算子产生新一代群体;
4.对新一代群体中的每个个体进行评价,若找到满足问题的最优解则结束;否则,转步骤3。
2.2基本遗传算法参数说明
对遗传算法性能有影响的参数主要有:
种群数目N、交换概率Pc、变异概率Pm、代沟G、尺度窗口W、和选择策略S等。
1.种群数目
种群数目N的多少直接影响到遗传算法的优化性能和效率。
种群选择太小时,不能提供足够多的个体,致使算法性能较差,易产生早熟收敛,甚至不能得到可行解;种群选择过大时,虽然能避免早熟收敛,但是增加了计算量。
2.交换概率
交换概率Pc用于控制交换操作的频率。
交换概率太大的时,易产生更新过快,从而破坏掉高适应度个体的现象;交换概率太小的时候又容易产生搜索停滞不前的现象。
3.变异概率
变异概率Pm对于增加种群多样性具有重要意义。
如果变异概率太大的时,遗传算法易变成随机搜索,如果变异概率太小,则不能产生新个体,不利于种群的多样性。
4.代沟
代沟G用于控制每一代群体被替换的比例,每代有N×(1-G)个父代个体选中进入下一代种群中,该参数和交换、变异概率以及选择策略有很大关系,它并不是一个初始参数,而是评价遗传算法的一个参数。
5.尺度窗口
该参数用于作出由目标值到适应度函数值的调整。
6.选择策略
一般来说有两种选择策略,一种为纯选择,种群中每个个体根据其适应度值进行比例选择,即个体被选择的概率与其适应度值成正比。
另一种为保优策略,首先进行纯选择,把目前最优个体直接加入下一代种群中,该策略是为了防止最优解的丢失,但在实际应用中往往采取这两种选择策略结合的方法,并做适当的变型。
3.用遗传算法对具体问题的解决
遗传算法在解决作业车间调度问题上比经典的启发式算法好,同时遗传算法比传统的搜索技术有更强的优越性,因为它不仅能解决某一特定问题,而且可以适应不同的问题形式。
3.1参数编码
遗传编码技术是实施遗传算法的核心。
遗传算法的工作基础是选择适当的方法表示个体和问题的解,对于同一问题可以有不同的编码表示方法。
由于遗传算法不能直接处理空间解的数据,在解决此车间调度问题上把它们转换成遗传空间的基因按一定结构组成的染色体或个体,也就是通过编码将它们表示成遗传空间的基因型串结构数据。
我们采用了基于操作的编码来解此车间调度问题,其基本思想是将所有工件的操作进行编码,不同的工件用不同的编码表示,而同一工件的所有操作在染色体中则用相同的编码表示,其解码原则是将染色体上的基因按照从左到右的顺序解释为相应工件的操作顺序,具有相同编码的基因按照其在整个染色体中的位置解释为工件相应顺序的操作。
表3.1加工时间和工艺约束
项目
工件
操作序列
1
2
3
操作时间
J1
J2
J3
3
1
3
3
5
2
2
3
3
机器
J1
J2
J3
M1
M1
M2
M2
M3
M1
M3
M2
M3
3.2初始种群的生成
在N个工件M台机器的排序问题中,对每个机器的加工存在加工工艺顺约束,这个工艺约束表示为工件的加工顺序矩阵:
M11M12…M1M
M(J,M)=M21M22…M2M
:
:
:
:
(3.2)
Mn1Mn2…MnM
其中第J行表示第J个工件的机器顺序.机器号为零表示工件加工结束。
相应的每个加工操作有时间矩阵:
T11T12…T1M
T21T22…T2M
T(J,M)=:
:
:
:
(3.3)
TN1TN2…TNM
其中第J行表示第J个工件的机器加工时间,时间为零表示工件不在机器上加工。
因为群体中的个体都是由工件的符号组成的,而且工件任意排列总能产生可行调度,所以可以采用随机方法产生初始种群。
3.3个体的适应度函数
在遗传算法中,适应度是描述个体性能的主要指标。
根据适应度的大小,对个体进行优胜劣汰。
适应度是驱动遗传算法的动力。
从生物学角度讲,适应度相当于“生存竞争,适者生存”的生物生存能力,在遗传过程中具有重要意义。
适应度函数就是目标函数,在用遗传算法解决车间调度问题里,定义个体的适应度函数为在M台机器上排序加工完N个工件所需的时间,根据染色体编码的思想提出的适应度算法如下:
STEP1:
定义ti(n)为每个工件的可加工时间,初始化向量为零向量。
STEP2:
chrom(i)对应相应工序的加工机器为machiner(i)。
ti(chrom
(1))=ti(chrom
(1),machine
(1))
STEP3:
fori=2ton
Fork=1ton
ti(chrom(i))=ti(chrom(i-1))+max(ti(chrom(i-k),machine(i-k)+k))其中若当i-k<=0,则ti(chrom(i-k),machine(i-k))=0,还有要判断chorm(i)所对应的工件在以前是否加工过,若加工过,则ti(chrom(i))=ti(chorm(i-1))。
STEP4:
求出适应度函数F=ti(chorm(n))。
3.4遗传算子的设计
1.选择算子
选择操作是对自然界“适者生存”的模拟。
评价值(目标函数)较小的个体有较高的概率生存,即在下一代群体中再次出现。
我们采用一种常用的选择方法:
按比例选择,即若个体i适应值(目标函数)是fi,则个体在群体中复制(再生)的子代个数在群体中的比例将为:
。
其中,∑fi表示指所有个体适应值之和。
对群体中各个体的适应值做比较,将适应值小的个体复制,将适应值大的淘汰掉,这是因为在作业调度算法中的适应度函数为在M台机器上加工完N个工件所需的时间,时间越短,更能达到优化的目的。
2.交叉算子
在用遗传算法解决作业车间调度问题中,在对工序编码的排序问题中,交叉算子不能简单交换两个个体的相应位置的基因段,因为这样得到的后代个体可能不能满足每个工件号重复M次的要求。
为了满足我们的工序编码的要求,本文采用下面的交叉算子:
随机将工件集合{1,2,…N}分成两个互补子集,相应的将个体的基因分成两个部分,然后把父母个体中的part2部分用h代替形成两个新串,用第二个父母个体的part2部分按照原来的相对顺序逐个替换第一个父母个体的part2产生的新串中的h,同样用第一个父母个体的part2按照原来的相对顺序逐个替换第二个父母个体的prat1产生的新串中的h,得到两个后代个体。
例如:
对于一个4个工件4个机器问题,假如父母个体为:
Parent1:
1342423314321421
Parent2:
3241123442312413
假设随机选择工件1,2,则从parent1得到的新串为:
New1:
1hh2h2hh1hh21h21
Part1:
12212121
Part2:
34433434
同样从Parent2得到的新串为
New2:
h2h112hhh2h12h1h
Part1:
21122121
Part2:
34344343
然后用Parent2个体的part2:
34344343按照原来的相对顺序逐个替换第一个父母个体Parent1产生的新串New1:
1hh2h2hh1hh21h21中的h,得到的后代个体为:
Parent1':
1342324413421321
同理用Parent1个体的part2:
34433434按照原来的相对顺序逐个替换第二个父母个体Parent2产生的新串New2:
h2h112hhh2h12h1h中的h,得到的后代个体为:
Parent2′:
3241124332412314
3.变异算子
在做变异时,先对解群以一定的概率进行突变操作。
在此作业调度算法中,不能简单的将基因的值做改变。
由于问题及其表示的特殊性,这样简单的改变可能是没有意义的。
我们使用如下变异方法:
随机产生一个整数,确定变异位置,然后,把该位置的基因与其前面的基因互换位置。
同样,以132312312为例,假设变异位置为2,则变异前后的基因链码为:
变异前:
132312312
变异后:
312312312
3.5遗传算法终止条件
从查阅的资料来看,大多是以优化时间或迭代次数或适应度的增量或其他参数作为终止条件的,我们采用以迭代次数作为是否终止的条件,从而控制优化过程。
4.模型的求解
假设交叉概率Pc=100%,变异概率Pm=25%,群体规模为6,加工顺序矩阵:
T=[136736;
851010104;
548917;
555389;
935431;
3391041;
];
相应的每个加工操作有时间矩阵:
M=[201354;
124503;
235014;
102345;
214503;
135042;
];
运行程序结果如下,最短时间为61,
最后,由仿真得到6×6的曲线图3.3和甘特图3.4,图中显示了适应度值为6个工件在6个机器加工所需的最短时间,对应得工序即为工件的加工顺序。
图3.3中实线代表最优解的变化,虚线代表种群均值的变化。
图3.4表示了工件6×6的调度。
图3.3曲线图
图3.4甘特图
5.结论总结
遗传算法在解决作业车间调度问题上比经典的启发式算法好,同时遗传算法比传统的搜索技术有更强的优越性,因为它不仅能解决某一特定问题,而且可以适应不同的问题形式。
作业车间调度问题是计算机集成制造系统工程中的一个重要组成部分,它对企业的生产管理和控制系统有着重要的影响,在当今的竞争环境下,如何利用计算机技术实现生产调度计划优化,快速调整资源配置,统筹安排生产进度,提高设备利用率已成为许多加工企业面临的重大挑战。
6.附录
主程序:
T=[136736;
851010104;
548917;
555389;
935431;
3391041;
];
M=[201354;
124503;
235014;
102345;
214503;
135042;
];
%将机器号+1
fori=1:
6
S=M(i,:
);
forj=1:
6
S(j)=S(j)+1;
end
M(i,:
)=S;
end
PNumber=6;%零件个数6
MNumber=6;%机器个数6
WPNumber=[666666];
%将时间处理下
TTemp=T;
fori=1:
6
forj=1:
6
TTemp(i,j)=T(M(i,j),i);
end
end
NIND=40;%个体数目(Numberofindividuals)
MAXGEN=200;%最大遗传代数(Maximumnumberofgenerations)
GGAP=0.9;%代沟(Generationgap)
XOVR=0.8;%交叉率
MUTR=0.6;%变异率
gen=0;%代计数器
trace=zeros(2,MAXGEN);%寻优结果的初始值
WNumber=0;
fori=1:
PNumber
WNumber=WNumber+WPNumber(1,i);%工序个数
end
%初始化群
Chrom=zeros(NIND,WNumber);
fori=1:
NIND
Chrom(i,:
)=randperm(WNumber);
end
%计算目标函数值
[PValObjVP]=cal(Chrom,NIND,T,M,PNumber,MNumber,WPNumber);
whilegenFitnV=ranking(ObjV);%分配适应度值(Assignfitnessvalues)
SelCh=select('sus',Chrom,FitnV,GGAP);%选择
SelCh=across(SelCh,NIND*GGAP,XOVR,WNumber);%交叉
SelCh=aberrance(SelCh,NIND*GGAP,MUTR,WNumber);%变异
[PValObjVSelP]=cal(SelCh,NIND*GGAP,T,M,PNumber,MNumber,WPNumber);%计算目标函数值
[ChromObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel);%重插入子代的新种群
[PValObjVlP]=cal(Chrom,NIND,T,M,PNumber,MNumber,WPNumber);%计算目标函数值
gen=gen+1;%代计数器增加
%%输出最优解及其序号,并在目标函数图像中标出,Y为最优解,I为种群的序号
trace(1,gen)=min(ObjV);%遗传算法性能跟踪
trace(2,gen)=sum(ObjV)/length(ObjV);
%初始化
ifgen==1
Val1=PVal;
Val2=P;
MinVal=min(ObjV);
end
%记录最小的工序
ifMinVal>trace(1,gen)
Val1=PVal;
Val2=P;
MinVal=trace(1,gen);
end
end
PVal=Val1;%工序时间
P=Val2;%工序
MinVal=MinVal%最小时间
%计算解的变化
holdon;
plot([0,0],[0,0]);
plot(trace(1,:
));
holdon;
plot(trace(2,:
),'-.');grid;
legend('解的变化','种群均值的变化');
%显示结果
figure
(2);
fori=1:
WNumber
val=P(1,i);
a=(mod(val,10))+1;
b=((val-a+1)/10);
mText=M(b,a);
PlotRec(PVal(1,i),PVal(2,i),mText);
holdon;
mPoint1=PVal(1,i);
mPoint2=PVal(2,i);
x1=mPoint1;
y1=mText-0.5;
x2=mPoint2;
y2=mText-0.5;
x3=mPoint2;
y3=mText;
x4=mPoint1;
y4=mText;
fill([x1,x2,x3,x4],[y1,y2,y3,y4],[1,0.5,1]);
word=num2str(P(1,i));
%text(0.5*mPoint1+0.5*mPoint2,mText-0.5,word);
text(mPoint1,mText-0.7,word);
end
M文件如下:
aberrance.m
functionChromNew=aberrance(Chrom,NIND,MUTR,WNumber)
%新群
ChromNew=Chrom;
fori=1:
NIND
%是否变异
a=rand;
ifMUTR>a;
%变异位置
Pos1=unidrnd(WNumber);
Pos2=unidrnd(WNumber);
%变异位置不相同
whilePos1==Pos2
Pos2=unidrnd(WNumber);
end
%取数据
S=Chrom(i,:
);
%交换
temp=S(Pos1);
S(Pos1)=S(Pos2);
S(Pos2)=temp;
ChromNew(i,:
)=S;
end
end
across.m:
functionChromNew=across(Chrom,NIND,XOVR,WNumber)
%新群
ChromNew=Chrom;
%%交叉位置
%Pos1=fix((1-XOVR)*WNumber);
%Pos2=fix(XOVR*WNumber);
%随机选择交叉个体
SelNum=randperm(NIND);
%fori=1:
NIND
%SelNum(i)=unidrnd(NIND);
%end
%交叉个体组个数
Num=NIND/2;
Num=2*fix(Num);
fori=1:
2:
Num
a=rand;
ifXOVR>a;
%变异位置
Pos1=unidrnd(WNumber);
Pos2=unidrnd(WNumber);
Pos3=unidrnd(WNumber);
Pos4=unidrnd(WNumber);
%变异位置不相同
whilePos1==Pos2
Pos2=unidrnd(WNumber);
end
ifPos1>Pos2
temp=Pos1;
Pos1=Pos2;
Pos2=temp;
end
whilePos3==Pos4
Pos3=unidrnd(WNumber);
end
ifPos3>Pos4
temp=Pos3;
Pos3=Pos4;
Pos4=temp;
end
%取交换的个体
S1=Chrom(SelNum(i),:
);
S2=Chrom(SelNum(i+1),:
);
%初始化新2个体
S11=zeros(1,WNumber);
S22=zeros(1,WNumber);
%新个体中间部分的COPY
forj=Pos1:
Pos2
S11(j)=S1(j);
%S22(j)=S2(j);
end
forj=Pos3:
Pos4
S22(j)=S2(j);
end
%交换个体1
forj=1:
WNumber
flag=ismember(S2(j),S11);
ifflag==0
k=1;
whilek<=WNumber
ifS11(k)==0
S11(k)=S2(j);
k=WNumber+1;
end
k=k+1;
end
end
end
%交换个体2
forj=1:
WNumber
flag=ismember(S1(j),S22);
ifflag==0
k=1;
whi