物联网与射频识别技术,课程实验(五)

news2024/9/23 9:30:53

实验5—— 基于随机二进制树的防冲突算法的实现与性能分析

实验说明: 利用Python或Matlab模拟基于随机二进制树的防冲突算法; 分析标签数量k对遍历所有标签所需时间的影响; 分析标签ID的长度、分布对算法性能的影响; 利用Python或Matlab画出相应的曲线,并分析算法的优缺点。

 queryBinaryTree.py:

import random

from task5_randomBinary.Tag import Tag
import numpy as np
import matplotlib.pyplot as plt

font3 = {
    'family': 'SimHei',
    'weight': 'normal',
    'size': 20,
}


def cal(tagNum, idLen):
    """
    function: 计算标签数量和标签id长度对数据发送的影响
    :param tagNum: 标签数量
    :param idLen: 标签id长度
    :return:
    """

    tagList = []
    vis = []
    for i in range(tagNum):
        tag = Tag()
        strs = ''
        for j in range(idLen):
            t = random.randint(0, 1)
            strs += str(t)
        tag.id = strs
        tagList.append(tag)
        vis.append(False)
        # print(i, strs)

    stack = []
    strs = ''
    flag = 0
    cntSum = 0
    index = []
    cnt1 = 0  # 作为标志位
    while 1:
        cntSum += 1
        if cnt1 == 0:
            strs += '0'
            stack.append(1)
        else:
            strs = strs[0:-1]  #pop掉最后一个元素
            if len(stack) == 0:
                return cntSum
            t = stack.pop()
            strs += str(t)
        cnt0 = 0

        for i in range(tagNum):
            if tagList[i].id[0:len(strs)] == strs:
                cnt0 += 1  # 前缀id匹配的标签数量 即冲突数量
                index.append(i)

        if cnt0 == 0:  # 空时隙
            cnt1 = 1
        elif cnt0 == 1:  # 未冲突且刚好匹配
            flag += 1
            vis[index[0]] = True
            cnt1 = 1
        else:  # 为冲突时隙
            cnt1 = 0

        if len(strs) == idLen and cnt0 > 1:
            for j in index:
                vis[j] = True
                flag += 1

        if flag == tagNum:
            return cntSum

def main():
    tagNum = 250
    idLen = 300
    print('-------标签数量k对发送完所有标签时间的影响---------')

    ratio = []
    for i in range(1, tagNum):
        rate = []
        for j in range(3):
            t = cal(i, 10)  # 控制变量,默认所有标签的id长度为5
            rate.append(t)
        ratio.append(np.average(rate))
        print(i, ratio[i-1])

    plt.plot(np.arange(1, tagNum), ratio, color='b', linestyle='-', marker='*', linewidth=2.0)
    plt.xlabel('标签数量', font3)
    plt.ylabel('h发送完所有标签所需要的时间', font3)
    plt.show()

    print('-------标签长度对发送完所有标签时间的影响---------')

    ratio.clear()
    for i in range(5, idLen):
        rate = []
        for j in range(3):
            t = cal(10, i)  # 控制变量,默认标签数量为10
            rate.append(t)
        ratio.append(np.average(rate))

    plt.plot(np.arange(5, idLen), ratio, color='g', linestyle='-', marker='*', linewidth=2.0)
    plt.xlabel('标签的id长度', font3)
    plt.ylabel('h发送完所有标签所需要的时间', font3)
    plt.show()


if __name__ == '__main__':
    main()

randomBinaryTree.py:

"""
1.利用Python或Matlab模拟基于随机二进制树的防冲突算法;
2.分析标签数量k对遍历所有标签所需时间的影响;
3.分析标签ID的长度、分布对算法性能的影响;
4.利用Python或Matlab画出相应的曲线,并分析算法的优缺点。
"""
import random

from task5_randomBinary.Tag import Tag
import matplotlib.pyplot as plt
import numpy as np

font3 = {'family': 'SimHei',
         'weight': 'normal',
         'size': 20,
         }


