1.算法描述
NSGA-II是基于的非支配排序的方法,在NSGA上进行改进,也是多目标进化优化领域一个里程碑式的一个算法。
NSGA-Ⅱ算法是 Srinivas 和 Deb 于 2000 年在 NSGA 的基础上提出的,它比 NSGA算法更加优越:它采用了快速非支配排序算法,计算复杂度比 NSGA 大大的降低;采用了拥挤度和拥挤度比较算子,代替了需要指定的共享半径 shareQ,并在快速排序后的同级比较中作为胜出标准,使准 Pareto 域中的个体能扩展到整个 Pareto 域,并均匀分布,保持了种群的多样性;引入了精英策略,扩大了采样空间,防止最佳个体的丢失,提高了算法的运算速度和鲁棒性。
NSGA-Ⅱ就是在第一代非支配排序遗传算法的基础上改进而来,其改进主要是针对如上所述的三个方面:
①提出了快速非支配排序算法,一方面降低了计算的复杂度,另一方面它将父代种群跟子代种群进行合并,使得下一代的种群从双倍的空间中进行选取,从而保留了最为优秀的所有个体;
②引进精英策略,保证某些优良的种群个体在进化过程中不会被丢弃,从而提高了优化结果的精度;
③采用拥挤度和拥挤度比较算子,不但克服了NSGA中需要人为指定共享参数的缺陷,而且将其作为种群中个体间的比较标准,使得准Pareto域中的个体能均匀地扩展到整个Pareto域,保证了种群的多样性。
在NSGA-中,将进化群体按支配时关系分为若干层,第一层为进化群体的非支配个体集合,第二层为在进化群体中去掉第一层个体后所求得的非支配个体集合,第三层为在进化群体中去掉第一层和第二层个体后所求得的非支配个体集合,依此类推。选择操作首先考虑第一层非支配集,按照某种策略从第一层中选取个体;然后再考虑在第二层非支配个体集合中选择个体,依此类推,直至满足新进化群体的大小要求。
2.仿真效果预览
matlab2022a仿真结果如下:
3.MATLAB核心程序
%交叉概率 pc = 0.8; ncross = 2*round(npop*pc/2); %变异概率 pm = 0.2; nmut = round(npop*pm); empty.pos = []; empty.cost = []; empty.dcount= []; empty.dset = []; empty.rank = []; empty.cdis = []; pop = repmat(empty,npop,1); for i=1:npop pop(i).pos = lb + rand(1,nvar).*(ub-lb); pop(i).cost = fitness(pop(i).pos); end [pop,F] = func_sorting(pop); pop = func_crowding_distance(pop,F); pop = func_2sorting(pop); bests1 = []; bests2 = []; bests3 = []; for iter=1:maxiter iter %crossover crosspop = repmat(empty,ncross,1); crosspop = func_crossover(crosspop,pop,ncross,F,nvar);%%%%%%%%%%%% %mutation mutpop = repmat(empty,nmut,1); mutpop = func_mutation(mutpop,pop,nmut,lb,ub,nvar); pop = [pop;crosspop;mutpop]; [pop,F] = func_sorting(pop); pop = func_crowding_distance(pop,F); pop = func_2sorting(pop); pop = pop(1:npop); [pop,F] = func_sorting(pop); pop = func_crowding_distance(pop,F); pop = func_2sorting(pop); C =[pop.cost]'; bests1 =[bests1,mean(C(:,1))]; bests2 =[bests2,mean(C(:,2))]; bests3 =[bests3,mean(C(:,3))]; Y1 = C(:,1); Y2 = C(:,2); Y3 = C(:,3); tmps = [pop.pos]; figure(1); plot3(Y1,Y2,Y3,'bo'); xlabel('任务完成时间'); ylabel('所有任务计算完成时间之和'); zlabel('单个任务样本完成的最大时间'); grid on; axis([0.98*min(Y1),1.02*max(Y1),0.98*min(Y2),1.02*max(Y2),0.98*min(Y3),1.02*max(Y3)]); pause(0.0001); end figure; plot(bests1); xlabel('迭代过程'); ylabel('任务完成时间'); figure; plot(bests2); xlabel('迭代过程'); ylabel('所有任务计算完成时间之和'); figure; plot(bests3); xlabel('迭代过程'); ylabel('单个任务样本完成的最大时间'); % [VV,II] = min(Y1+Y2+Y3); II=8; Total_time = Y1(II); Total_WT = Y2(II); max_WT = Y3(II); X = tmps(nvar*(II-1)+1:nvar*II); % Z=fitness(X) %显示甘特图 [V,I] = sort(X(1:end-1)); seq1 = sort(I(1:N1)); seq2 = sort(I(N1+1:N1+N2)); seq3 = sort(I(N1+N2+1:N1+N2+N3)); x1 = mach(seq1); x2 = mach(seq2); x3 = mach(seq3); for i = 1:N1 c1(1,i) = time1(x1(i)); end for i = 1:N2 c2(1,i) = time2(x2(i)); end for i = 1:N3 c3(1,i) = time3(x3(i)); end xx = [x1,x2,x3] seq = [seq1,seq2,seq3] cc = [c1,c2,c3] 02_077m
标签:NSGA,机器,负荷,pop,个体,II,func,任务调度,empty From: https://www.cnblogs.com/51matlab/p/17123329.html