GA,WSN覆盖基于遗传优化的无线传感器网络覆盖问题的matlab仿真
Posted fpga&matlab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GA,WSN覆盖基于遗传优化的无线传感器网络覆盖问题的matlab仿真相关的知识,希望对你有一定的参考价值。
1.软件版本
MATLAB2021a
2.本算法理论知识
优化目标1:
网络覆盖率是衡量网络覆盖性能最重要的指标,一般定义为所有工作节点覆盖的总范围与目标区域面积大小的比值,其中传感器节点覆盖的范围取所有节点覆盖面积的并集。因此,网络覆盖率总是小于或者等于 1。
G'为覆盖集合的节点的个数
要使得节点最小,覆盖率最大,那么可以满足f1的最大化。因此优化目标1函数为上述式子2.这里。
优化目标2:
当节点使用越少的时候,这个指标就越小
(这里,我说说明一下,加入重合覆盖率这个指标之后,因为在概率感知模型中,由于边界需要使用概率的统计角度进行考虑导致仿真速度及其缓慢,然后再三考虑之后,把目标1中的节点这个指标单独拿出来,作为第二个优化指标)
优化目标3:
网络的均衡能耗
实际系统中,整个网络的各个节点的剩余能量是不同的,为了使得建立的新的覆盖范围的网络具有更久的使用寿命,我们必须考虑建立的优化目标的网络节点剩余能量。
首先是网络的能量区间,则第k个网格的区域能量等于该网格中所有节点的剩余能量之和与该网格中节点个数的比值,即:
那么能量的区间为:
这里,构造如下的优化目标函数:
之前和你说的网络寿命,其实就是和这个能量相关的,如果能量最小值很小, 那么网络使用寿命就很短,这里就不做第五个优化目标了。上述,我们将四个优化目标,用三个式子进行表示,总体上讲,即:
这里,f1为越大越优秀,f2为越大越优,f3为越大越优,所以适应度函数做如下的设置:
3.核心代码
clc;
clear;
close all;
warning off;
addpath 'func\\'
addpath 'func\\A_快速非支配排序\\'
addpath 'func\\B_聚集距离\\'
addpath 'func\\C_选择交叉选择\\'
addpath 'func\\D_网络覆盖的直观效果函数\\'
addpath 'func\\E_优化目标函数\\'
RandStream.setDefaultStream(RandStream('mt19937ar','seed',1));
%初始化网络节点覆盖情况
%目标区域大小,设置的越大,仿真速度越慢,所以这里的设置的场景范围较少
W = 50;
H = 50;
%网格划分,这个值越大,则越精确,但是仿真也就越慢
G = H;
%节点数目
NN = 200;
R = 6;
[X,Y] = func_initial(W,H,NN);
%定义网络初始化的剩余能量百分比
Eall = 0.6+0.4*rand(1,NN);
figure
subplot(121);
for i=1:NN
plot(X(i),Y(i),'b*');
hold on
circle([X(i),Y(i)],R,1000,'r');
hold on
i=i+1;
end
axis([0,W,0,H]);
beta = 2;
delta = 4;
r = 0:0.1:5*R;
x = 10*beta*log10(r/R)/delta;
Pdet = qfunc(x);
subplot(122);
plot(r,Pdet);
axis square;
xlabel('节点距离');
ylabel('连接概率');
Para = [W,H,G,NN,R,beta,delta];
X;
Y;
Pdet;
r;
%==========================================================================
%计算初始网络节点总的覆盖率
C = func_obj0(NN,Para,X,Y,Pdet,r);
save tmps.mat Eall C
%初始化参数
Pop_num = 50;
gen = 300;
%变量取值范围
xmin = 0;
xmax = 1;
%目标函数个数
Num_Object = 3;
%决策变量数目
N_decision_var = NN;
%交叉变异参数
Pc = 20;
Pm = 20;
%产生初始种群
Pop_initial = rand(Pop_num,N_decision_var)*(xmax-xmin)+xmin;
%初始目标函数的定义
[Pop_init_val,Object0] = func_objective(Pop_initial,Num_Object,N_decision_var,Para,X,Y,Pdet,r);
%非支配排序
[Pop_no_domination,Pop_Info] = func_non_dominant_sort(Pop_init_val,Num_Object,N_decision_var);
%聚集距离
Pop_Gat_dist = func_crowding_distance(Pop_no_domination,Num_Object,N_decision_var,Pop_Info);
%选择,交叉,变异
%选择进行交叉变异的个数
poolsize = round(Pop_num/2);
%选择锦标赛的元度
toursize = 2;
%开始选择
select_pop = func_sel(Pop_Gat_dist,poolsize,toursize,Num_Object,N_decision_var);
%存储交叉变异相关参数
Pc = 20;
Pm = 20;
Off_Gens = func_gene_oper(select_pop,Num_Object,N_decision_var,Pc,Pm,xmax,xmin,Para,X,Y,Pdet,r);
%循环开始
t = 0;
Opt_node = [];
Opt_cover = [];
Opt_same = [];
Opt_power = [];
Opt_node2 = [];
Opt_cover2 = [];
Opt_same2 = [];
Opt_power2 = [];
LEN = 16;
while t <= gen
t
RandStream.setDefaultStream(RandStream('mt19937ar','seed',t));
%合并种群
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;
%保存每次迭代的优化结果
t1 = sort(Object(1,:));
t2 = sort(Object(2,:));
t3 = sort(Object(3,:));
Opt_node = [Opt_node ,mean(t1(5:end-5))];
Opt_same = [Opt_same ,mean(t2(5:end-5))];
Opt_power = [Opt_power,mean(t3(5:end-5))];
if t <= LEN
Opt_node2 = [Opt_node2,mean(Opt_node(1:t))];
Opt_same2 = [Opt_same2,mean(Opt_same(1:t))];
Opt_power2 = [Opt_power2,mean(Opt_power(1:t))];
else
Opt_node2 = [Opt_node2,mean(Opt_node(t-LEN+1:t))];
Opt_same2 = [Opt_same2,mean(Opt_same(t-LEN+1:t))];
Opt_power2 = [Opt_power2,mean(Opt_power(t-LEN+1:t))];
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
end
figure
subplot(121);
for i=1:NN
plot(X(i),Y(i),'b*');
hold on
circle([X(i),Y(i)],1.5*R,1000,'r');
hold on
i=i+1;
end
axis([0,W,0,H]);
title('优化前的覆盖情况');
subplot(122);
load node.mat
IND = find(NODES==1);
X0 = X(IND);
Y0 = Y(IND);
for i=1:length(IND)
plot(X0(i),Y0(i),'b*');
hold on
circle([X0(i),Y0(i)],1.5*R,1000,'r');
hold on
i=i+1;
end
axis([0,W,0,H]);
title('优化后的覆盖情况');
%最后仿真结论的分析
figure
plot(Opt_node2,'b','linewidth',2);
grid on;
xlabel('迭代次数');
ylabel('覆盖率优化');
xlim([1,300]);
figure
plot(Opt_same2,'b','linewidth',2);
grid on;
xlabel('迭代次数');
ylabel('节点数量优化');
xlim([1,300]);
figure
plot(Opt_power2,'b','linewidth',2);
grid on;
xlabel('迭代次数');
ylabel('能量均衡优化');
xlim([1,300]);
SMALL = 0.000001;
figure
plot(1./(Opt_node2+SMALL),'b','linewidth',2);
grid on;
xlabel('迭代次数');
ylabel('覆盖率适应度');
xlim([1,300]);
figure
plot(1./(Opt_same2+SMALL),'b','linewidth',2);
grid on;
xlabel('迭代次数');
ylabel('节点数量适应度');
xlim([1,300]);
figure
plot(1./(Opt_power2+SMALL),'b','linewidth',2);
grid on;
xlabel('迭代次数');
ylabel('能量均衡适应度');
xlim([1,300]);
save r1.mat NN X Y R NODES W H Opt_node2 Opt_same2 Opt_power2
4.操作步骤与仿真结论
5.参考文献
A12-18
6.完整源码获得方式
方式1:微信或者QQ联系博主
方式2:订阅MATLAB/FPGA教程,免费获得教程案例以及任意2份完整源码
以上是关于GA,WSN覆盖基于遗传优化的无线传感器网络覆盖问题的matlab仿真的主要内容,如果未能解决你的问题,请参考以下文章
布局优化基于遗传算法的的无线传感器网(WSN)覆盖优化Matlab源码
基于遗传和虚拟力优化算法的WSN无线传感器网络节点二维/三维部署覆盖率问题matlab仿真
基于NSGAII多目标遗传优化的WSN无线传感器网络最优覆盖率matlab仿真
优化覆盖基于matlab人工蜂群算法求解无线网络传感覆盖优化问题含Matlab源码 1097期