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
figure('NAME','NSGA-trace')
plot(trace(1,:));
hold on;
plot(trace(2,:),'-.');grid;
legend('间隔时间拖时','交货延期');
[crowdistances]=cat(1,PF.CrowdingDistance);
[~,maxIndex]=max(crowdistances);
solutions=cat(1,PF.Position);
bestSolution=solutions(maxIndex,:);
%根据基因,计算调度工序
P=calP(bestSolution,PNumber);
%根据调度工序,计算出调度工序时间
PVal=caltime(bestSolution,P,JmNumber,T,Jm);
%% 显示最优解
figure('NAME','NSGA-Res');
MP=bestSolution(1,length(bestSolution)/2+1:length(bestSolution));
for i=1:WNumber
val= P(1,i);
a=(mod(val,100)); %工序
b=((val-a)/100); %工件
Temp=Jm{b,a};
mText=Temp(MP(1,i));
x1=PVal(1,i);
x2=PVal(2,i);
y1=mText-1;
y2=mText;
PlotRec(x1,x2,mText);
PlotRec(PVal(1,i),PVal(2,i),mText);
hold on;
fill([x1,x2,x2,x1],[y1,y1,y2,y2],[1-1/b,1/b,b/PNumber]);
text(x1,mText-0.25,num2str(P(i)));
end
RunTime=toc;
%% Results
disp(' ');
disp(['Total Run Time: ' num2str(RunTime) ' second(o)']);
disp(' ');


海神之光
- 粉丝: 5w+
- 资源: 7136
最新资源
- 基于kinect 的人体动作识别新版算法源码+说明.zip
- 基于MATLAB的车牌识别系统新版算法源码+说明.zip
- 基于lumen5.5开发的高性能高并发图片识别平台API源码+说明.zip
- 混合动力汽车动态规划算法理论油耗计算及模块化编程教学:基于MATLAB的快速计算程序与参数自定义配置技术 ,混合动力汽车动态规划算法:基于MATLAB的油耗计算程序与模块化教学平台 通过控制量与状态量
- 基于LSTM的中文情绪识别新版源码+数据.zip
- 基于MLKit实现二维码+条形码识别(实现微信效果样式).zip
- 基于mtcnn_facenet_tensorflow 实现人脸识别登录系统新版源码+说明.zip
- 基于MFCC语音特征提取和识别新版算法源码+说明.zip
- 基于HTML+JavaScript的瑞吉外卖系统设计源码及优化实践
- 基于MTCNN和MobileFaceNet实现的人脸识别算法源码(提供三种预测方式,满足各种需求).zip
- 基于Java语言的优优租车系统设计源码
- 基于opencv的java车牌检测识别库(支持linux、windows、mac、Android平台).zip
- MATLAB仿真:TMM计算光学薄膜与一维光子晶体透射谱、反射谱,可定制多种膜层与入射条件,MATLAB仿真TMM法:定制计算光学薄膜与一维光子晶体透反谱随入射角及波型变化,MATLAB仿真传输矩阵法
- 基于ocr主流算法gru_lstm+ctc+cnn架构进行不定长度验证码识别,达到不分割字符而识别验证码内容的效果.zip
- 基于STM32、ESP8266与OneNet的智能家电控制系统设计源码
- 基于opencv的图像识别基础库.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


