快速了解LEACH算法

论文:

  1. Energy-efficient communication protocol for wireless microsensor networks HICSS’00 (DOI: 10.1109/HICSS.2000.926982)
  2. 主要内容:LEACH 算法(Low-Energy Adaptive Clustering Hierarchy)

引入 (Section 1)

  1. 低功耗传感器网络
    1. 精度不高
    2. 节点小巧,便宜,节能,便于大范围部署
    3. 具有容错性(非静态网络)
    4. 通过本地的协作(Local collaboration)来减少带宽压力
  2. 模型假设:
    1. 基站固定,远离距离传感器
    2. 所有节点类型相同,主要受能量约束( energy-constrained)

      传输能耗计算 (Section 2)

      $ E_{elec} = 50nJ/bit $ 传输/接收电路运转所需能量,仅与二进制位数有关
      $ \epsilon_{amp} = 100nJ/bit/m^2 $ 传输放大器为了让接收者获得信号需要的能力,与二进制位数传输距离的平方成正比
      令$k$为传输二进制位数,$d$为Tx和Rx之间的距离
      $ E_{Tx}(k,d) = E_{elec}·k+\epsilon_{amp}k·d^2$
      $ E_{Rx}(k,d) = E_{elec}·k$
  • 传输会消耗大量能量
  • 要权衡好传输距离和传输信息的次数

两种简单协议 (Section 3)

  • 直接传输协议:node 1->Base Station

    我放弃手动输入了,你自己写到ppt里吧

  • 最小传输能量协议:node 1->node 2->··· ->node n -> Base Station

MATLAB模拟:随机100个节点的网络,基站位于(0,-100处)

$$ 网络直径- E_{elec}-整体能量消耗 $$

这个图其实看看就好了,重点关注节点的死亡

节点的死亡:假设每个节点的电量是相同,由于传输信息消耗电量,一定轮次后节点的能量消耗殆尽。

180轮后直接传输和MTE的剩余节点

两种协议的缺陷:节点死亡的不均匀。 这不是在传感网中我们期望看到的

分簇

传感器网络的组织:分簇

拓展星形拓扑结构

大量的末端传感器作为簇终端节点(Cluster Node),一个与终端节点进行数据交换的设备作为簇头节点(Cluster Head),两者构成一簇。一般来说,为了避免多个簇终端节点同时向基站的同一频道传送数据,减少冲突导致的崩溃和数据重发,往往会采用一个多余的设备,称为高级簇头节点(Super Cluster Head)。簇与簇间以链式多跳的方式来传递簇内数据,最终收集于高级簇头节点中。高级簇头节点中的数据则通过若干转发节点(Transefer Node)将数据传送到基站。

簇头节点会消耗更多的能量

  • 静态分簇:固定的簇头节点,能量消耗不均,健壮性差
  • 动态分簇:LEACH,通过数学方法保证每个节点等概率、轮流的成为簇头节点
    等概率:每个还未曾成为簇头的节点等概率的成为簇头

LEACH算法细节 (Section 5)

簇头节点的选择

$$ P:期望的簇头率$$
$$ r:当前轮数$$
$$ G:上1/p轮中曾被选为簇头的节点集$$
P相当于课本的$\frac{k}{N}$,通过matlab实验发现设定为0.05时最佳
r=0时,T(n)=P,所有节点等概率的成为簇头;r=$\frac{1}{P}-1$时T(n)=1,所有剩余节点都被选为簇头,保证了每$\frac{1}{p}$轮内所有节点都会被选为簇头


建立簇

  1. 每个节点独立地计算自己是否成为簇头
  2. 簇头节点通过非坚持CSMA协议向周围发送信号,宣布自己为簇头;非簇头节点保持通信,根据每个簇头节点发送的信号强度,选择强度最大(消耗能量最少)者为簇头,并将自己的加入该簇的信息告知簇头。

通信

  1. 建立通讯时间表,以时分多址(TDMA)方式进行簇间通信
  2. 簇头节点始终开启,非簇头节点在通信时间以外可以关闭,节省电量
  3. 簇头节点进行数据压缩,减少与基站之间通信消耗的电量

其他细节:

  1. 簇间信号干扰: 频分多址
  2. 多层簇

LEACH协议的效果 (Section 4)

  1. 能量消耗远小于Direct和MTE两种协议,消耗能量约为其八分之一
  2. 能量消耗更均匀,第一个节点死亡的时间延长了8倍
  3. 节点均匀的死亡,更符合传感网的要求

总结 (Section 4)

  1. LEACH 算法的特点
    1. 本地化的簇建立和交流
    2. 自组网
    3. 随机、轮转的选择簇头节点
    4. 本地的数据压缩
  2. 延申的研究:
    1. 考虑节点剩余能量:LEACH-C算法等
    2. 节省簇间的能量消耗:EEUC竞选算法

我捣鼓VScode之快捷键的增加/修改/查询/常用快捷键

对于喜欢用键盘解决一切的我来说,VScode 简直好用的不行。就仅仅是为了享受VScode的快捷键我已经决定将能在VScode上完成一切能完成的工作了😀

VScode中的快捷键基本操作

微软提供一个了一个网址: https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf 在这个网址中可以找到VScode在Windows下常用的快捷键。

这个网页也可以用快捷键Ctrl+K Ctrl+R在VScode用快捷键打开,或者选择Help-Keyboard Shortcut Reference打开

VScode支持自定义快捷键,默认的快捷键为Ctrl+K Ctrl+S,在设置中也可以打开

自定义快捷键