def cal(tagNum, idLen):
    """
    function: 计算标签数量k对遍历所有标签所需时间的影响;分析标签ID的长度、分布对算法性能的影响
    :param tagNum:标签数量
    :return:所需时间
    """
    tagList = []
    for i in range(tagNum):
        tag = Tag()
        tag.slot = random.randint(0, 1)  # 跳过初始化为0的阶段,默认全部冲突,在0和1中随机选择一个数
        idStr = ''
        for j in range(idLen):
            t = random.randint(0, 9)
            idStr += str(t)
        tag.id = idStr
        tagList.append(tag)

    # for i in range(tagNum):
        # print(tagNum, tagList[i].slot, tagList[i].id)

    flag = 0  # 计数成功发送的标签个数
    cnt = 0  # 遍历所有标签所需时间
    index0 = []  # 用于计数此刻多少个标签slot为0
    index1 = []  # 用于计数此刻多少个标签slot为1
    index2 = []  # 用于计数此刻多少个标签slot>1
    while 1:
        index0.clear()
        index1.clear()
        index2.clear()
        cnt += 1
        t = None
        for i in range(tagNum):
            if not tagList[i].isSubmerge:   # 表明标签还没有沉默
                # print('coming')
                if tagList[i].slot == 0:
                    index0.append(i)
                elif tagList[i].slot == 1:
                    index1.append(i)
                elif tagList[i].slot > 1:
                    index2.append(i)
        # print(len(index0), len(index1), len(index2))
        if len(index0) == 0:  # 表明为空时隙
            t = -1
        elif len(index0) == 1:  # 表明为单时隙不冲突
            # print('标签{}成功发送数据'.format(tagList[index0[0]].id))
            tagList[index0[0]].isSubmerge = True
            flag += 1
            if flag == tagNum:
                return cnt
            t = -1

        else:  # 表明为冲突时隙
            for j in index0:
                # print(j, end=' ')
                tagList[j].slot = random.randint(0, 1)
            t = 1
            # print('\n')

        for j in index1:
            tagList[j].slot += t

        for j in index2:
            tagList[j].slot += t


def main():
    tagNum = 250
    idLength = 1000
    ratio = []

    print('----------标签数量k对遍历所有标签所需时间的影响----------')
    for i in range(1, tagNum):
        rate = []
        for j in range(3):
            t = cal(i, 4)
            rate.append(t)
        ratio.append(np.average(rate))
        print(i, ratio[i-1])

    plt.plot(np.arange(1, tagNum), ratio,  color='g', linestyle='-', marker='*', linewidth=2.0)
    plt.xlabel('标签数量', font3)
    plt.ylabel('发送完所有标签所需要的时间', font3)
    plt.show()


    print('----------标签数量k对遍历所有标签所需时间的影响----------')
    ratio.clear()
    for i in range(1, idLength):
        rate = []
        for j in range(3):
            t = cal(10, i)
            rate.append(t)
        ratio.append(np.average(rate))
        print(i, ratio[i-1])

    plt.plot(np.arange(1, idLength), ratio, color='b', linestyle='-', marker='*', linewidth=2.0)
    plt.xlabel('标签ID的长度、分布', font3)
    plt.ylabel('发送完所有标签所需要的时间', font3)
    plt.show()

if __name__ == '__main__':
    main()

基于二进制树的防冲突算法

基本思想:按照递归的方式将冲突的标签集合划分为两个子集,直到集合中只剩下一个标签为止。划分子集的算法有两种:

  • 让标签随机选择所属的集合——随机二进制树算法
  • 按照标签的标识符划分子集——查询二进制树算法

基于随机二进制树的防冲突算法:

  1. 随机二进制树算法需要每个标签维持一个计数器,计数器初始值为0。
  2. 在每一个时隙开始时,如果标签的计数器为0时,则立即发送自己的标识符,否则该时隙不响应。
  3. 一般标签被成功识别,则该标签进入沉默状态,对以后时隙的阅读器不再响应。
  4. 因此,第一个时隙的所有标签都会回复,因为它们的计数器此时都为0。
  5. 每一个时隙结束后阅读器会将自己接收到的时隙状态(冲突或者不冲突)反馈给标签,场内的标签根据反馈的结果对自己维持的计数器进行调整。

