200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 【车间调度】遗传算法求解柔性作业车间调度问题

【车间调度】遗传算法求解柔性作业车间调度问题

时间:2023-06-16 08:02:19

相关推荐

【车间调度】遗传算法求解柔性作业车间调度问题

本系列为自己学习调度相关知识的记录,如有误请指出,也欢迎调度方向的小伙伴加我好友共同交流。

FJSP的染色体编码

染色体编码是将所研究的问题的解用染色体的形式来表达的,这是遗传算法的关键。编码的目的是为了实现交叉、变异等类似于生物界的遗传操作。必须考虑染色体的合法性、可行性、有效性,以及对问题解空间表达的完全性。良好的编码方式可以在后续遗传操作中易产生可行解,提高执行效率;否则,经过遗传操作会产生不可行解,需要一定的修补措施,这样就降低了执行效率。染色体编码对求解速度、计算精度等有着直接的关系,对算法具有重要影响。

FJSP包括两个子问题:机器选择和工序排序。机器选择解决每道工序在可选机器集中的哪台机器上进行加工的问题;工序排序解决所有工序确定加工机器后的排序和开工时间问题。针对编码过程中对两个子问题编码处理的不同,目前主要有以下两种不同的编码方法。

集成编码

集成编码染色体中的每一个基因位(h,j,i)代表一个工序任务,表示工件j的第h道工序在机器i上加工,染色体总长度等于所有工件的工序总和ToT_oTo​。Kacem称为TSL(task sequencing list)或OLC(operations list coding),Kacem和Zribi等在其一系列文献中均采用此编码方法。这种编码方法易于表达,但是每一个基因位包括信息过多,在必须满足工序约束的条件下进行遗传操作较为复杂,容易产生非法解。因此适应此编码方法的交叉和变异方法较少,不易改进提高。

分段编码

分段编码染色体有A/B两部分组成,将工序信息分开处理,分别代表FJSP的两个子问题,两部分染色体长度都等于ToT_oTo​。在有的文献中也称为双层编码或主副串编码,是一种较为常用的编码方式。Chen提出一种A/B编码,A部分表示每道工序选择的机器,B部分表示机器上的工序编码,如此易产生非法解,使得需要采取修补措施修正非法解。余琦玮、杨晓梅、卢冰原和谷峰等均采用染色体两层编码机制,只是在局部有所不同。Ho和Tay等对几种编码方式进行比较并且做了改进,取得了较好的效果,但是由于机器选择部分采用二进制数编码方法,使得求解效率不高。

FJSP包含T-FJSP和P-FJSP两种类型,染色体编码必须适应不同类型的问题.

结合分段编码易表现、易操作等特点,对以往编码方法进行了改进,设计了一种整数编码MSOS。由两部分组成:机器选择部分(machines selection MS)和工序排序部分(operations sequencing OS).此编码不但适合T-FJSP而且适合于P-FJSP。

如下为MSOS染色体结构:

1.机器选择部分

机器选择部分染色体长度为ToT_oTo​。每个基因位用整数表示,依次按照工件和工件工序的顺序进行排列,每个整数表示当前工序选择的加工机器在可选机器集中的顺序编号,并不是对应的机器号,这保证了后续交叉、变异等操作后产生的解仍然是可行解。这种编码不但适应T-FJSP,而且更适合P-FJSP,对工序可选机器台数的多少没有要求,长度确定,操作方便。以往较多文献中求解P-FJSP时,需要先转换为T-FJSP,使得染色体中产生大量冗余信息,计算时间大幅度增加,计算效率降低。

以之前的P-FJSP为例,如下图所示依次是工件J1J_1J1​和工件J2J_2J2​的所有工序。工序O11O_{11}O11​有5台机器可以选择,对应的4表示可选机器集中第4台机器,即在机器M4M_4M4​上加工,同理,工序O12O_{12}O12​有2台机器可以选择,分别为机器M2M_2M2​和机器M1M_1M1​,图中对应的1表示可选机器集中的第1台机器,即在机器M2M_2M2​上进行加工。

2.工序排序部分

