车间调度基于matlabnsga2算法求解车间调度问题含matlab源码893期(代码片段)

紫极神光 紫极神光     2022-12-28     781

关键词:

一、车间调度简介

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]的机器组合。调度的目的还是总的完工时间最短(也可以是其他目标,比如机器最大负荷最短、总的机器负荷最短)

3 NSGA2遗传算法的流程图

二、部分源代码


clc;
clear;
close all;

%% Problem Definition
load CastingData Jm T JmNumber DeliveryTime IntervalTime

CostFunction=@(x,Jm ,T ,JmNumber ,DeliveryTime, IntervalTime) MyCost(x,Jm ,T ,JmNumber ,DeliveryTime, IntervalTime);

nVar=3;

VarSize=[1 nVar];

VarMin=-4;
VarMax= 4;
pfmax=0.9;
pfmin=0.2;
VarRange=[VarMin VarMax];

%% NSGA-II Parameters

MaxIt=500;

nPop=50;

pCrossover=0.8;
nCrossover=round(pCrossover*nPop/2)*2;

pMutation=0.3;
nMutation=round(pMutation*nPop);

mu=0.3;

%% Initialization

tic;

% PNumber 铸件个数 MNumber  工序个数数组  每个工件对应的工序数量有可能不同
PNumber=size(Jm,1);  
trace=zeros(2, MaxIt);      %寻优结果的初始值
MNumber=[];
for i=1:size(Jm,1)
    sumTemp=0;
    for j=1:size(Jm,2)
        if(length(Jmi,j))>0
            sumTemp=sumTemp+1;
        end
    end
    MNumber=[MNumber,sumTemp];
end
WNumber=sum(MNumber);  %工序总个数
%% 初始化
Number=MNumber;
D=WNumber*2; %粒子群维度

empty_individual.Position=[];
empty_individual.Cost=[];
empty_individual.Rank=[];
empty_individual.CrowdingDistance=[];
empty_individual.DominatedCount=[];
empty_individual.DominationSet=[];
% 初始化种群
pop=repmat(empty_individual,nPop,1);

for i=1:nPop
    WPNumberTemp=Number;
    if i<nPop/2
        for j=1:WNumber
            %随机产成工序
            val=unidrnd(PNumber);
            while WPNumberTemp(val)==0
                val=unidrnd(PNumber);
            end
            %第一层代码表示工序
            pop(i).Position(j)=val; %随机初始化位置
            WPNumberTemp(val)=WPNumberTemp(val)-1;
            
            %2层代码表示机器
            TempT=Tval,MNumber(val)-WPNumberTemp(val);
            
            % 机器加工时间最少初始化
            %[~,minTimeIndex]=min(TempT);
            % 随机机器初始化
            mindex=unidrnd(length(TempT));
            %随机产成工序机器
           pop(i).Position(j+WNumber)=mindex;
        end
    else
        for j=1:WNumber
            %随机产成工序
            val=unidrnd(PNumber);
            while WPNumberTemp(val)==0
                val=unidrnd(PNumber);
            end
            %第一层代码表示工序
            pop(i).Position(j)=val; %随机初始化位置
            WPNumberTemp(val)=WPNumberTemp(val)-1;
            
            %2层代码表示机器
            TempT=Tval,MNumber(val)-WPNumberTemp(val);
            
            % 机器加工时间最少初始化
            [~,minTimeIndex]=min(TempT);
            % 随机机器初始化
            %mindex=unidrnd(length(TempT));
            %随机产成工序机器
           pop(i).Position(j+WNumber)=minTimeIndex;
        end
    end
end

for i=1:nPop
    pop(i).Cost=CostFunction(pop(i).Position,Jm ,T ,JmNumber ,DeliveryTime, IntervalTime);
end

% Non-dominated Sorting
[pop ,F]=NonDominatedSorting(pop);

% Calculate Crowding Distances
pop=CalcCrowdingDistance(pop,F);

%% NSGA-II Loop

for it=1:MaxIt
    
    % Crossover
    popc=repmat(empty_individual,nCrossover,1);
    pf=pfmax-(pfmax-pfmin)*it/MaxIt;
    for k=1:nCrossover
        
        i1=BinaryTournamentSelection(pop);
        i2=BinaryTournamentSelection(pop);
