目录
1.算法仿真效果
matlab2022a仿真结果如下:
2.MATLAB核心程序
..................................................................
%合并种群
Pop_comb(1:Pop_num,1:Num_Object+N_decision_var+2) = Pop_Gat_dist;
[Size_x,Size_y] = size(Off_Gens);
Pop_comb(Pop_num+1:Pop_num+Size_x,1:Num_Object+N_decision_var+2) = Off_Gens;
%非支配排序和聚焦距离更新
[gen_non_dominant_pop,Pop_Info] = func_non_dominant_sort(Pop_comb,Num_Object,N_decision_var);
nsdc_pop = func_crowding_distance(gen_non_dominant_pop,Num_Object,N_decision_var,Pop_Info);
%交叉变异
[Pop_Gat_dist] = func_gene_off(nsdc_pop,Num_Object,N_decision_var,Pop_num);
%选择,交叉,变异产生下一个子代
poolsize = round(Pop_num/2);
%选择锦标赛的元度
toursize = 2;
select_pop = func_sel(Pop_Gat_dist,poolsize,toursize,Num_Object,N_decision_var);
[Off_Gens,Object] = func_gene_oper(select_pop,Num_Object,N_decision_var,Pc,Pm,xmax,xmin,Para,X,Y,Pdet,r);
t = t+1;
%保存每次迭代的优化结果
..............................................................
end
%Pc和Pm的自适应更新
if t == 1
Pc = 20;
Pm = 20;
else
delta = abs(Opt_node2(t) - Opt_node2(t-1))+abs(Opt_same2(t) - Opt_same2(t-1))+abs(Opt_power2(t) - Opt_power2(t-1));
Pc = 20/(1+exp(-delta));
pm = 20/(1+exp(-delta));
end
%保存不同覆盖率下的覆盖节点值
load node.mat
Nodes(t,:) = NODES;
end
figure;
plot(1:10:gen,Opt_node2(1:10:gen),'-bs',...
'LineWidth',1,...
'MarkerSize',6,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[0.0,0.99,0.0]);
xlabel('迭代次数');
ylabel('覆盖率');
title('覆盖率(满足必须大于90%)');
figure;
plot(1:10:gen,Opt_power2(1:10:gen),'-bs',...
'LineWidth',1,...
'MarkerSize',6,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[0.0,0.99,0.0]);
xlabel('迭代次数');
ylabel('节点平均能量');
figure;
plot(1:10:gen,sum(Nodes(1:10:gen,:),2),'-bs',...
'LineWidth',1,...
'MarkerSize',6,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[0.0,0.99,0.0]);
xlabel('迭代次数');
ylabel('最优节点个数变换');
title('满足覆盖率最低需求条件的最优节点个数变换');
func_view(1,R,W,H,X,Y,Nodes,Opt_node2,Opt_same2,Opt_power2);
func_view(10,R,W,H,X,Y,Nodes,Opt_node2,Opt_same2,Opt_power2);
func_view(30,R,W,H,X,Y,Nodes,Opt_node2,Opt_same2,Opt_power2);
func_view(50,R,W,H,X,Y,Nodes,Opt_node2,Opt_same2,Opt_power2);
func_view(100,R,W,H,X,Y,Nodes,Opt_node2,Opt_same2,Opt_power2);
func_view(150,R,W,H,X,Y,Nodes,Opt_node2,Opt_same2,Opt_power2);
func_view(200,R,W,H,X,Y,Nodes,Opt_node2,Opt_same2,Opt_power2);
12_018_m
3.算法涉及理论知识概要
首先将一群具有多个目标的个体(解集,或者说线代里的向量形式)作为父代初始种群,在每一次迭代中,GA操作后合并父代于自带。通过非支配排序,我们将所有个体分不到不同的pareto最优前沿层次。然后根据不同层次的顺序从pareto最优前沿选择个体作为下一个种群。出于遗传算法中的“物种多样性”保护,还计算量“拥挤距离”。拥挤距离比较将算法各阶段的选择过程引向一致的前沿。
与单目标(遗传算法)最大的不同就是进行选择操作之前进行快速非支配排序,这一步也是为了选择操作而来的,选择哪些、怎么选是通过非快速支配排序来的。这就不像单目标,挑好的选就行了。
支配: 在多目标优化问题中,如果个体p至少有一个目标比个体q好,而且个体p中的所有目标都不比个体q差,那么称个体p支配个体q。
序值: 如果p支配q,那么p的序值比q低。如果p和q互不支配,那么p和q有相同的序值。
拥挤距离:用来计算某前端中的某个体与该前端中其他个体之间的距离,用以表征个体间的拥挤程度。希望pareto解出来之后,点与点之间距离是相近的,不要太多的聚集在某个地方。用某个点与前后两个点之间的xy的距离和表示。算法会选择拥挤距离大的去领头。
快速非支配排序:快速非支配排序就是将解集分解为不同次序的Pareto前沿的过程。将一组解分成n个集合:rank1,rank2…rankn,每个集合中所有的解都互不支配,但ranki中的任意解支配rankj中的任意解(i<j).
综上所述,NSGAII的步骤如下所示:
步骤1:编码。遗传算法在进行搜索之前,将变量编成一个定长的编码——用二进制字符串来表示,这些字符串的不同组合,
便构成了搜索空间不同的搜索点。
步骤2:产生初始群体。随机产生N个字符串,每个字符串代表一个个体。
步骤3:按目标函数的个数分割子群体,对每个子群体进行如下操作:
1)计算目标函数值(此步调用ANSYs有限元程序,将ANSYS有限元程序得到的后处理结果传给MATLAB程序作为目标函数值);
2)计算每个个体的适应度,本文中采用线性排序法和选择压差为2估算适应度;
3)用随机遍历抽样方法在每个子种群中选择个体。
步骤4:将每个子种群中选择出的个体进行合并。
步骤5:交叉操作。本文中采用的是单点交叉操作。
步骤6:变异。对个体按给定的概率进行变异,形成新一代群体。
步骤7:将步骤6产生的个体合重复进行步骤3~ 步骤6的操作,直至完成规定的遗传迭代总次数。
————————————————
优化目标1:
网络覆盖率是衡量网络覆盖性能最重要的指标,一般定义为所有工作节点覆盖的总范围与目标区域面积大小的比值,其中传感器节点覆盖的范围取所有节点覆盖面积的并集。因此,网络覆盖率总是小于或者等于 1。
优化目标2:
节点倒数
当节点使用越少的时候,这个指标就越小
优化目标3:
网络的均衡能耗
实际系统中,整个网络的各个节点的剩余能量是不同的,为了使得建立的新的覆盖范围的网络具有更久的使用寿命,我们必须考虑建立的优化目标的网络节点剩余能量。
4.完整MATLAB
V