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

验原理:随机二进制树算法需要每个标签维持一个计数器,计数器初始值为 0。
在每一个时隙开始时,如果标签的计数器为 0 时,则立即发送自己的标识符,否则该时隙不响应。
一般标签被成功识别,则该标签进入沉默状态,对以后时隙的阅读器不再响应。因此,第一个时隙的所有
标签都会回复,因为它们的计数器此时都为 0。每一个时隙结束后阅读器会将自己接收到的时隙状态(冲突
或者不冲突)反馈给标签,场内的标签根据反馈的结果对自己维持的计数器进行调整。
随机二进制树算法中标签不存在饿死的情况,但是标签需要维护一个内部状态,即计数器的值。查询二进
制树的算法中标签也不会存在饿死的情况,但是算法性能受到标签的标识符的长度影响,并且通常比 ALOHA
的算法需要更长的时间

import random
class RFID_king:
 def __init__(self, id, counter, iscall, isrg):
 self.id = id
 self.counter = counter
 self.iscall = iscall
 self.isrg = isrg
 def showinfo(self):
 print('id', self.id,
 'counter', self.counter,
 'iscall', self.iscall,
 'isrg', self.isrg)rfids = []
x = random.randint(1000, 1111)
for i in range(0, 100):
 rfid = RFID_king(x + i, 0, False, False)
 rfids.append(rfid)
ids = []
while 1:
 for i in range(0, len(rfids)):
 if rfids[i].counter == 0:
 rfids[i].iscall = True
 ids.append(rfids[i])
 else:
 pass
 if len(ids) > 1:
 ids = []
 for i in range(0, len(rfids)):
 if rfids[i].iscall:
 rfids[i].counter = rfids[i].counter + random.randint(0,1)
 rfids[i].iscall = False
 else:
 if len(ids) == 1:
 a = ids[0]
 a.showinfo()
 ids = []
 if len(rfids) > 1:
 rfids.remove(a)
 for i in range(0, len(rfids)):
 rfids[i].counter = rfids[i].counter - 1
 else:
 print("所有标签识别完毕")
 break
 else:
 for i in range(0, len(rfids)):
 rfids[i].counter = rfids[i].counter - 1
#画 标签数-时间:
import random
import time
import matplotlib.pyplot as plt
import numpy as np
class RFID_king:
 def __init__(self, id, counter, iscall, isrg):
 self.id = id
 self.counter = counter
 self.iscall = iscall
 self.isrg = isrg
 def showinfo(self):
 print('id', self.id, 'counter', self.counter,
 'iscall', self.iscall,
 'isrg', self.isrg)
rfids = []
times = []
for m in range(1,101):
 start = time.time()
 x = random.randint(1000, 1111)
 for i in range(0, m):
 rfid = RFID_king(x + i, 0, False, False)
 rfids.append(rfid)
 ids = []
 while 1:
 for i in range(0, len(rfids)):
 if rfids[i].counter == 0:
 rfids[i].iscall = True
 ids.append(rfids[i])
 else:
 pass
 if len(ids) > 1:
 ids = []
 for i in range(0, len(rfids)):
 if rfids[i].iscall:
 rfids[i].counter = rfids[i].counter + random.randint(0, 1)
 rfids[i].iscall = False
 else:
 if len(ids) == 1:
 a = ids[0]
 a.showinfo()
 ids = []
 if len(rfids) > 1:
 rfids.remove(a)
for i in range(0, len(rfids)):
 rfids[i].counter = rfids[i].counter - 1
 else:
 print("所有标签识别完毕")
 times.append(time.time()-start)
break
 else:
 for i in range(0, len(rfids)):
 rfids[i].counter = rfids[i].counter - 1
plt.figure(figsize=(8,4))
x=np.linspace(1,101,100)
y=np.array(times)
plt.xlabel('标签 ID 的长度')
plt.ylabel('标签所需时间')
plt.plot(x,y)
plt.show()
for i in range (0,100): print(times[i])
#画 id 长度 - 时间:
import random
import time
import matplotlib.pyplot as plt
import numpy as np
class RFID_king:
 def __init__(self, id, counter, iscall, isrg):
 self.id = id
 self.counter = counter
 self.iscall = iscall
 self.isrg = isrg
 def showinfo(self):
 print('id', self.id,
 'counter', self.counter,
 'iscall', self.iscall,
 'isrg', self.isrg)
rfids = []
times = []
for m in range(1,101):
 start = time.time()
 x = random.randint(10000000000**m, 10000000000**m+1)
 for i in range(0, 100):
 rfid = RFID_king(x + i, 0, False, False)
 rfids.append(rfid)
 ids = []
 while 1:
 for i in range(0, len(rfids)):
 if rfids[i].counter == 0:
 rfids[i].iscall = True
 ids.append(rfids[i])
 else:
 pass
 if len(ids) > 1:
 ids = []
 for i in range(0, len(rfids)):
 if rfids[i].iscall:
 rfids[i].counter = rfids[i].counter + random.randint(0, 1)
 rfids[i].iscall = False
 else:
 if len(ids) == 1:
 a = ids[0]
 a.showinfo()
 ids = []
 if len(rfids) > 1:
 rfids.remove(a)
for i in range(0, len(rfids)):
 rfids[i].counter = rfids[i].counter - 1
 else: print("所有标签识别完毕")
 times.append(time.time()-start)
break
 else:
 for i in range(0, len(rfids)):
 rfids[i].counter = rfids[i].counter - 1
plt.figure(figsize=(8,4))
x=np.linspace(11,10**m,100)
y=np.array(times)
plt.xlabel('标签 ID 的长度\'s id')
plt.ylabel('标签所需时间')
plt.plot(x,y)
plt.show()
for i in range(0,100):
 print(times[i])

运行结果:
在这里插入图片描述
在这里插入图片描述
总结:
基于二进制树的防冲突算法:按照递归的方式将冲突的标签集合划分为两个子集,直
到集合中只剩下一个标签为止。划分子集的算法:随机二进制树算法:让标签随机选择所属的集合查询二进制树算法:按照标签的标示符划分子集。特点:算法简单,不需要存储中间状态变量,标签识别时延受
标签 ID 分布及长度影响。基于 ALOHA 防冲突算法的优点:算法简单、标签识别性能好、结果可进⾏系统
性分析;缺点:标签可能被“饿死”、最坏情况时延趋近+∞。
基于⼆进制树防冲突算法的优点:算法简单、不需要存储中间状态变量;缺点:标签识别时延受标签 ID 分
布及长度影响。
刚开始不知道怎么做?通过几次跟同学交流后,有了一点过的思路了

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值