%         [popc(k,1).Position, popc(k,2).Position]=Crossover(pop(i1).Position,pop(i2).Position,VarRange);

        popc(k,1).Position= CrossParticle(pop(i1).Position,pop(i2).Position,Jm,pf);
        
        popc(k,1).Cost=CostFunction(popc(k,1).Position,Jm ,T ,JmNumber ,DeliveryTime, IntervalTime);
    end
    popc=popc(:);
    
    % Mutation
    popm=repmat(empty_individual,nMutation,1);
    for k=1:nMutation
        
        i=BinaryTournamentSelection(pop);
        
        if rand()<mu
             popm(k).Position=Swap(pop(i).Position,Jm);
             popm(k).Cost=CostFunction(popm(k).Position,Jm ,T ,JmNumber ,DeliveryTime, IntervalTime);
        else
             popm(k).Position=pop(i).Position;
             popm(k).Cost=pop(i).Cost;
        end
    end
    
    % Merge Pops
    pop=[pop
         popc
         popm];
    
    % Non-dominated Sorting
    [pop, F]=NonDominatedSorting(pop);
    
    % Calculate Crowding Distances
    pop=CalcCrowdingDistance(pop,F);
    
    % Sort Population
    pop=SortPopulation(pop);
    
    % Delete Extra Individuals
    pop=pop(1:nPop);
    
    % Non-dominated Sorting
    [pop, F]=NonDominatedSorting(pop);
    
    % Calculate Crowding Distances
    pop=CalcCrowdingDistance(pop,F);
    
    % Plot F1
    PF=pop(F1);
    PFCosts=[PF.Cost];
    popCosts=[pop.Cost];
    firstObj=popCosts(1,:);
    secondObj=popCosts(2,:);
    trace(1, it)=min(firstObj);       
    trace(2, it)=min(secondObj);
    
    % 画图
    fig=figure(1);
    set(fig,'NAME','NSGA-MultiObj');
    plot(PFCosts(1,:),PFCosts(2,:),'ro');
    xlabel('间隔时间拖时');
    ylabel('交货延期');
    % Show Iteration Information
    disp(['Iteraion ' num2str(it) ': Number of F1 Members = ' num2str(numel(PF))]);
end

三、运行结果



四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

车间调度基于matlab遗传算法求解车间调度问题含matlab源码1396期(代码片段)

一、车间调度简介1车间调度定义车间调度是指根据产品制造的合理需求分配加工车间顺序,从而达到合理利用产品制造资源、提高企业经济效益的目的。车间调度问题从数学上可以描述为有n个待加工的零件要在m台机器上加... 查看详情

车间调度基于matlab蝴蝶算法求解车间调度问题含matlab源码1395期(代码片段)

一、车间调度简介1车间调度定义车间调度是指根据产品制造的合理需求分配加工车间顺序,从而达到合理利用产品制造资源、提高企业经济效益的目的。车间调度问题从数学上可以描述为有n个待加工的零件要在m台机器上加... 查看详情

车间调度基于matlab模拟退火算法求解车间调度问题含matlab源码894期(代码片段)

一、车间调度简介1车间调度定义车间调度是指根据产品制造的合理需求分配加工车间顺序,从而达到合理利用产品制造资源、提高企业经济效益的目的。车间调度问题从数学上可以描述为有n个待加工的零件要在m台机器上加... 查看详情

车间调度基于matlab粒子群算法求解车间生产调度问题含matlab源码245期(代码片段)

一、车间调度简介1车间调度定义车间调度是指根据产品制造的合理需求分配加工车间顺序,从而达到合理利用产品制造资源、提高企业经济效益的目的。车间调度问题从数学上可以描述为有n个待加工的零件要在m台机器上加... 查看详情

车间调度基于matlab遗传算法求解车间调度问题(含甘特图)含matlab源码2216期(代码片段)

⛄一、车间调度简介1车间调度定义车间调度是指根据产品制造的合理需求分配加工车间顺序,从而达到合理利用产品制造资源、提高企业经济效益的目的。车间调度问题从数学上可以描述为有n个待加工的零件要在m台机器上... 查看详情

车间调度基于matlab模拟退火算法求解车间调度(jobshop-3)问题含matlab源码1082期(代码片段)

一、车间调度简介1车间调度定义车间调度是指根据产品制造的合理需求分配加工车间顺序,从而达到合理利用产品制造资源、提高企业经济效益的目的。车间调度问题从数学上可以描述为有n个待加工的零件要在m台机器上加... 查看详情

车间调度基于matlab改进的遗传算法求解车间调度问题含matlab源码h002期(代码片段)