当工序的加工机器确定后,对工序的排序类似一般JSP。此部分采用Gen提出的基于工序的编码方式进行编码,染色体长度等于所有工件的工序之和ToT_oTo​。每一个基因用工件号直接编码,工件号出现的顺序表示该工件工序间的先后加工顺序,即对染色体从左到右进行编译,对于第h次出现的工件号,表示该工件j的第h道工序,并且工件号的出现次数等于该工件的工序总数hjh_jhj​。如此编码柔性很高,可满足调度规模变化、工件工序数不定等各种复杂情况,而且任意置换染色体中的顺序后总能得到可行调度,在解码过程中可以产生活动调度.

如上图中,假设工序染色体为[2 2 1 1 2],则其中第一个2表示工件J2J_2J2​的工序O21O_{21}O21​,第二个2表示工件J2J_2J2​的工序O22O_{22}O22​.依次类推,转换成各工件工序的加工顺序为O21−−>O22−−>O11−−>O12−−>O23O_{21}-->O_{22}-->O_{11}-->O_{12}-->O_{23}O21​−−>O22​−−>O11​−−>O12​−−>O23​

FJSP的染色体解码

解码运算并不是编码的简单反运算,按照不同的方法可以解码成活动调度、半活动调度和非延迟调度等类型。

1.调度类型

对于一个FJSP染色体,机器选择部分是确定的,工序排序部分存在大量的可行解,因为任意两道工序之间可以插入无限的闲置时间。在不考虑任何两道连续工序之间存在闲置时间的情况下,调度问题可以分为三种类型,它们的定义分别如下。

活动调度(active schedule)在不推迟其他操作或破坏优先顺序的条件下,其中没有一个操作可以提前加工。半活动调度(semi-active schedule)在不改变机器上加工顺序的条件下,其中没有操作可以提前非延迟调度(non-delay schedule)至少存在一个工件等待加工时,对应不存在相应处于空闲的机器。

三者包含关系如下:

活动调度集包含在半活动调度集中,也就是说:当调度处于非活动调度下,一定可以找到某些工序,使其可以更早加工。例如在同一台机器上一个工序在前道工序完成后,可将其插入到同一台机器中工序时间比它早的另一个工序之前;换言之,就是插入到另一个工序还未开始加工前的空闲时间内。虽然非延迟调度集包含在活动调度集中,但不能保证包含最优解。对于正规调度性能指标,已经证明最优调度必在活动调度集中。因此,对于正规调度性能指标在设计优化算法时,将搜索空间限于活动调度集中,不仅能够保证最优调度的存在,而且能够提高优化效率。但是对于非正规调度性能指标,如提前/拖期惩罚代价最小等调度问题,活动调度不能保证包含最优解,有可能最优解存在于半活动调度集中。本章中对于单目标的优化,均采用最大完工时间最小的正规调度性能指标,下面介绍FJSP染色体如何解码成活动调度。

2.染色体解码

FJSP染色体MSOS由两部分组成,分别对它们进行解码,关键是需要将工序排序部分解码成对应于机器选择部分的活动调度,具体的解码步骤如下

步骤1

对机器选择部分进行解码,从左到右依次读取并转换成机器顺序矩阵JMJ_MJM​和时间顺序矩阵T。其中JM(j,h)J_M(j,h)JM​(j,h)表示工件JjJ_jJj​的工序OhO_hOh​的机器号,JM(,∗)J_M(,*)JM​(,∗)表示工件JjJ_jJj​的所有工序按优先顺序加工的各个机器号的排列;T(j,h)T(j,h)T(j,h)表示工件JjJ_jJj​的工序OhO_hOh​的加工时间。JM(j,h)J_M(j,h)JM​(j,h)与T(j,h)T(j,h)T(j,h)的关系是一一对应的。

上图中机器选择部分【4 1 2 4 4】转换为机器顺序矩阵和时间顺序矩阵后为

JM=[44325]J_M=\begin{bmatrix} 4 & 4& \\ 3 & 2 & 5 \end{bmatrix}JM​=[43​42​5​]