VScode及其扩展支持自定义各种快捷键,从上面那张图中可以看到不同每个快捷键分为这几个部分:

  • 响应的事件:与VScode/插件的各种操作相对应
  • 按键:对应的按键之间有可能会冲突,他们依靠后面的“when”进行区分,否则会发生冲突
  • 响应时机when:VScode支持在不同环境中相同的快捷键会有不同的操作,这些环境支持使用C风格的与或非操作进行连结,如"editorTextFocus && editorLangId == 'c'" ,关于有哪些“when”,可以去微软的官方文档(感觉不是很全)
  • 最后一栏的Source代表该快捷键的来源,应该是只有Default和User两种

VScode绝大多数快捷键都设置的挺好,只有少部分快捷键由于与Windows系统冲突,可能需要手动修改,例如代码提示默认的是Ctrl+Space,与切换输入法冲突了。

还有一种情况是由于when条件下无法触发,例如Ctrl+R的重启VScode默认的条件为isDeveloping,然而我无论如何都触发不了这个条件,所以最后把这个条件给取消掉了。

添加快捷键

如果想要添加原来没有的快捷键,可以点击setting中的右上角的{}(会有个“Open Keyboard shortcut(JSON)”的提示

不过就目前我遇到的,基本不不需要添加新的快捷键,只要谷歌一下就能找到原本是怎么设置的了。

常用的快捷键

下面是一些爆炸好用/常用的VScode快捷键,值得注意的是Shift键的用途,某个操作的快捷键带上Shift之后的操作往往是相对应的、相反的。

另外,并不是所有的快捷键都这么常用,每个人的使用习惯不一样,可以需要的时候再去查找适合的快捷键。能确定的是,VScode理论上是真的可以不需要鼠标的

文本编辑:

  • Ctrl+X/C/V 剪切,复制,粘贴(这三个都不知道就别写代码辣
  • Ctrl+/ 注释改行/除去该行注释
  • Shift 按住Shift时进行其他操作,可以做到选中一段文本的效果
  • Ctrl+A 全选
  • Ctrl+D 选中某一段文本后,按下Ctrl+D,可以同时选中下一段相同文本,例如:
  • Ctrl+Shift+\ 跳转到匹配的括号
  • Tab 缩进改行光标以后的部分
  • Ctrl+ [ / ] 向左/向右缩进改行,向左缩进相当于Shift+Tab
  • Ctrl+Shift+[ / ] 折叠/展开代码块
  • Ctrl+Shift+K 删除行

光标相关

  • Home/End 光标定位到行开头/结尾,笔记本电脑下一般为Fn+←/→
  • Ctrl+Home/End 光标定位到文档开头/结尾
  • Enter 光标起新行且光标后字符带入下行
  • Ctrl+Enter 光标起空白新行
  • Ctrl+Shift+Enter 光标起空白新行
  • Ctrl+↑/↓ 屏幕向上/下移动一行,相当于鼠标滚轮
  • Alt+↑/↓ 光标所在行向上/下移动
  • Alt+←/→ 光标回到之前/之后的位置
  • Alt+Shift+↑/↓ 向上/下复制光标所在行
  • Ctrl+Shift+Alt+↑/↓ 多行光标

查找/替换

  • Ctrl+F 当前文档查找
  • Ctrl+H 当前文档替换
  • Ctrl+Shift+F 当前workspace搜索
  • Ctrl+Shift+H 当前workspace替换

文件操作

下面的操作中,很多都是与浏览器的页面操作是相同的

  • Ctrl+N 打开一个空白文档,此时如果Ctrl+S就能保存文档并命名和设定路径
  • Ctrl+Shift+N 打开一个新的VScode窗口
  • Ctrl+W 关闭当前文件
  • Ctrl+Shift+T 恢复上一次关闭的页面
  • Ctrl+S 保存文档
  • Ctrl+Shift+S 另存为文档
  • Ctrl+O 打开文件
  • Ctrl+K Ctrl+O 打开新的文件夹(进入另一个Workspace)
  • Ctrl+E 快速打开浏览记录并选择文件重新打开

页面操作

  • Ctrl+数字 切换到第_个标签页(Tab)
  • Ctrl+Tab 切换到下一个标签页
  • Ctrl+Shift+Tab 切换到上一个标签页
  • Ctrl+\ 拆分当前页面,在侧面打开(Split),每个页面被称作Group,一个Group下有多个Tab
  • Ctrl+K ←/→ 当前Group左移/右移
  • Ctrl+K Ctrl+ ←/→ 光标focus on左侧/右侧的Group
  • Ctrl+PageUp/PageDown 切换Tab,但能跨越不同的Group,比上面那条指令要好用多了。

VScode界面操作

这是一些与平常的文本编辑没什么关系,但还是比较常用的操作

  • Ctrl+K Ctrl+S 打开快捷键列表

  • Ctrl+B 打开侧边栏/关闭侧边栏

    这个就是侧边栏

  • Ctrl+J 打开/关闭底部栏(我也不确定他的名字)

    反正就是这个东西

  • Ctrl+ ` 打开Terminal,效果和上面的类似

  • Ctrl+, 打开设置

  • F11 VScode全屏,享受沉浸式代码体验

  • F1/[Ctrl+Shift+P] 打开VScode命令行

  • Ctrl+R 重启VScode,在遇到一些Go to definition失效/代码提示失效之类的问题时尤其好用,不过我的情况是需要把触发的When改成无条件启动,否则无法生效

    上面一行就是我新增的,下面一行是默认的

代码的运行与调试

  • F5 调试运行
  • Ctrl+F5 直接运行,但如果打上了断点好像还是会调试….
  • Ctrl+Shift+F5 重新运行
  • Shift+F5 停止
  • F11 Step Into
  • Shift+F11 Step Out
  • F10 Step Over

参考

以上内容已经能解决目前我遇到的问题,更多资料可以参考https://code.visualstudio.com/docs/getstarted/keybindings