车间调度|基于帝王蝶优化算法的车间调度(Matlab代码实现)

目录

1 概述

2 蝴蝶优化算法

3 车间调度

3.1 车间调度描述

3.2 数学模型 

4 Matlab代码实现

 5 运行结果

6 参考文献 

 7 写在最后


1 概述

随着智能化在制造业中的普及,解决车间生产调度的问题能有效提高车间的工作学习效率,实现车间现场管理的有序化、智能化和高效化。为了合理地协调控制各个机器的生产以实现多方面目标的 pareto最优状态,学者们经过多年的研究,使用各种不同的方法来分析和解决生产环节的FJSP。
随着研究的逐渐深入,为了更贴近车间生产现场的工作状态,人们将柔性车间这一概念与车间调度问题相融合并提出了FJSP。由于FJSP问题在生产中广泛存在,因此,该问题引起了国内外相关学者的广泛关注与研究"5'。IshibuchiH使用遗传算法求解FJSP问题,但算法的有效性较低l6'。Deng Q W使用NSGA-II算法并考虑分两阶段对多目标FJSP进行求解,并通过一些常用的函数验证算法的准确性。Kaya S 导人入lI新管法的思想解决以完工分析了多目例上S是小和瓶颈工序负荷最小为目时间最大、机器负荷最小和瓶颈工序负荷最小为目标的FJSP问题。

2 蝴蝶优化算法

基于帝王蝶算法MBO求解最优目标(Matlab完整代码实现)

3 车间调度

3.1 车间调度描述

作业车间调度是根据实际车间有限的可用资源和已定的生产计划,在满足工艺约束的基础上合理安排生产路线,均衡生产负荷,完成生产计划的同时实现某种既定目标的问题。FJSP是为了解决作业车间调度如何才能与多台并行机相结合而提出的,主要涉及以下两个问题:
(1)按什么顺序加工工件。

(2)如何合理地分配机器。
FJSP已被证明是更复杂的NP-hard问题,本文的FJSP问题主要是基于解决以上2个问题,并结合车间的实际生产为了达到完成时间最短和总流程时间最短的目标求出的pareto最优解。
FJSP可以用以下例子来描述:设车间有m台机器,需要加工n个工件,每台机器表示为M,
M,。每个工件表示为N, N2,…., Nn。每个工件在机器上一次性完成的工艺过程叫工序,O_{ij}表示工件i的第j道工序。最终的目标是使完成这批工件所用的时间最短和消耗的能源最少。相关的约束条件有:
( 1)一台机器在某一时刻只加工一个工件。

(2)每个工件加工生产的工序相同,工序的加工顺序相同,根据算例的不同,不同工件在不同机器上加工消耗的时间不同。
(3)相同工件在某一时刻不能被不同的两台机器加工。
( 4)工件在加工过程中不能更换机器加工。经典的FJSP 如下所示。以5台机器加工3个工件,每个工件有3个加工工序的情况为例,加工的时间表如表1所示。

3.2 数学模型 

车间调度|基于帝王蝶优化算法的车间调度(Matlab代码实现)_第1张图片

4 Matlab代码实现

本文仅展现部分代码,全部代码见:

车间调度|基于帝王蝶优化算法的车间调度(Matlab代码实现)

clc;clear
%% 下载数据
% 加工数据包括加工时间,加工机器,机器数,各机器权重,工件数,各工件对应的工序数
load data operation_time operation_machine num_machine machine_weight num_job num_op

%% 基本参数
MAXGEN=200;             % 最大迭代次数
sizepop=201;            % 种群规模
e=0.5;                  % 目标值权重
N_size=30;              % 邻域解数量
S_size=15;              % 共享解数量
G=5;                    % 巡回次数
G1=20;                  % 竞争机制1参数
G2=10;                  % 竞争机制2参数
trace=zeros(2,MAXGEN);
chrom_best=[];

%% ===========================种群初始化============================
total_op_num=sum(num_op);
chroms=initialization(num_op,num_job,total_op_num,sizepop,operation_machine,operation_time);
[Z,~,~,~,~]=fitness(chroms,num_machine,e,num_job,num_op);
% 将最好的解划分为领飞鸟
[Z_leader,ind]=min(Z);
leader=chroms(ind,:); 
% 从chroms中移出领飞鸟,然后划分左右两个跟飞鸟种群
chroms(ind,:)=[];
Z(ind)=[];
sp=(sizepop-1)/2;
lefts=chroms(1:sp,:);
Z_left=Z(1:sp);
rights=chroms(sp+1:end,:);
Z_right=Z(sp+1:end);