T=[38668]T=\begin{bmatrix} 3 & 8& \\ 6 & 6 & 8 \end{bmatrix}T=[36​86​8​]

JM(1,2)=4J_M(1,2)=4JM​(1,2)=4表示工件J1J_1J1​的工序O12O_{12}O12​在机器M2M_2M2​上加工,T(1,2)=8T(1,2)=8T(1,2)=8表示工件J1J_1J1​的工序O12O_{12}O12​在机器M2M_2M2​上的加工时间为8。

步骤二

对工序排序部分的染色体从左到右依次读取。按照步骤1对应的机器顺序矩阵和时间顺序矩阵依次得到每个工件工序对应的加工机器和加工时间,并对此工序进行排序得到调度结果。

下面是一种工序插入式方法,确保染色体解剖后产生活动调度。

(1)读取OS部分的一个基因,转换成相应工序OjhO_{jh}Ojh​。

(2)通过机器顺序矩阵JMJ_MJM​和时间顺序矩阵T得到工序OjhO_{jh}Ojh​的加工机器Mi=JM(j,h)M_i=J_M(j,h)Mi​=JM​(j,h)和加工时间pijh=T(j,h)p_{ijh}=T(j,h)pijh​=T(j,h)

(3)如果工序OjhO_{jh}Ojh​在机器MiM_iMi​是第一道加工工序,那么直接从它的上道工序Oj(h−1)O_{j(h-1)}Oj(h−1)​的结束时间开始加工即可。如果工序OjhO_{jh}Ojh​是工件JjJ_jJj​的第1道工序,那么直接从机器MiM_iMi​的零时刻进行加工。否则,找到机器MiM_iMi​上所有间隔空闲时间段[TSi,TEi][TS_i,TE_i][TSi​,TEi​],TSiTS_iTSi​表示间隔时间段的开始时间,TEiTE_iTEi​表示间隔空闲时间段的结束时间。按下式得到工序OjhO_{jh}Ojh​最早开始加工时间tat_ata​,能够满足工件加工工序的顺序约束。

ts=maxcj(h−1),TSit_s=max{c_{j(h-1)},TS_i}ts​=maxcj(h−1)​,TSi​

(4)按下式1判断间隔空闲时间段是否满足插入条件,如满足则插入当前空闲时间段内,如图a所示;否则,按下式2的时间tbt_btb​在机器MiM_iMi​上进行加工,其中LMiLM_iLMi​表示当前机器MiM_iMi​最后一道工序的结束时间,如图b所示。

ta+pijh≤TEit_a+p_{ijh}≤TE_ita​+pijh​≤TEi​ 式1

tb=max{cj(h−1),LMi}t_b=max\{c_{j(h-1)},LM_i\}tb​=max{cj(h−1)​,LMi​} 式2

(5)判断OS部分的染色体是否读取完毕,如满足,则结束;否则,转(1)继续。

到此染色体解码完毕,生成活动调度。可以得到每个机器上工序的加工顺序和对应的开始时间、结束时间,即可画出调度甘特图。对其进行操作可以得到相应的目标值,例如,对每台机器最后一道工序的完工时间进行比较,可得到最大完工时间。

FJSP的初始化

种群初始化在进化算法中是一个关键问题,初始解的质量对遗传算法求解的速度和质量有非常大的影响。FJSP不但要解决机器选择问题,还要解决所有工序排序问题。目前,大部分文献一般采用的是随机初始化方法,使得初始解的质量偏低,机器之间负荷不均衡,导致要增加迭代次数或种群大小来达到最优解或近似最优解,这势必增加优化时间。

Kacem等提出利用分配时间表的AL(approach by localization)方法进行种群机器选择的初始化,取得了一定的成效。然而,记录所有工序加工机器的时间表在不断复制、更新时加大了资源的消耗,增加了算法的复杂性。搜索机制是在所有的备选机器中选择最小的,虽然效果上有明显改善,但是搜索时间过长。并且它需要设置变量参数,将P-FJSP转换为T-FJSP,增加了大量冗余信息。以之前的为例,转换为T-FJSP如下表所示,表中的9999代表当前工序不能在当前机器上加工。Ho和Tay等利用经典JSP问题中的规则,提出混合规则启发式机器排序初始化方法(composite dispatching rues,CDRs)。Ho N.B.(2005年)利用GP进行函数发现,形成更加复杂的组合规则,然而这些规则主要应用于工序排序的初始化,没有考虑机器选择问题。而对于FJSP,机器选择比工序排序要更为重要,如何能较好地考虑机器负荷平衡,是非常有意义的。

