1. 程式人生 > 其它 >【車間排程】基於matlab nsga2演算法求解車間排程問題【含Matlab原始碼 893期】

【車間排程】基於matlab nsga2演算法求解車間排程問題【含Matlab原始碼 893期】

一、簡介

首先介紹一下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(Jm{i,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=T{val,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=T{val,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(F{1});
    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

三、執行結果



四、備註

版本:2014a
完整程式碼或代寫加1564658423