【车间调度】基于matlab改进的蛙跳算法求解车间调度问题【含Matlab源码 073期】
一、车间调度简介
1 车间调度定义
车间调度是指根据产品制造的合理需求分配加工车间顺序,从而达到合理利用产品制造资源、提高企业经济效益的目的。车间调度问题从数学上可以描述为有n个待加工的零件要在m台机器上加工。问题需要满足的条件包括每个零件的各道工序使用每台机器不多于1次,每个零件都按照一定的顺序进行加工。
2 传统作业车间调度
传统作业车间带调度实例
有若干工件,每个工件有若干工序,有多个加工机器,但是每道工序只能在一台机器上加工。对应到上面表格中的实例就是,两个工件,工件J1有三道工序,工序Q11只能在M3上加工,加工时间是5小时。
约束是对于一个工件来说,工序的相对顺序不能变。O11->O12->O13。每时刻,每个工件只能在一台机器上加工;每个机器上只能有一个工件。
调度的任务则是安排出工序的加工顺序,加工顺序确定了,因为每道工序只有一台机器可用,加工的机器也就确定了。
调度的目的是总的完工时间最短(也可以是其他目标)。举个例子,比如确定了O21->O22->O11->O23->O12->O13的加工顺序之后,我们就可以根据加工机器的约束,计算出总的加工时间。
M2加工O21消耗6小时,工件J2当前加工时间6小时。
M1加工O22消耗9小时,工件J2当前加工时间6+9=15小时。
M3加工O11消耗5小时,工件J1当前加工时间5小时。
M4加工O23消耗7小时,工件J2加工时间15+7=22小时。
M1加工O12消耗11小时,但是要等M1加工完O22之后才开始加工O12,所以工件J1的当前加工时间为max(5,9)+11=20小时。
M5加工O13消耗8小时,工件J2加工时间20+8=28小时。
总的完工时间就是max(22,28)=28小时。
2 柔性作业车间调度
柔性作业车间带调度实例(参考自高亮老师论文
《改进遗传算法求解柔性作业车间调度问题》——机械工程学报)
相比于传统作业车间调度,柔性作业车间调度放宽了对加工机器的约束,更符合现实生产情况,每个工序可选加工机器变成了多个,可以由多个加工机器中的一个加工。比如上表中的实例,J1的O12工序可以选择M2和M4加工,加工时间分别是8小时和4小时,但是并不一定选择M4加工,最后得出来的总的完工时间就更短,所以,需要调度算法求解优化。
相比于传统作业车间,柔性车间作业调度的调度任务不仅要确定工序的加工顺序,而且需要确定每道工序的机器分配。比如,确定了O21->O22->O11->O23->O12->O13的加工顺序,我们并不能相应工序的加工机器,所以还应该确定对应的[M1、M3、M5]->[M1、M2、M3]->[M1、M2、M3、M4、M5]->[M2、M3、M4、M5]->[M2、M4]->[M1、M3、M4、M5]的机器组合。调度的目的还是总的完工时间最短(也可以是其他目标,比如机器最大负荷最短、总的机器负荷最短)
二、蛙跳算法简介
1 蛙跳算法定义
蛙跳算法(SFLA)是一种全新的后启发式群体进化算法,具有高效的计算性能和优良的全局搜索能力。对混合蛙跳算法的基本原理进行了阐述,针对算法局部更新策略引起的更新操作前后个体空间位置变化较大,降低收敛速度这一问题,提出了一种基于阈值选择策略的改进蛙跳算法。通过不满足阈值条件的个体分量不予更新的策略,减小了个体空间差异,从而改善了算法的性能。数值实验证明了该改进算法的有效性,并对改进算法的阈值参数进行了率定。
2 蛙跳算法特点
SFLA由Eusuff和Lansey为解决组合优化问题于2003年最先提出。作为一种新型的仿生物学智能优化算法,SFLA 结合了基于模因(meme)进化的模因演算法(MA,memeticalgorithm)和基于群体行为的粒子群算法(PSO,particle swarm optimization)2 种群智能优化算法的优点。该算法具有概念简单,调整的参数少,计算速度快,全局搜索寻优能力强,易于实现的特点。混合蛙跳算法主要应用于解决多目标优化问题,例如水资源分配、桥墩维修、车间作业流程安排等工程实际应用问题。
3 蛙跳算法原理
蛙跳算法的思想是:在一片湿地中生活着一群青蛙。湿地内离散的分布着许多石头,青蛙通过寻找不同的石头进行跳跃去找到食物较多的地方。每只青蛙个体之间通过文化的交流实现信息的交换。每只青蛙都具有自己的文化。每只青蛙的文化被定义为问题的一个解。湿地的整个青蛙群体被分为不同的子群体,每个子群体有着自己的文化,执行局部搜索策略。在子群体中的每个个体有着自己的文化,并且影响着其他个体,也受其他个体的影响,并随着子群体的进化而进化。当子群体进化到一定阶段以后,各个子群体之间再进行思想的交流(全局信息交换)实现子群体间的混合运算,一直到所设置的条件满足为止。
4 蛙跳算法数学模型
算法参数
与其他优化算法一样,SFLA亦具有一些必要的计算参数,包括F:蛙群的数量;m:族群的数量;n:族群中青蛙的数量;Smax:最大允许跳动步长;Px:全局最好解;Pb:局部最好解;Pw:局部最差解;q:子族群中蛙的数量;LS:局部元进化次数以及SF:全局思想交流次数等。
更新策略
对于青蛙群体,具有全局最好适应度的解表示为 U g;对于每一个子族群,具有最好适应度的解表示为 UB,最差适应度的解表示为 UW。首先对每个子族群进行局部搜索,即对子族群中最差适应度的青蛙个体进行更新操作,更新策略为
青蛙更新距离 Ds=rand()*(Pb-Pw) (1)
更新后的青蛙 newDw=oldPw+Ds(-Dmax≦Ds≦Dmax) (2)
其中, Ds 表示青蛙个体的调整矢量, Dmax表示青蛙个体允许改变的最大步长。如设 Uw=[1 3 5 4 2], UB=[2 1 5 3 4],允许改变的最大步长 Dmax =3,若rand=0.5 ,则 U q(1) =1+min{int[0.5 × (2−1)],3}=1; U q(2) =3+max{int[0.5×(1−3)], −3}=2;依此相同的操作完成更新策略后可得到一个新解 U q=[1 2 5 4 3].
5 蛙跳算法本段过程
全局搜索过程
步骤l 初始化。确定蛙群的数量、种群以及每个种群的青蛙数。
步骤2 随机产生初始蛙群,计算各个蛙的适应值。
步骤3 按适应值大小进行降序排序并记录最好解Px,并且将蛙群分成族群。把F个蛙分配到m个族群Y,Y,Y…,Y中去,每个族群包含n个蛙,从而使得Yk=[X(j),f(j)|X(j)=X(k+m*(j-1), f(j)=f(k+m*(j-1),j=1,…,n,k=1,…,m].这里X(j)表示蛙群中的第j蛙,f(j)表示第j个蛙的目标函数值。
步骤4根据SFLA算法公式,在每个族群中进行元进化。
步骤5将各个族群进行混合。在每个族群都进行过一轮元进化之后,将各个族群中的蛙重新进行排序和族群划分并记录全局最好解Px。
步骤6检验计算停止条件。如果满足了算法收敛条件,则停止算法执行过程,否则转到步骤3。通常而言,如果算法在连续几个全局思想交流以后,最好解没有得到明显改进则停止算法。某些情况下,最大函数评价次数也可以作为算法的停止准则。
局部搜索过程
局部搜索过程是对上述步骤4的进一步展开,具体过程
如下:
步骤4—1设im=O,这里im是族群的计数器。用来与族群总数m进行比较。设iN=0,这里iN是局部进化的计数器,用来与Ls进行比较。
步骤4-2根据式(1)在第l,,1个族群中选择q个蛙进入子族群,确定Pb和Pw并设im=im+1。
步骤4-3设iN=iN+1。
步骤4—4根据式(2)和式(3)改进子族群中的最差蛙的位置。
步骤4—5如果步骤4—4改进了最差蛙的位置(解),就用新产生的位置取代最差蛙的位置。否则就采用Px代替式(2)中的PB,重新更新最差蛙的位置。
步骤4—6如果步骤4-5没有改进最差蛙的位置,则随机产生一个处于湿地中任何位置的蛙来替代最差的蛙。
步骤4—7如果iN<LS,则转到步骤4-3。
步骤4—8如果im<m,则转到步骤4-2,否则转到全局搜索过程的步骤5。
算法停止条件
SFLA通常采用两种策略来控制算法的执行时间:
1)在最近的K次全局思想交流过程之后,全局最好解没有得到明显的改进;
2)算法预先定义的函数评价次数已经达到。
3)已有标准测试结果。
无论哪个停止条件得到满足,算法都要被强制退出整个循环搜索过程。
三、部分源代码
clc
clear all
close all
%--------------------------------------------------------------------------
% 问题: N个工件,M台机器的确定型流水车间调度问题
% 工件数N=20,机器数M=10时,有限次数的最优解 fval=14.9263,
% x = [16 4 18 15 12 11 2 1 6 7 3 5 20 ...
% 10 8 14 13 19 17 9]
N = 20 % 工件数(解矢量长度)
M = 10 % 机器数
rand('state',N+M); % 固定时间矩阵
T = rand(M,N); % 产生时间矩阵,行数M1为机器数,列数N为工件数
rand('state',sum(100*clock)); % 种子恢复随机
%--------------------------------------------------------------------------
% 必需参数
popsize = 50; % 种群规模
maxgen = 50; % 最大进化代数
method = 4 % 方法选择,1 - 伪并行小生境自适应遗传算法(PPNSA)
% 2 - 混合蛙跳算法+变异算子(SFLA+MO)
% 3 - 批处理蛙跳算法(BFLA),为SFLA的改进算法
% 4 - PPNSA+扰动算子(末选算法,收敛速度中,较易跳出局部极小)
% 5 - SFLA+MO+扰动算子(次选算法,收敛速度快,最易陷入局部极小)
% 6 - BFLA+扰动算子(首选算法,收敛速度中,可能陷入局部极小)
type = 1; % 初始化方式,1 - 随机初始化(缺省设置)
% 2 - 启发式初始化
%--------------------------------------------------------------------------
% 函数调用
[X,fval,F] = SFLA(T,popsize,maxgen,method,type);
% 混合蛙跳算法(Shuffled Frog-Leaping Alogrihtm,SFLA)
% 输入参数:
% T - 时间矩阵
% popsize - 种群规模
% maxgen - 最大进化代数
% method - 方法选择,1 - 伪并行小生境自适应遗传算法(PPNSA)
% 2 - 混合蛙跳算法+变异算子(SFLA+MO)
% 3 - 批处理蛙跳算法(BFLA),为SFLA的改进算法
% 4 - PPNSA+扰动算子(末选算法,收敛速度中,较易跳出局部极小)
% 5 - SFLA+MO+扰动算子(次选算法,收敛速度快,最易陷入局部极小)
% 6 - BFLA+扰动算子(首选算法,收敛速度中,可能陷入局部极小)
% type - 初始化方式,1 - 随机初始化(缺省设置)
% 2 - 启发式初始化
% 输出参数:
% X - 最优适应度对应的解
% fval - 最优适应度值
% F - 最优,平均,最差适应度
%--------------------------------------------------------------------------
% 结果作图
figure(1)
FigSche(X,T);
figure(2);
plot(1:maxgen,F,'.-'); grid on;
legend('最优','平均','最差',3);
xlabel('进化代数'); ylabel('适应度');
set(gcf,'position',[700 200 500 400])
set(gca,'XLim',[1 maxgen]);
title(['工件数:',num2str(N),' 机器数:',num2str(M),', 最优值:',num2str(fval)]);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
四、运行结果
五、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.
文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。
原文链接:qq912100926.blog.csdn.net/article/details/113089730
- 点赞
- 收藏
- 关注作者
评论(0)