标签调整计数器的规则:

  • 如果该时隙为冲突时隙,那么参与响应的标签就会从0或1两个数字中随机选择一个,将其加到自己的计数器上;没有参与响应的标签直接将自己的计数器加1。这样冲突的标签集合会被分为两个集合,一个选0的集合和一个选1的集合。
  • 如果该时隙没有冲突发生,则表明该时隙为没有标签响应的空时隙或者是只有一个标签响应的单时隙。被成功识别的标签进入沉默状态,直到新的识别过程开始,而没有被成功识别的标签则将自己的计数器减一。阅读器重复以上过程,直到所有标签被识别为止。
  • 整个识别过程就像一棵二叉树的中序遍历
  • 随机二进制树算法,不存在标签饿死的问题。它通过不断地将产生冲突的标签集合划分为两个子集合,直到某一个集合中只有一个标签存在时,成功识别该标签。标签过程是随机的,只需要维持一个内部状态,即计数器

基于查询二进制树的防冲突算法:

  1. 查询二进制树算法是一个无状态协议,标签只需要根据阅读器广播的标识符前缀作比较,标签内部不需要维持任何状态。阅读器将维持一个二进制前缀,初始值为0。
  2. 每一个时隙开始时,阅读器广播该二进制前缀,标签将自己的标识符前几位与此二进制前缀进行比较,若相同则该标签发送标识符。否则标签保持沉默。
  3. 如果阅读器探测到有冲突发生,则在下次查询的时候将原来的二进制前缀后面加0或1,重新查询。
  4. 阅读器重复以上过程,直到识别完所有的标签。
  5. 整个标识过程就像是根据标签的标识符号建立一棵二叉树,又称为查询二叉树。

查询二进制树的协议的性能受标签标识符ID的长度以及分布的影响

参考链接:

(25条消息) 基于二进制树的防冲突算法_Caramel_biscuit的博客-CSDN博客_二进制树防碰撞算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/133396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MQTT+STM32+ESP8266-01s硬件传递的JSON数据到前端和后端出现中文乱码问题

最近在做一个关于MQTT相关毕设项目,数据传输过程中出现了中文乱码问题,大致就是硬件发送的JSON主题数据中包含中文(如下图1所示),软件后端和软件前端接受该主题数据后出现了中文乱码,出现乱码一般都是硬件传递到后端和前端的编码不一致导致的,所以前端和后端接受该JSON数据的时…

2023.1.1 学习周报

文章目录摘要文献阅读1.题目2.摘要3.问题和方案4.介绍5.方法5.1 Symbolic Description5.2 The Short-Term Memory Priority Model5.3 The STAMP Model5.4 The Short-Term Memory Only Model6.实验6.1 评价指标6.2 实验结果7.结论深度学习加性模型点积模型缩放点积模型双线性模型…

数值优化之凸函数

本文ppt来自深蓝学院《机器人中的数值优化》 目录 1 凸函数的性质 ​2 凸函数的性质 1 凸函数的性质 凸函数最重要的性质就是Jensens inequality,也就是琴生不等式。 若能取到等号则是凸函数,若不能取到等号则是强凸函数,若不等号相反,则…

spring session

文章目录Spring Session 架构及应用场景为什么要spring-sessionSR340规范与spring-session的透明继承Spring Session探索特点核心 APIservlet session 与 spring-session 关系webflux 与 spring session 的关系基于 Servlet 的 Spring Session 实现思考题背景1、注册到 Filter …

Java 并发编程知识总结【一】

