基于蜣螂优化(DBO)的2D环境WSN节点覆盖优化 利用蜣螂优化(DBO)算法求解无线传感器网络(Wireless Sensor Networks, WSN)节点覆盖优化(2D环境) 其中main.m是主函数运行即可DBO.m是算法的代码fitness.m是目标函数 输出结果包括最优覆盖率、收敛曲线、2D覆盖情况图先看核心操作每个传感器覆盖半径50米我们要在200x200的区域内摆30个节点。目标函数就是让监控区域覆盖率最大化。代码里fitness.m这个函数贼有意思function coverage fitness(pop) area zeros(200); % 初始化监测区域 cover_radius 50; for i 1:size(pop,1) x round(pop(i,1)); y round(pop(i,2)); % 画圆操作 [X,Y] meshgrid(1:200); dist sqrt((X-x).^2 (Y-y).^2); area(dist cover_radius) 1; end coverage sum(area(:))/40000; end这里用meshgrid生成坐标网格计算每个点与传感器的距离。注意round函数处理坐标时会产生锯齿状边缘实测中发现改用floor效果更丝滑。覆盖率计算时别忘了总面积是200x20040000。蜣螂优化算法的精髓在DBO.m里。初始化种群时有个骚操作把屎壳郎分三六九等滚球组、繁殖组、小偷组。看看位置更新公式% 滚球蜣螂更新 new_pos pop(j,:) tan(rand*pi/2) * (pop(j,:) - obstacle_pos); % 越界处理 new_pos max(new_pos, lb); new_pos min(new_pos, ub);这个tan(rand*pi/2)用得妙既保证探索方向随机又避免角度过大。边界的钳制处理看似简单实测中发现不处理的话30%的屎壳郎会跑到地图外摸鱼。主函数main.m里藏着玄机。每次迭代后把最优解存下来画图figure(1) plot(Convergence_curve,r,linewidth,1.5) title(覆盖率收敛曲线) xlabel(迭代次数); ylabel(覆盖率); figure(2) voronoi(best_pos(:,1),best_pos(:,2)) % 泰森多边形可视化 hold on scatter(best_pos(:,1),best_pos(:,2),filled)用泰森多边形展示覆盖区域比单纯画圆更直观。注意要hold on才能叠加散点图和泰森多边形。基于蜣螂优化(DBO)的2D环境WSN节点覆盖优化 利用蜣螂优化(DBO)算法求解无线传感器网络(Wireless Sensor Networks, WSN)节点覆盖优化(2D环境) 其中main.m是主函数运行即可DBO.m是算法的代码fitness.m是目标函数 输出结果包括最优覆盖率、收敛曲线、2D覆盖情况图跑完程序发现初始随机部署的覆盖率只有62%经过200代迭代后飙到89%。有趣的是在迭代到80代左右会出现平台期这时候小偷组的随机扰动就派上用场了——这些不按套路出牌的个体能跳出局部最优。最后说个坑传感器坐标必须取整但优化时用连续变量。处理不当会出现明明坐标差0.5却判定为未覆盖的情况。解决方法是在fitness函数里对坐标做四舍五入或者在初始化时把搜索空间设为整数。下次试试三维地形下的部署或者加入节点移动能耗约束。这堆屎壳郎还能玩出什么花样咱们下回分解。完整代码已上传GitHub假装这里有个链接拿走去盘你的传感器吧。
无线传感器网络的节点部署直接决定监测质量。怎么让这群铁憨憨的传感器摆出最骚的阵型?今天我们搞点有味道的——用屎壳郎滚粪球的智慧来解决这个问题
基于蜣螂优化(DBO)的2D环境WSN节点覆盖优化 利用蜣螂优化(DBO)算法求解无线传感器网络(Wireless Sensor Networks, WSN)节点覆盖优化(2D环境) 其中main.m是主函数运行即可DBO.m是算法的代码fitness.m是目标函数 输出结果包括最优覆盖率、收敛曲线、2D覆盖情况图先看核心操作每个传感器覆盖半径50米我们要在200x200的区域内摆30个节点。目标函数就是让监控区域覆盖率最大化。代码里fitness.m这个函数贼有意思function coverage fitness(pop) area zeros(200); % 初始化监测区域 cover_radius 50; for i 1:size(pop,1) x round(pop(i,1)); y round(pop(i,2)); % 画圆操作 [X,Y] meshgrid(1:200); dist sqrt((X-x).^2 (Y-y).^2); area(dist cover_radius) 1; end coverage sum(area(:))/40000; end这里用meshgrid生成坐标网格计算每个点与传感器的距离。注意round函数处理坐标时会产生锯齿状边缘实测中发现改用floor效果更丝滑。覆盖率计算时别忘了总面积是200x20040000。蜣螂优化算法的精髓在DBO.m里。初始化种群时有个骚操作把屎壳郎分三六九等滚球组、繁殖组、小偷组。看看位置更新公式% 滚球蜣螂更新 new_pos pop(j,:) tan(rand*pi/2) * (pop(j,:) - obstacle_pos); % 越界处理 new_pos max(new_pos, lb); new_pos min(new_pos, ub);这个tan(rand*pi/2)用得妙既保证探索方向随机又避免角度过大。边界的钳制处理看似简单实测中发现不处理的话30%的屎壳郎会跑到地图外摸鱼。主函数main.m里藏着玄机。每次迭代后把最优解存下来画图figure(1) plot(Convergence_curve,r,linewidth,1.5) title(覆盖率收敛曲线) xlabel(迭代次数); ylabel(覆盖率); figure(2) voronoi(best_pos(:,1),best_pos(:,2)) % 泰森多边形可视化 hold on scatter(best_pos(:,1),best_pos(:,2),filled)用泰森多边形展示覆盖区域比单纯画圆更直观。注意要hold on才能叠加散点图和泰森多边形。基于蜣螂优化(DBO)的2D环境WSN节点覆盖优化 利用蜣螂优化(DBO)算法求解无线传感器网络(Wireless Sensor Networks, WSN)节点覆盖优化(2D环境) 其中main.m是主函数运行即可DBO.m是算法的代码fitness.m是目标函数 输出结果包括最优覆盖率、收敛曲线、2D覆盖情况图跑完程序发现初始随机部署的覆盖率只有62%经过200代迭代后飙到89%。有趣的是在迭代到80代左右会出现平台期这时候小偷组的随机扰动就派上用场了——这些不按套路出牌的个体能跳出局部最优。最后说个坑传感器坐标必须取整但优化时用连续变量。处理不当会出现明明坐标差0.5却判定为未覆盖的情况。解决方法是在fitness函数里对坐标做四舍五入或者在初始化时把搜索空间设为整数。下次试试三维地形下的部署或者加入节点移动能耗约束。这堆屎壳郎还能玩出什么花样咱们下回分解。完整代码已上传GitHub假装这里有个链接拿走去盘你的传感器吧。