基于灰狼优化算法求解柔性作业车间问题matlab

本文介绍了柔性车间作业调度(FJSP)的复杂性,探讨了常见的解决方法,特别是GWO(灰狼优化算法)在处理FJSP问题上的优势。通过优化初始种群和解码机制,研究展示了GWO在解决离散组合优化问题如FJSP中的可行性。
摘要由CSDN通过智能技术生成

1 简介

柔性车间作业调度(Flexible Jobshop Scheduling Problem,简称FJSP),属于一个典型的NP难问题。解决作业车间调度问题的方法主要有以下四类:1)运筹学方法,包括整数规划,分支定界方法等;2)启发式规则;3)神经网络方法;4)元启发式算法。有很多知名的智能优化算法都已经成功应用FJSP领域,如蚁群算法、遗传算法、模拟退火算法和粒子群算法等。由NFL[1]定理可知,这个定理在逻辑上证明了没有哪种元启发式最适合解决所有的优化问题。这个领域每年都会提出新的元启发式算法。

GWO是一种基于群体的元启发式算法,它设定每个狼群都有层次结构,狼群中的每只狼都有特定的角色。Mirjalili在文献[2]中,通过对29个连续函数优化问题的测试,结果表明GWO在求解精度和稳定性上要明显优于PSO、DE和GSA等算法。GWO中所有候选狼(解决方案)都被最好的三只狼所吸引,从而更快地聚集到这些好狼位置周围。灰狼算法多用于解决连续函数问题的研究,在FJSP这类非常复杂的离散组合优化问题应用还比较少,本文针对经典的FJSP的特点,通过优化初始种群,采用新的解码机制,证明灰狼算法可以求解FJSP问题。

2 部分代码

%该程序用于解决柔性作业车间调度,m个工件,n道工序,其中n为最大工序数,工件的工序
%数可以少于n,加工机器数为M,每个工件的每道工序具有多个机器可以选择,对应的时间
%不同,其中初始种群的储存方式采用cell数据类型
%Version:1.3
%fileDescription:调度机器可选的柔性作业车间问题,甘特图已完善,GWO,8*8实例
%last edit time:2019-6-7
function GWO_Model_FJSP_1_3_8_8()
count = 600;     %迭代次数
N = 50;          %种群规模
m = 8;             %工件数
n = 4;             %工序数
M = 8;             %机器数
a =2;              %计算A/C协同系数的
plotif = 1;        %控制程序是否进行绘图
s = input(m,n);    %数据输入
[p,TN] = initial_p(m,n,N,s,M);    %生成初始种群50,采用细胞结构,每个元素为8*4
P = machine(n,M);
FIT = zeros(count,1);
aveFIT = zeros(count,1);
X1=randperm(count);       %收敛图形的横坐标X
X=sort(X1);
%------------------------输出最优解的时有用------------------------------
best_fit = 1000;            %改变模型需要修改此参数
best_p = zeros(m,n);
best_TN = zeros(m,n);
Y1p = zeros(m,1);
Y2p = zeros(m,1);
Y3p = zeros(m,1);
minfit3 =  1000000000;
%-------------------------进行迭代--------------------------------------
for i = 1:count
  [fit,Y1,Y2,Y3] = object(p,TN,N,P,m,n);  
  [newp,newTN] = GWO(fit,p,TN,N,m,n,s,a);
   a = a-2/(count-1);        %a的值会线性下降
   if best_fit > min(fit)
      [best_p,best_TN,best_fit,Y1p,Y2p,Y3p]=best(best_fit,best_p,fit,best_TN,Y1p,Y2p,Y3p,p,TN,Y1,Y2,Y3);
   end
   p = newp;
   TN = newTN;
   minfit = min(fit);
   if minfit3>minfit
       minfit3 = minfit;
   end
   FIT(i) = minfit3;    %用于适应度函数的
   aveFIT(i) = mean(fit);      %用于适应度函数的
end
%------------------投射最佳方案数据--------------------------------------
 
   fprintf('最优解:%d\n',best_fit);
   fprintf('工序1 工序2 工序3 工序4\n');
   best_p
   fprintf('时间1 时间2 时间3 时间4\n');
   best_TN
%------------------------收敛曲线----------------------------------------
   if plotif == 1
   figure;
   plot(X,FIT,'r');
   hold on;
   plot(X,aveFIT,'b');
   title('收敛曲线');
   hold on;
   legend('最优解','平均值');
