典型JSP车间调度问题学习4

本文探讨了遗传算法在解决Job Shop Scheduling Problem (JSP) 中的编码方式,包括直接编码和间接编码。直接编码如基于操作的编码,将每个染色体表示为一系列操作,通过解码产生调度方案。间接编码则关注处理规则的优化。在Matlab中,通过创建和打乱编码来生成初始种群,以实现遗传算法的求解过程。该方法能够生成多种可能的调度方案,适用于复杂的JSP问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遗传算法求解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编码

  Step1:决定编码的长度和内容 长度 =n*m ,内容 =1 2 …… n 这些数值出现 m 次,一维数 组;对应的函数:createChrome(jobQty,machQty)
Step2:将有规律的编码乱序排列,使用 randperm 函数
Step3:根据输入的参数 pop 来生成多个编码,形成算法的初始种群,结果:二维数组,每行表示一个编码【一个可行解】,如上面提到的染色体为[ 2 1 1 1 2 2 3 3 3 ]就对应为一种可行解,见图3.3.1 ,列为 step1 生成随机编码,对应的函数: createChromes(jobQty,machQty,pop)  

 代码实现:

%算法主程序,生成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

 运行的结果是随机的,其中一种是如下图:

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值