针对FJSP特点,结合以上方法的优点,下方是一种GLR机器选择方法,包括:全局选择(global selection GS)局部选择(local selection LS)和随机选择(radom selection RS).

GS和LS主要是为了考虑机器选择的负荷问题,使各台被选择的机器的工作负荷尽量平衡,充分提高机器的利用率。RS主要考虑尽量使初始种群分散地分布于整个解空间。通过三者的有机结合,提高初始解在机器选择部分中解的质量。下面分别介绍三种选择方法的具体执行步骤。

全局选择

设置一个数组,长度和机器数相等,数组的顺序依次对应加工机器的顺序,每一位上的值对应相应机器上的加工时间。随机在工件集中选择一个工件,从当前工件的第1道工序开始,将当前工序的可选加工机器的加工时间加上数组中对应的时间。从中选择最短的时间作为当前工序的加工机器,并且将数组更新,即把被选择的加工机器的加工时间加到数组中相应的位置上,以此类推,直到当前工件的所有工序的加工机器选择完毕后,然后再随机选择一个工件开始,直到所有工件的工序选择完毕为止。这样保证了最短加工机器先被选到而且保证了加工机器上的工作负荷平衡。具体执行步骤如下。

步骤1设置一个整型数组,长度等于机器总数m,依次为机器号顺序,数组对应机器[M1,M2...Mm][M_1,M_2...M_m][M1​,M2​...Mm​]上的总负荷。同时初始化数组中每一个元素值为零。步骤2随机从工件集中选择一个工件,同时选择当前工件的第1道工序。步骤3将当前工序的可选加工机器集中的加工机器的加工时间和数组中相应机器位置的时间数值相加,但不更新数组。步骤4从相加后的时间值中,选择最小的那台机器作为当前工序的加工机器,将被选的机器在可选机器集中的顺序号设置为MS部分相应基因位的值。步骤5将当前被选择的加工机器的加工时间加到数组中相应位置机器的加工负荷中,同时更新数组作为下一次选择的依据。步骤6选择当前工件的下一道工序,重复执行步骤3到步骤5,直到当前工件的所有工序的加工机器选择完毕为止。步骤7从工件集中除去已被选择的工件,从剩下的工件集中随机选择一个工件,同时选择当前工件的第1道工序,重复执行步骤3到步骤6,直到工件集中的所有工件被选择完毕为止.

以前例来说,假设第一次随机选择到的加工工件是工件J1J_1J1​,第二次选择工件J2J_2J2​,则前四道工序的执行过程如下图所示。

局部选择

局部选择同全局选择原理上基本一致,但是每次对一个工件选择完毕时,数组需要重新设置为零,不存在随机选择工件。设置一个数组,长度和机器数相等,选择工件集中第1个工件,选择当前工件的第1道工序开始,将当前工序的可选加工机器的加工时间加上数组中对应的时间。从中选择最短的时间作为当前工序的加工机器,并且将数组更新,即把被选择的加工机器的加工时间加到数组中相应的位置上,以此类推,直到当前工件的所有工序的加工机器选择完毕后,然后数组每一位重新设置为零,选择下一个工件,直到所有工件选择完毕为止。这样保证了一个工件的工序中优先加工时间最短或说选择机器负荷最小的加工机器进行加工。具体执行步骤如下