JUC 是什么? java.util.concurrent 在并发编程中使用的工具类 concurrent:并发 1. 线程基础知识复习 1.1 进程(process) 进程是程序的一次执行过程,或是正在运行的一个程序。是一个动态的过程:有它自身的产生、存在和消亡的过程(生命周期…

【数据集7】全球人类住区层GHSL数据详解

全球人类住区层Global Human Settlement Layer 官网地址-GHSL - Global Human Settlement Layer 1 全球人类住区层GHS-SMOD Global human settlement layer-settlement model grid (GHS-SMOD):描述 epoch时段: 1975-2030年 5年一个周期resolution空间分辨率: …

Codeforces Round #833 (Div. 2)E. Yet Another Array Counting Problem(笛卡尔树+树形DP)

题目链接:Problem - E - Codeforces 样例输入: 4 3 3 1 3 2 4 2 2 2 2 2 6 9 6 9 6 9 6 9 9 100 10 40 20 20 100 60 80 60 60样例输出: 8 5 11880 351025663题意:给定一个长度为n的数组a[],对于每一个区间[l,r],这个…

[Python从零到壹] 六十一.图像识别及经典案例篇之基于纹理背景和聚类算法的图像分割

祝大家新年快乐,阖家幸福,健康快乐! 欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲…

尚医通-查询删除科室接口-添加查询删除排班接口实现(二十)

目录: (1)数据接口-查询和删除科室接口-功能实现 (2)数据接口-排版接口-功能实现 (1)数据接口-查询和删除科室接口-功能实现 查看医院系统中查询科室的对应的方法 查询条件需要用的类&#…

【数据结构】链式存储:链表

目录 🥇一:初识链表 🎒二、链表的实现(单向不带头非循环) 📘1.创建节点类 📒2.创建链表 📗3.打印链表 📕4.查找是否包含关键字key是否在单链表当中 📙…

Webpack核心概念

1. 核⼼概念 Entry Entry ⽤来指定 webpack 的打包⼊⼝。 依赖图的⼊⼝是 entry,对于⾮代码⽐如图⽚、字体依赖也会不断加⼊到依赖图中。 Entry 的⽤法: 1. 单⼊⼝:entry 是⼀个字符串; module.exports {entry: ./path/to/my…

若依框架-补充篇:Vuex全局状态管理Axios二次封装

在上一篇《若依框架:前端登录组件与图像验证码|用户登录逻辑》中的篇末,对Vuex全局状态管理、Axios二次封装部分介绍的较为粗略,因此就有了这个补充篇。 目录 Vuex全局状态管理 Vuex是什么? 如何理解“状态管理模式”&#xf…

【Java语法】之String类练习1

目录 1.字符串中的第一个唯一字符 2. 最后一个单词的长度 58. 最后一个单词的长度 3.验证回文串 4.字符串相加 5.小结: 1.字符串中的第一个唯一字符387. 字符串中的第一个唯一字符https://leetcode.cn/problems/first-unique-character-in-a-string/ 给定一个字符…

【免费开放源码】审批类小程序项目实战(活动申请详解)

第一节:什么构成了微信小程序、创建一个自己的小程序 第二节:微信开发者工具使用教程 第三节:深入了解并掌握小程序核心组件 第四节:初始化云函数和数据库 第五节:云数据库的增删改查 第六节:项目大纲以及制…

Mac下安装go

1.下载地址 ​​​​​​https://golang.google.cn/dl/ 2.安装Go 3.查看安装效果 go version go env 4.安装vscode和插件 4.1.安装vscode https://code.visualstudio.com/Download 4.2.安装GO插件 4.3.设置goproxy 执行命令:vim ~/.bash_profile export GO1…

数值分布的分散程度对迭代次数的影响

( A, B )---1*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有1个节点,AB各由7张二值化的图片组成,排列组合A和B的所有可能性,固定收敛误差为7e-4,统计收敛迭代次数 1 2 3 4 5 6 7 迭代次数 1b 1b 1b 1b 1b 1b 0 0*0*0…

PHP---文件上传

目录 一、文件上传的概念 二、文件上传的步骤 (1)表单的制作 三、$_FILES详解 (1)name (2)tmp_name (3)type (4)error (5)si…

YOLO v6:一个硬件友好的目标检测算法

本文来自公众号“AI大道理” YOLOv6 是美团视觉智能部研发的一款目标检测框架,致力于工业应用。 YOLOv6支持模型训练、推理及多平台部署等全链条的工业应用需求,并在网络结构、训练策略等算法层面进行了多项改进和优化,在 COCO 数据集上&…

一文轻松明白 Base64 编码原理

把图片丢进浏览器,打开sources能看到一长串字符串,这是图片的Base64编码。这一长串编码到底是怎么生成的呢? 我们接下来探索一下base64编码的原理 Base64 名称的由来 Base64编码要求把3个8位的字节(3824)转化为4个6…

C++代码编程学习(2):类和对象封装部分的两个案例-立方体与点圆位置

C类与对象 封装的学习 挺有趣的! 一、前言 昨日有点事忙了些,今天把昨天学习的两个案例给整理一下,C确实比较原始基础,在学习过程中需要好好总结分析与记录。 二、效果展示 案例一:设计立方体 立方体的面积和体积 用…