• 传感器|基于改进贪心算法的最佳传感器位置选择(Matlab代码实现)


    目录

    1 概述

    2 数学模型 

    3 算例及仿真实现 

    3.1 算法比较

    3.2 计算时间比较

     3.3 计算时间和 MSE 之间的权衡

     3.4 FrameSense 和 凸松弛算法的计算时间和 MSE 之间的权衡分析

    3.5  FrameSense与其他贪心算法和基于一致性的贪心算法之间的比较

    4 Matlab代码及文章详细阅读

     5 写在最后


    1 概述

    在许多情况下,测量随空间和时间变化的物理现象是有意义的。常见的例子是温度、声音和污染。解决这个问题的现代方法通常基于无线传感器网络 (WSN),即由许多传感节点组成的系统,每个传感节点都能够测量、处理和传达有关周围环境的信息。挑战和权衡是 WSN 设计的特点。设计一个成功的 WSN 的关键方面之一是优化传感器节点的空间位置,考虑到位置对许多相关指标的影响,例如覆盖范围、能耗和连接性。当 WSN 收集的数据用于解决逆问题时,传感器位置的优化变得更加关键。

    通过接受由近似算法产生的次优传感器放置,可以显着降低计算成本。在这种情况下,需要接近最优的算法,因为它们总是产生质量有保证的解决方案。我们将这种质量衡量为近似解的值与最优解的值之间的比率,我们称其为近似因子。

    一个经典问题是从仅由少数传感器收集的测量值中估计一组参数。传感器的数量通常受到物理或经济约束的限制,它们的位置对于获得准确的估计至关重要。不幸的是,最佳传感器位置的选择本质上是组合的,并且不能保证可用的近似算法在所有感兴趣的情况下都能产生良好的解决方案。我们提出 FrameSense,一种用于选择最佳传感器位置的贪心算法。该算法的核心成本函数是帧势,即矩阵的标量属性,用于测量其行的正交性。值得注意的是,FrameSense 是第一个在均方误差方面接近最优的算法,这意味着它的解决方案始终保证接近最优解决方案。此外,我们通过大量数值实验表明,与其他贪心方法相比,FrameSense 在具有最低计算成本的同时实现了最先进的性能。

    2 数学模型 

     详细数学模型及详解见第四部分。

    3 算例及仿真实现 

    3.1 算法比较

    FrameSense 与其他使用常用代价函数的贪心算法的性能比较。我们随机生成矩阵,并针对不同数量的放置传感器测试不同的贪心算法。性能是根据 MSE 来衡量的,因此曲线越低,性能越高。阴影区域代表误差线的正面,使用超过 100 个实现的标准偏差测量。我们考虑了四种不同类型的传感矩阵,并且在所有情况下 FrameSense 都优于其他算法。我们强调 FrameSense 在四种类型的矩阵上的一致性。

    1. matrix_type=3;
    2. %% 图像标题
    3. switch matrix_type
    4. case 0
    5. Psi=randn(N,K);
    6. tit2='具有归一化行的高斯串联矩阵';
    7. fn='rnd_gauss_norm';
    8. case 1
    9. tit2='高斯随机矩阵';
    10. fn='rnd_gauss';
    11. case 2
    12. tit2='随机二次采样 DCT 矩阵';
    13. fn='rnd_DCT_matrix';
    14. case 3
    15. tit2='随机框架';
    16. fn='rnd_tight_frame';
    17. case 4
    18. tit2='伯努利随机矩阵';
    19. fn='rnd_bernoulli';
    20. end
    21. %% 下载数据 DATA
    22. load(['./data/',fn,'.mat'])
    23. %% 可视化 MSE
    24. %%
    25. gcf=figure(1);
    26. set(gcf,'Color',[1 1 1]);
    27. hold on
    28. h(1)=perc_plot( 10*log10(MSE_FP(2:end,:)'),L(2:end),1)
    29. h(2)=perc_plot( 10*log10(MSE_det(2:end,:)'),L(2:end),7)
    30. h(3)=perc_plot( 10*log10(MSE_mutual_inf(2:end,:)'),L(2:end),5)
    31. h(4)=perc_plot( 10*log10(MSE_MSE(2:end,:)'),L(2:end),3)
    32. h(5)=perc_plot( 10*log10(MSE_rnd(2:end,:)'),L(2:end),2)
    33. if matrix_type==4
    34. axis([L(2),L(end),35,75])
    35. end
    36. hLegend=legend(h,'FrameSense','Determinant','Mutual Information','MSE','Random')
    37. legend('boxoff')
    38. hTitle = title (tit2);
    39. hXLabel = xlabel('传感器数量' );
    40. hYLabel = ylabel('标准化 MSE [dB]' );
    41. set( gca , ...
    42. 'FontName' , 'Helvetica' );
    43. set([hTitle, hXLabel, hYLabel], ...
    44. 'FontName' , 'Helvetica');
    45. set([hLegend, gca] , ...
    46. 'FontSize' , 14 );
    47. set([hXLabel, hYLabel] , ...
    48. 'FontSize' , 14 );
    49. set( hTitle , ...
    50. 'FontSize' , 16 );
    51. pbaspect([16,9, 14])

     

     

     

    3.2 计算时间比较

    计算时间作为 FrameSense 和其他使用通常考虑的成本函数的贪心算法之间的函数的比较。曲线越低,算法越快。注意 FrameSense 是最快的算法,但随机选择除外。此外,观察不同算法如何与 等效地扩展。未显示误差线,因为它们小于标记。

     3.3 计算时间和 MSE 之间的权衡

    我们随机生成矩阵——根据四个不同的模型——带有 、 和 传感器。性能是根据 MSE 来衡量的,因此点越低,性能就越高。另一方面,计算时间以秒为单位。误差线表示为椭圆体,其中轴的长度表示数据点的标准偏差。请注意,FrameSense 是一个数量级上最快的算法,并且在 MSE 方面它是第二好的算法。当图例提到成本函数时,我们考虑了一种优化该成本函数的简单贪心算法。另一方面,我们向作者咨询实现复杂方案和/或启发式的特定算法.

     

    1. matrix_type=2;
    2. %% 标题
    3. switch matrix_type
    4. case 0
    5. tit2='具有归一化高斯矩阵';
    6. fn='rnd_gauss_norm';
    7. case 1
    8. tit2='高斯随机矩阵';
    9. fn='rnd_gauss';
    10. case 2
    11. tit2='随机二次采样 DCT 矩阵';
    12. fn='rnd_DCT_matrix';
    13. case 3
    14. tit2='随机框架';
    15. fn='rnd_tight_frame';
    16. case 5
    17. load Psi_tmaps_red.mat;
    18. case 4
    19. tit2='伯努利随机矩阵';
    20. fn='rnd_bernoulli';
    21. end
    22. %% Load DATA
    23. load(['./data/',fn,'.mat'])
    24. %% Plot MSE
    25. ind=3;
    26. gcf=figure(1);
    27. set(gcf,'Color',[1 1 1]);
    28. hold on
    29. h(1)=perc_scatter( log10(time_FP(ind,:)'), 10*log10(MSE_FP(ind,:)'),1);
    30. h(2)=perc_scatter( log10(time_det(ind,:)'), 10*log10(MSE_det(ind,:)'),7);
    31. h(3)=perc_scatter( log10(time_mutual_inf(ind,:)'), 10*log10(MSE_mutual_inf(ind,:)'),5);
    32. h(4)=perc_scatter( log10(time_MSE(ind,:)'), 10*log10(MSE_MSE(ind,:)'),3);
    33. h(5)=perc_scatter( log10(time_rnd(ind,:)'), 10*log10(MSE_rnd(ind,:)'),2);
    34. h(6)=perc_scatter( log10(time_joshi(ind,:)'), 10*log10(MSE_joshi(ind,:)'),13);
    35. %%
    36. hLegend=legend(h,'FrameSense','Determinant','Mutual Information','MSE','Random','Convex Opt. Method [6]')
    37. switch matrix_type
    38. case 4
    39. axis([-5,1,35,65])
    40. set(hLegend,'Location','NorthWest');
    41. case 1
    42. axis([-5,1,-0,6])
    43. set(hLegend,'Location','SouthWest');
    44. case 3
    45. set(hLegend,'Location','NorthWest');
    46. case 0
    47. set(hLegend,'Location','NorthWest')
    48. case 2
    49. axis([-5,5,10,40])
    50. %set(hLegend,'Location','SouthWest');
    51. end
    52. %%
    53. legend('boxoff')
    54. hTitle = title (tit2);
    55. hXLabel = xlabel('计算时间 [log s]' );
    56. hYLabel = ylabel('标准化 MSE [dB]' );
    57. set( gca , ...
    58. 'FontName' , 'Helvetica' );
    59. set([hTitle, hXLabel, hYLabel], ...
    60. 'FontName' , 'Helvetica');
    61. set([hLegend, gca] , ...
    62. 'FontSize' , 14 );
    63. set([hXLabel, hYLabel] , ...
    64. 'FontSize' , 14 );
    65. set( hTitle , ...
    66. 'FontSize' , 16 );
    67. pbaspect([16,9, 14])

     3.4 FrameSense 和 凸松弛算法的计算时间和 MSE 之间的权衡分析

    我们生成 100 个大小不断增加的高斯矩阵,同时放置传感器。误差线表示为椭圆体,其中轴的长度表示数据点的标准偏差。我们测量了平均计算时间和平均 MSE,表明虽然 FrameSense 明显快于凸算法,但 MSE 的差异很小。此外,随着问题规模的扩大,解决方案质量的差距会缩小。

    3.5  FrameSense与其他贪心算法和基于一致性的贪心算法之间的比较

    在这个实验中,我们考虑传感器的放置来估计使用有限数量的传感器的 8 核微处理器的温度。提出了两种不同的矩阵:在左侧,矩阵是从已知热图的主成分分析中生成的,如 [31] 中所示;右边的矩阵是 [32] 中提出的二次采样 DCT 矩阵。阴影区域表示随机传感器放置误差条的正侧,使用超过 100 次实现的标准偏差测量。请注意,FrameSense 明显优于之前基于相干性的方法和其他贪心算法,特别是当传感器的数量接近估计参数的数量时,即 

     

    4 Matlab代码及文章详细阅读

    本文仅展现部分代码,全部代码及详细文章加数据见:🍞正在为您运送作品详情

    1. clear all;
    2. close all;
    3. %% 可视化
    4. addpath('./export_fig/')
    5. load('./data/tmaps_DCT_comp')
    6. %%
    7. gcf=figure(1);
    8. set(gcf,'Color',[1 1 1]);
    9. hold on
    10. h(1)=perc_plot( 10*log10(MSE_FP'),L,1)
    11. h(2)=perc_plot( 10*log10(MSE_det),L,7)
    12. h(3)=perc_plot( 10*log10(MSE_mutual_inf),L,5)
    13. h(4)=perc_plot( 10*log10(MSE_MSE'),L,3)
    14. h(5)=perc_plot( 10*log10(MSE_rnd'),L,2)
    15. h(6)=perc_plot( 10*log10(MSE_cohe'),L,4)
    16. hold off
    17. hLegend=legend(h,'FrameSense','Determinant','Mutual Information','MSE','Random','Coherence')
    18. axx=axis;
    19. axis([L(1),L(end),20,120]);
    20. legend('boxoff')
    21. hTitle = title ('带有 DCT 的热图的传感器放置');
    22. hXLabel = xlabel('传感器数量' );
    23. hYLabel = ylabel('MSE [dB]' );
    24. set( gca , ...
    25. 'FontName' , 'Helvetica' );
    26. set([hTitle, hXLabel, hYLabel], ...
    27. 'FontName' , 'Helvetica');
    28. set([hLegend, gca] , ...
    29. 'FontSize' , 14 );
    30. set([hXLabel, hYLabel] , ...
    31. 'FontSize' , 14 );
    32. set( hTitle , ...
    33. 'FontSize' , 16);
    34. pbaspect([16,9, 14])

     5 写在最后

    部分理论引用网络文献,若有侵权请联系博主删除。 

  • 相关阅读:
    LeetCode每日一题(502. IPO)
    判断多个多边形是否连通(方法一:原理)
    stm32cubemx hal学习记录:PWR 低功耗停止模式
    Rust学习日记(一)Cargo的使用
    使用 SwiftUI 构建可搜索列表,为您的 iOS 应用程序创建具有自动完成功能的可搜索列表(教程含源码)
    ROS从入门到精通系列(二十七)-- ros Parameter Server
    Web Api的两种风格,实战的建议 / 附:ABP中的处理
    MySQL 详解 存储过程 和 存储函数
    使用pyttsx3实现简单tts服务
    Python中的Tkinter(Python的GUI编程)
  • 原文地址:https://blog.csdn.net/weixin_46039719/article/details/126324344