步骤1设置一个整型数组,长度等于机器总数m,依次为机器号顺序,数组对应机器[M1,M2,…,Mm]上的总负荷。同时初始化数组中每一个元素值为零。步骤2选择工件集中的第1个工件,同时选择当前工件的第1道工序。步骤3将当前工序的可选加工机器集中的加工机器的加工时间和数组中相应机器位置的时间数值相加,但不更新数组。步骤4从相加后的时间值中,选择最小的那台机器作为当前工序的加工机器,将被选的机器在可选机器集中的顺序号设置为MS部分相应基因位的值。步骤5将当前被选择的加工机器的加工时间加到数组中相应位置机器的加工负荷中,同时更新数组作为下一次选择的依据。步骤6选择当前工件的下一道工序,重复执行步骤3到步骤5,直到当前工件的所有工序的加工机器选择完毕为止。步骤7将数组中的每一位元素的值重新设置为零。步骤8从工件集中除去已被选择的工件,选择工件集中下一个工件,同时选择当前工件的第一道工序,重复执行步骤3到步骤7,直到工件集中的所有工件被选择完毕为止。

以前例为示,依次选择工件J1J_1J1​和工件J2J_2J2​,那么工件J1J_1J1​的三道工序的加工机器的选择执行过程如下:

3.随机选择

为保证初始种群的多样性,初始种群应分散于解空间。一部分种群的机器选择部分采用随机初始化方法。RS与GS、LS的主要区别在于每一个基因位上的数字即表示工序可选机器集中的顺序号是随机产生的。具体执行步骤如下。

步骤1选择工件集中的第1个工件,同时选择当前工件的第1道工序。步骤2在[1,mjh][1,m_{jh}][1,mjh​]区间内随机产生一个数,即从当前工序的可选加工机器集中随机选择一个机器;同时将产生的随机数设置为MS染色体部分相应基因位的值。步骤3选择当前工件的下一道工序,执行步骤2,直到当前工件的所有工序的加工机器选择完毕为止。步骤4选择工件集中的下一个工件,重复执行步骤2到步骤3,直到工件集中的所有工件被选择完毕为止。

每个染色体的OS部分采用随机的方法生成。

交叉操作

交叉的目的是利用父代个体经过一定操作组合后产生新个体,在尽量降低有效模式被破坏的概率基础上对解空间进行高效搜索。交叉操作是主要的遗传操作,GA的性能在很大程度上依赖于所使用的交叉操作,它决定了GA的全局搜索能力。在设计交叉操作时必须满足可行性、特征的有效继承性、完全性和信息非冗余性等指标。特征的有效继承性保证父代中的优良信息能够保留到子代;信息非冗余性保证子代中不会产生过多无用信息,这两个特征在交叉操作设计中是两个重要的指标。GA中较常见的交叉操作有单点交叉(single point crossover,SPX)、多点交叉(multiple point crossover,MPX)、均匀交叉(uniform crossover,UX)、部分映射交叉(partially mapping crossover,PMX)、次序交叉(order crossover,OX)、线性次序交叉(linear order crossover,LOX)、基于位置的交叉(position-based crossover,PX)、循环交叉(cycle crossover,CX)、基于工件顺序的交叉(job-based order crossover,JOX)和基于工件优先顺序的交叉(precedence preserving order-based crossover,POX)等。

1.机器选择部分

机器选择部分必须保证每位基因的先后顺序保持不变,采用均匀交叉操作。

步骤1在区间[1,To][1,T_o][1,To​]内随机产生一个整数r。步骤2按照随机数r再随机产生r个互不相等的整数。步骤3依照步骤2中产生的整数r,将父代染色体P1P_1P1​和P2P_2P2​中对应位置的基因复制到子代染色体C1C_1C1​和C2C_2C2​中,保持它们的位置和顺序。步骤4将P1P_1P1​和P2P_2P2​余下的基因依次复制到C2C_2C2​和C1C_1C1​中,保持它们的位置和顺序。如下图所示,以前表例。随机产生2个位置,将P1P_1P1​中灰色部分复制到C1C_1C1​中,然后将P2P_2P2​白色部分复制到C1C_1C1​中,而产生新的个体。

2.工序排序问题

改进KacemKacemKacem()中的POX交叉方法,每个染色体中对多个工件进行操作,能够较好地继承父代个体的优良特征。

