遗传算法求解jsp的一种编码方式
JSP调度的遗传算法编码可归纳为直接编码和间接编码两种。
●直接编码将各调度作为状态,通过状态演化达到寻优目的,主要包括基于操作的编码、基于工件的编码、基于工件对关系的编码、基于完成时间的编码、随机键编码等。
●间接编码将一组工件的分配处理规则作为状态,算法优化的结果是一组最佳的分配规则序列,再由分配规则序列构造调度,主要包括基于优先权规则的编码、基于先后表的编码、基于析取图的编码和基于机器的编码等。
下面以一个为例对上述各种编码进行介绍。该问题的加工时间和工艺约束见表3.3.1。以下约定n为工件数,m为机器数。
JSP调度的遗传算法编码方式很多,我们这里就选择基于操作的编码:
基于操作的编码(operation based representation)方式将每个染色体用nXm个代表操作的基因组成,是所有操作的一个排列,其中各工件号均出现m次。解码过程是:先将染色体转化为一个有序的操作表,然后基于该表和工艺约束对各操作以最早允许加工时间逐一进行加工,从而产生调度方案。显然,这种解码过程可产生活动调度。
对于上述例子,假设染色体为[2 1 1 1 2 2 3 3 3],表
为工件i的第j个操作在第m台机器上加工,则对照机器加工顺序的工艺约束,该染色体对应的有序操作表为
,进而相应的调度如图3.3.1所示。
该编码方式的特点可归纳为:半Lamarkian性;1类解码复杂性;任意基因串的置换排列均能表示可行调度(但为保证后代的可行性,遗传操作需特殊设计);nX m标准长度。
Matlab生成JSP的GA编码
代码实现:
%算法主程序,生成GA编码方式的实现
%如果一个变量名末尾带分号结果就不会显示出来,需要将分号去掉,function后的函数不需要分号,其余中间语句需要加分号
%我们运行这个程序,执行chromes = createChromes(3,4,6),那么就调用function chromes = createChromes(jobQty,machQty,pop)
%然后进行初始化赋值 chromes = zeros(pop,jobQty*machQty),然后进行循环调用chrome =createChrome(jobQty,machQty)这个函数
function GA4JSP203()
chromes = createChromes(3,4,6) %生成一个种群的染色体
%chrome = createChrome(3,4) 此函数用来测试生成一行染色体
end
%根据种群数量、作业数量、设备数量生成初始种群
function chromes = createChromes(jobQty,machQty,pop)
chromes = zeros(pop,jobQty*machQty); %生成pop行,jobQty*machQty列的0,每一行就代表一个染色体的解;zeros(2,4)就是生成2行4列的0
for i = 1:pop
chromes(i,:) = createChrome(jobQty,machQty); %对应行的对应列都是由createChrome生成进行赋值,生成染色体的群体,该函数需要引用下面的function createChrome()
end
end
%生成编码:传两个参数【1】jobQty,【2】machQty
function chrome = createChrome(jobQty,machQty)
a = 1:jobQty; %如jobQty=3,则a=1 2 3
chrome = a; %chrome=1 2 3
for i= 2:machQty %进入循环,如machQty=4,则从i=2开始,i=2时chrome=[1 2 3 1 2 3],i=3时chrome=[1 2 3 1 2 3 1 2 3],i=4时chrome=[1 2 3 1 2 3 1 2 3 1 2 3]
chrome = [chrome a];
end
%将编码乱序排列-生成作业码的乱序
b = randperm(jobQty*machQty); %如jobQty=3,machQty=4,则b=(1-12的乱序排列)
chrome = chrome(b); %将上一步得到的顺序染色体按乱序取值
end
运行的结果是随机的,其中一种是如下图: