时隙(Slotted)-Aloha 算法将纯 ALOHA 算法的时间分为若干大小相等的时间间隙,时隙的设定和时隙开始命令由阅读器统一校准控制,每个时隙 ≥ 标签等待接收确认信息的时间长度,而 标签只能在时隙开始时发送标识符,标签要么成功发送,要么完全碰撞,避免了纯 ALOHA 算法中的部分冲突,碰撞周期减半,阅读器的吞吐量翻倍。时隙 Aloha 算法的代码实现 如下
# encoding=utf-8
import random
from CommonAlgrithom import *
from CommonClass import *
def randomTag(tagNums, totalTime, slot):
"""
:param tagNums: 总标签数量
:param slot: 时隙长度
:param totalTime: 规定的总时间
:return: 生成的标签列表
"""
tags = []
for i in range(tagNums):
tags.append(Tag(i + 1, random.randrange(0, totalTime, slot)))
tags.sort(key=lambda x: x.sendTime)
return tags
def slotAloah(tagNums, totalTime, slot, ackTime=1):
"""
:param tagNums: 总标签数量
:param totalTime: 规定的总时间
:param ackTime: 标签发送数据包后,所等待的确认时间
:param slot: 时隙长度
:return result: 包含两个数据的数组,分别为成功识别的标签数、碰撞次数
"""
tags = randomTag(tagNums, totalTime, slot)
result = [0] * 2 # 成功识别的标签数、碰撞次数
while len(tags) > 0 and tags[0].sendTime <= totalTime:
encounterIndex = []
for j in range(len(tags)):
if tags[j].sendTime == tags[0].sendTime: # 发生碰撞
encounterIndex.append(j)
if len(encounterIndex) > 1:
result[1] += 1
for index in encounterIndex:
tags[index].sendTime += random.randint(1, totalTime) * slot
tags.sort(key=lambda x: x.sendTime)
else:
print(f"成功识别标签id:{tags[0].id}")
result[0] += 1
tags.remove(tags[0])
encounterIndex.clear()
return result
tagNums = 1000 # 总标签数量
totalTime = 1000 # 规定的总时间
ack = 1 # 标签发送数据包后,等待确认的时间
slot = 2 # 时隙长度,每个标签都只能在时隙开始时发送数据包
result = slotAloah(tagNums, totalTime, slot, ack)
print(f"标签总数为:{tagNums} 总限时为:{totalTime} 时隙长度为:{slot}")
print(f"成功识别的标签个数为:{result[0]} 碰撞次数为:{result[1]}")