步骤1将工件集{J1,J2...Jn}\{J_1,J_2...J_n\}{J1​,J2​...Jn​}随机划分为两个工件集Jobset1和Jobset2。步骤2复制父代染色体P1P_1P1​和P2P_2P2​中包含在工件集Jobset1/Jobset2中的工件到C1/C2C_1/C_2C1​/C2​,保持它们的位置和顺序。步骤3将P1和P2中不包含在工件集Jobset1/Jobset2中的工件复制到C2/C1C_2/C_1C2​/C1​,保持它们的顺序。

如上图b所示,含有5个工件。其中一个工件集中包含工件J1J_1J1​和工件J3J_3J3​,将P1P_1P1​中包含工件J1,J3(1、3)J_1,J_3 (1、3)J1​,J3​(1、3)的灰色部分复制到C1中,然后将P2中去掉工件J1,J3(1、3)J_1,J_3 (1、3)J1​,J3​(1、3),将剩下的白色部分复制到C1C_1C1​中,而产生新的个体。

变异操作

变异操作通过随机改变染色体的某些基因对染色体进行较小扰动来生成新的个体,增加种群多样性,并在一定程度上影响着GA的局部搜索能力。对于经典传统的JSP,采用置换编码时较常用的变异操作有互换变异、逆序变异、插入变异和基于邻域搜索变异等操作,如下图示。下图变异操作对于机器选择部分,为保证能够较好地保持优良个体的信息和机器顺序不被破坏,上述几种方法都不适合。本书结合FJSP特点,设计变异方法如下。

步骤1在变异染色体中随机选择r个位置。步骤2依次选择每一个位置,对每一个位置的机器设置为当前工序可选机器集中加工时间最短的机器

对于工序排序部分,采用基于邻域搜索变异操作。在变异染色体MS部分不变的情况下,本书采用基于邻域搜索变异方法,可以更好地通过局部范围内的搜索找到适合MS的工序排序,改善子代性能。步骤如下。

步骤1在变异染色体中随机选择r个不同基因,并生成其排序的所有邻域。步骤2评价所有邻域的适应值,选出最佳个体作为子代。

选择操作

选择操作的作用是使高性能的个体能以更高的概率生存,避免有效基因的损失,同时保持种群大小恒定,从而加快全局收敛性和提高计算效率。较为常用的方法有轮盘赌(roulette wheel selection)、排序选择(rank-based selection)、种子选择(seed selection )和锦标赛选择(tournament selection)等。锦标赛选择方法如下图所示。每次从种群中选择k个个体进行适应度比较,将适应度较高的个体插入到交叉池中,如此循环,直到填满交叉池为止。Goldberg和Deb在1991年已证明,锦标赛选择相对于其他选择算子有更好的或相当的收敛性和计算复杂性。

改进遗传算法的求解步骤

求解柔性作业车间调度问题比求解传统的作业车间调度问题更加复杂,需要为每道工序在可选机器集中选择一台机器并对每道工序进行排序。为了使进化过程中的优良个体更多地进入下一代,将交叉后的新个体和原有个体进行比较选择出最优个体。结合改进的MSOS染色体编码方案和提出的GLR初始化方法.

步骤1参数设置。包括种群规模P、迭代次数G、GS占种群比例PRSP_{RS}PRS​、LS占种群比例PLSP_{LS}PLS​、RS占种群比例PRSP_{RS}PRS​、交叉概率PcP_cPc​、变异概率PmP_mPm​等。步骤2按照GS、LS和RS各自的比例,利用提出的初始化方法对种群进行初始化,产生质量较好的初始种群。步骤3评价种群中每个染色体个体的适应度值即目标值,如果满足结束条件则输出最优解或近似最优解,并且结束运行;否则执行步骤4。步骤4执行锦标赛选择操作,选取下一代种群。步骤5对种群中满足交叉概率的染色体个体按照交叉策略进行交叉。步骤6对交叉得到的种群中满足变异概率的染色体个体按照变异策略进行变异,得到新一代种群。步骤7返回步骤3。

终止条件一般是个体适应度值评价时的目标值已达到设定的目标值,或迭代的次数超过了设定的迭代次数,或算法计算时间已经超过设定的计算时间等.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。