【車間排程】基於matlab nsga2演算法求解車間排程問題【含Matlab原始碼 893期】
阿新 • • 發佈:2021-06-21
一、簡介
首先介紹一下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