【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份完整源码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

fpga和matlab

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

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

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

打赏作者

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

抵扣说明:

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

余额充值