%-------------------------甘特图-----------------------------------------
figure;
w=0.5;       %横条宽度
set(gcf,'color','w');      %图的背景设为白色
for i = 1:m
   for j = 1:n
       color=[1,0.98,0.98;1,0.89,0.71;0.86,0.86,0.86;0.38,0.72,1;1,0,1;0,1,1;0,1,0.49;1,0.87,0.67;0.39,0.58,0.92;0.56,0.73,0.56];
       a = [Y1p(i,j),Y2p(i,j)];
       x=a(1,[1 1 2 2]);      %设置小图框四个点的x坐标
       y=Y3p(i,j)+[-w/2 w/2 w/2 -w/2];   %设置小图框四个点的y坐标
       color = [color(i,1),color(i,2),color(i,3)];
       p=patch('xdata',x,'ydata',y,'facecolor',color,'edgecolor','k');    %facecolor为填充颜色,edgecolor为图框颜色
           text(a(1,1)+0.5,Y3p(i,j),[num2str(i),'-',num2str(j)]);    %显示小图框里的数字位置和数值
   end
end
xlabel('加工时间/s');      %横坐标名称
ylabel('机器');            %纵坐标名称
title({[num2str(m),'*',num2str(M),'的一个最佳调度(最短完工时间为',num2str(best_fit),')']});      %图形名称
axis([0,best_fit+2,0,M+1]);         %x轴,y轴的范围
set(gca,'Box','on');       %显示图形边框
set(gca,'YTick',0:M+1);     %y轴的增长幅度
set(gca,'YTickLabel',{'';num2str((1:M)','M%d');''});  %显示机器号
hold on;
   end
%--------------------------输入数据---------------------------------
function s = input(m,n)      %输入数据
s = cell(m,n);
s{1,1}=[1 2 3 4 5 7 8;5 3 5 3 3 10 9];
s{1,2}=[1 3 4 5 6 7 8;10 5 8 3 9 9 6];
s{1,3}=[2 4 5 6 7 8;10 5 6 2 4 5];
s{1,4}=[0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0];
s{2,1}=[1 2 3 4 5 7;5 7 3 9 8 9];
s{2,2}=[2 3 4 5 6 7 8;8 5 2 6 7 10 9];
s{2,3}=[2 4 5 6 7 8;10 5 6 4 1 7];
s{2,4}=[1 2 3 4 5 6;10 8 9 6 4 7];

s{3,1}=[1 4 5 6 7 8;10 7 6 5 2 4];
s{3,2}=[2 3 4 5 6 7;10 6 4 8 9 10];
s{3,3}=[1 2 3 4 6 8;1 4 5 6 10 7];
s{3,4}=[0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0];
s{4,1}=[1 2 3 4 5 6 7 8;3 1 6 5 9 7 8 4];
s{4,2}=[1 2 3 4 5 6 7 8;12 11 7 8 10 5 6 9];
s{4,3}=[1 2 3 4 5 6 7 8;4 6 2 10 3 9 5 7];
s{4,4}=[0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0];
s{5,1}=[1 2 3 4 5 7;3 6 7 8 9 10];
s{5,2}=[1 3 4 5 6 7;10 7 4 9 8 6];
s{5,3}=[2 3 4 5 6 7;9 8 7 4 2 7];
s{5,4}=[1 2 4 5 6 7 8;11 9 6 7 5 3 6];

s{6,1}=[1 2 3 4 5 6 8;6 7 1 4 6 9 10];
s{6,2}=[1 3 4 5 6 7 8;11 9 9 9 7 6 4];
s{6,3}=[1 2 3 4 5 7;10 5 9 10 11 10];
s{6,4}=[0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0];
s{7,1}=[1 2 3 4 5 7;5 4 2 6 7 10];
s{7,2}=[2 4 5 6 7 8;9 9 11 9 10 5];
s{7,3}=[2 3 4 5 6 8;8 9 3 8 6 10];
s{7,4}=[0 0 0 0 0 0 0 0;0 0 0 0 0 0 0 0];
s{8,1}=[1 2 3 4 6 8;2 8 5 9 4 10];
s{8,2}=[1 2 3 4 5 7;7 4 7 8 9 10];
s{8,3}=[1 2 4 5 6 7 8;9 9 8 5 6 7 1];
s{8,4}=[1 3 4 5 6 7;9 3 7 1 5 8];  

3 仿真结果

 

 

本文介绍了使用Matlab实现多目标灰狼优化算法(Multi-Objective Grey Wolf Optimizer,MOGWO)来求解柔性作业车间调度问题(Flexible Job-Shop Scheduling Problem,FJSP)的方法。 1. 柔性作业车间调度问题 柔性作业车间调度问题是指在一台机器上,需要安排多个作业在多个工序上进行加工,每个作业需要在不同的工序上进行加工,每个工序需要一定的时间和资源,同时需要考虑不同的约束条件(如最早开始时间、最迟完成时间、作业间的优先关系等),目标是最小化完成所有作业的总时间或最小化机器的空闲时间。 2. 多目标灰狼优化算法 多目标灰狼优化算法是基于灰狼优化算法(Grey Wolf Optimizer,GWO)的多目标优化版本。该算法模拟了灰狼社会的行为,通过抓住“alpha”、“beta”和“delta”三个主导灰狼的行为来优化目标函数。多目标灰狼优化算法可以同时优化多个目标函数。 3. 求解柔性作业车间调度问题 求解柔性作业车间调度问题的过程可以分为以下几个步骤: (1)编写目标函数:将FJSP问题转化为目标函数,将多个目标函数合并成一个多目标函数。 (2)确定参数:确定算法的参数,如灰狼个数、最大迭代次数、交叉率等。 (3)初始化灰狼群体:根据问题的特性,初始化灰狼群体。 (4)灰狼优化过程:根据多目标灰狼优化算法,进行灰狼优化过程。 (5)结果分析:分析灰狼优化的结果,得到最优解。 4. Matlab实现 在Matlab中,可以使用以下代码实现MOGWO算法求解FJSP问题: % FJSP问题的目标函数 function f = FJSP(x) % x为决策变量,即作业的加工顺序 % 定义多个目标函数 f(1) = 计算完成所有作业的总时间 f(2) = 计算机器的空闲时间 % 将多个目标函数合并成一个多目标函数 f = [f(1) f(2)] end % MOGWO算法 function [bestx, bestf] = MOGWO(f, lb, ub, MaxIt, nPop, nObj, pCrossover, pMutation) % f为目标函数,lb和ub为决策变量的上下界,MaxIt为最大迭代次数,nPop为灰狼个数,nObj为目标函数个数,pCrossover和pMutation分别为交叉率和变异率 % 初始化灰狼群体 X = repmat(lb, nPop, 1) + rand(nPop, nObj).*(repmat(ub-lb, nPop, 1)); % 迭代优化过程 for it = 1:MaxIt % 计算适应度 F = zeros(nPop, nObj); for i = 1:nPop F(i,:) = f(X(i,:)); end % 更新最优解 [bestf, idx] = min(F); bestx = X(idx,:); % 更新灰狼位置 for i = 1:nPop % 计算灰狼位置 A = 2*rand(nObj,1)-1; C = 2*rand(nObj,1); D = abs(C.*bestx - X(i,:)); X1 = bestx - A.*D; % 交叉和变异 mask = rand(nObj,1) < pCrossover; X2 = X1; X2(~mask) = X(i,~mask); mask = rand(nObj,1) < pMutation; X3 = X2; X3(mask) = lb(mask) + rand(sum(mask),1).*(ub(mask)-lb(mask)); % 更新灰狼位置 X(i,:) = X3; end end end % 测试 % 假设有10个作业,每个作业需要在3个机器上进行加工 nJob = 10; nMachine = 3; % 初始化上下界 lb = zeros(1, nJob*nMachine); ub = ones(1, nJob*nMachine); % 假设最大迭代次数为100,灰狼个数为50,目标函数个数为2 MaxIt = 100; nPop = 50; nObj = 2; % 假设交叉率为0.8,变异率为0.3 pCrossover = 0.8; pMutation = 0.3; % 调用MOGWO算法求解FJSP问题 [bestx, bestf] = MOGWO(@FJSP, lb, ub, MaxIt, nPop, nObj, pCrossover, pMutation); % 输出结果 disp('Best Solution:'); disp(bestx); disp('Best Objective:'); disp(bestf);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扫地僧985

喜欢就支持一下,谢谢老板!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值