m基于NSGAII的多机器多任务调度排序优化matlab仿真,考虑机器任务完成时间、机器总负荷和最大负荷

目录

1.算法描述

2.仿真效果预览

3.MATLAB核心程序

4.完整MATLAB


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

4.完整MATLAB

V

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱C编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值