一、车间调度简介1车间调度定义车间调度是指根据产品制造的合理需求分配加工车间顺序,从而达到合理利用产品制造资源、提高企业经济效益的目的。车间调度问题从数学上可以描述为有n个待加工的零件要在m台机器上加... 查看详情

车间调度基于matlab模拟退火算法求解单约束车间流水线调度问题含matlab源码1457期(代码片段)

一、车间调度简介1车间调度定义车间调度是指根据产品制造的合理需求分配加工车间顺序,从而达到合理利用产品制造资源、提高企业经济效益的目的。车间调度问题从数学上可以描述为有n个待加工的零件要在m台机器上加... 查看详情

作业调度基于matlabgui遗传算法求解车间作业调度问题(获益最大)含matlab源码2025期

一、车间调度简介1车间调度定义车间调度是指根据产品制造的合理需求分配加工车间顺序,从而达到合理利用产品制造资源、提高企业经济效益的目的。车间调度问题从数学上可以描述为有n个待加工的零件要在m台机器上加工。... 查看详情

车间调度基于matlab差分进化算法求解作业车间调度问题含matlab源码1743期(代码片段)

一、车间调度简介1车间调度定义车间调度是指根据产品制造的合理需求分配加工车间顺序,从而达到合理利用产品制造资源、提高企业经济效益的目的。车间调度问题从数学上可以描述为有n个待加工的零件要在m台机器上加... 查看详情

用python实现基于遗传算法(ga)求解混合流水车间调度问题(hfsp)(代码片段)

之前一直研究的是柔性作业车间调度问题,研究汇总如下:用python实现基于遗传算法求解柔性作业车间调度问题代码实现(包括标准算例准换、编码、解码、交叉、变异的详细讲述) 用python实现基于蚁群算法求... 查看详情

车间调度基于matlab混合蛙跳算法(sfla)求解简单调度问题含matlab源码2247期

⛄一、车间调度简介在传统的SFLA中,每一个青蛙的位置代表一个解,若干个青蛙组成的种群代表一个解的集合,种群被划分为不同的组,即模因组,对每个模因组执行搜索过程,当达到终止条件后,重... 查看详情

车间调度基于matlab改进的帝国企鹅算法求解车间调度问题含matlab源码2041期

一、车间调度简介1车间调度定义车间调度是指根据产品制造的合理需求分配加工车间顺序,从而达到合理利用产品制造资源、提高企业经济效益的目的。车间调度问题从数学上可以描述为有n个待加工的零件要在m台机器上加... 查看详情

matlab基于多层编码遗传算法的车间调度算法matlab优化算法十九(代码片段)

基于多层编码遗传算法的车间调度算法理论基础遗传算法具有较强的问题求解能力,能够解决非线性优化问题。遗传算法中的每个染色体表示问题中的一个潜在最优解,对于简单的问题来说,染色体可以方便地表达问... 查看详情

matlab基于多层编码遗传算法的车间调度算法matlab优化算法十九(代码片段)

基于多层编码遗传算法的车间调度算法理论基础遗传算法具有较强的问题求解能力,能够解决非线性优化问题。遗传算法中的每个染色体表示问题中的一个潜在最优解,对于简单的问题来说,染色体可以方便地表达问... 查看详情

车间调度基于matlab候鸟算法mbo求解柔性作业车间调度问题含matlab源码2354期

⛄一、车间调度简介1柔性作业车间调度问题FJSP问题可描述为:车间内n个工件在m台机器上加工.各工件均包含一道或多道工序,同工件各工序间存在固定的加工顺序.工序可在多于一台的机器上加工,其加工时间与所在机器有关.FJSP问... 查看详情

模糊时间的柔性车间调度问题-python实现遗传算法求解(代码片段)

目录1问题描述1.1模糊加工时间的运算 2编码解码 3算例4算法4.1 文献【2】中算例验证4部分代码展示完整代码:https://github.com/Aihong-Sun/FJSP_FP_GA1问题描述        模糊性和灵活性的概念普遍存在于实际制造系统中,因... 查看详情

车间调度遗传算法(代码片段)

【2021-07-06更新】测试地址更新:http://39.101.244.246:8080/web/算法部署ip同步更新:39.101.244.246数据库已存在6张订单,默认6张订单计算,可以根据orders更改。直接运行即可。算法模块在服务器部署。importjava.io.BufferedRead... 查看详情