%% ============================迭代过程=============================
for gen=1:MAXGEN
    fprintf('当前迭代次数:'),disp(gen)
    %% 巡回阶段
    for i=1:G
        %% 领飞鸟进化
        [leader,Z_leader,share,Z_share]=bird_evolution(leader,Z_leader,[],[],...
            N_size,S_size,total_op_num,num_machine,e,num_job,num_op);
        %% 跟飞鸟进化
        % 初始化左右队列的共享解集
        share_left=share;
        Z_share_left=Z_share;
        share_right=share;
        Z_share_right=Z_share;
        for j=1:sp
            % 左队列
            [lefts(j,:),Z_left(j),share_left,Z_share_left]=bird_evolution(lefts(j,:),Z_left(j),share_left,Z_share_left,...
                N_size-S_size,S_size,total_op_num,num_machine,e,num_job,num_op);
            % 右队列
            [rights(j,:),Z_right(j),share_right,Z_share_right]=bird_evolution(rights(j,:),Z_right(j),share_right,Z_share_right,...
                N_size-S_size,S_size,total_op_num,num_machine,e,num_job,num_op);
        end
        %% 竞争机制2:队间交叉
        % 随机产生G2对位置相同的个体
        ind=randperm(sp,G2);
        [rights(ind,:),Z_right(ind),lefts(ind,:),Z_left(ind)]= crossover(lefts(ind,:),rights(ind,:),...
            Z_left(ind),Z_right(ind),total_op_num,num_machine,e,num_job,num_op);
    end
    %% 竞争机制1:队内竞争
    ind=randperm(sp,G1);
    % 左队列
    [~,ind1]=sort(Z_left(ind));
    lefts(ind,:)=lefts(ind(ind1),:);
    Z_left(ind)=Z_left(ind(ind1));
    % 右队列
    [~,ind2]=sort(Z_right(ind));
    rights(ind,:)=rights(ind(ind2),:);
    Z_right(ind)=Z_right(ind(ind2));
    %% 领飞鸟替换
    if rand<0.5
        % 选择左队列首只跟飞鸟
        [leader,Z_leader,lefts,Z_left]=update_leader(leader,Z_leader,lefts,Z_left);
    else
        % 选择右队列首只跟飞鸟
        [leader,Z_leader,rights,Z_right]=update_leader(leader,Z_leader,rights,Z_right);
    end
    %% 记录相关数据
    % 记录每代的最优适应度与平均适应度
    Z=[Z_leader,Z_left,Z_right];
    [val,ind]=min(Z);
    trace(1,gen)=val;
    trace(2,gen)=mean(Z);
    % 更新全局最优适应度
    if gen==1 || MinVal>trace(1,gen)
        MinVal=trace(1,gen);
    end
end

%% ============================输出结果=============================
%% 输出最优适应度
fprintf('最优适应度:'),disp(MinVal)
%% 绘制最优适应度与平均适应度的迭代曲线图
figure(1)
plot(trace(1,:));
hold on;
plot(trace(2,:),'-.');grid;
legend('解的变化','种群均值的变化');
%% 绘制全局最优解的甘特图
[Z,~,~,machine_time,Pvals]=fitness(leader,num_machine,e,num_job,num_op);
Pval1=Pvals{1,1};
figure(2);
for i=1:total_op_num
    mText=leader(total_op_num+i);
    b=leader(i);
    x1=Pval1(1,i);
    x2=Pval1(2,i); 
    y1=mText-0.2;
    y2=mText;
    hold on; 
    fill([x1,x2,x2,x1],[y1,y1,y2,y2],[1-1/b,1/b,b/num_job]);
    text((x1+x2)/2,mText-0.1,num2str(b));
end

 5 运行结果

车间调度|基于帝王蝶优化算法的车间调度(Matlab代码实现)_第2张图片

车间调度|基于帝王蝶优化算法的车间调度(Matlab代码实现)_第3张图片 车间调度|基于帝王蝶优化算法的车间调度(Matlab代码实现)_第4张图片

6 参考文献 

[1]杨红雄,王惠酩.麻雀搜索算法解决柔性作业车间调度问题[J].制造技术与机床,2022(7):158-164

[2]郑洪清,冯文健,周永权.融合正弦余弦算法的蝴蝶优化算法[J].广西科学,2021,28(2):152-159

 7 写在最后

部分理论引用网络文献,如有侵权请联系删除。

你可能感兴趣的:(#,#,matlab,算法,开发语言,车间调度)