实验3—— 时隙ALOHA(S-ALOHA)算法的实现及其性能分析
实验说明: 1. 利用Python或Matlab模拟时隙ALOHA算法; 分析标签数量k、时隙大小t对信道利用率的影响,其中, 信道利用率=发送数据的时间/(发送数据的时间+信道空闲的时间) 3. 利用Python或Matlab画出相应的曲线,并分析算法的优缺点。
纯aloha:
对于局域网LAN,反馈信息很快就可以得到;而对于卫星网,发送方要在 270ms 后才能确认数据发送是否成功。通过研究证明,纯ALOHA协议的信道利用率最大不超过18.4%(1/2e )
时隙Aloha:
信道效率:冲突危险区是纯ALOHA的一半,所以,与纯ALOHA协议相比,降低了产生冲突的概率,信道利用率最高为36.8%。
重发策略:同纯ALOHA ,等待一段随机的时间,然后重发;如再次冲突,则再等待一段随机的时间,直到重发成功为止。
代价:需要全网同步;可设置一个特殊站点,由该站点发送时钟信号
时隙Aloha为什么冲突危险区是纯ALOHA的一半?
因为将时间离散化,所以发生重叠的可能性很小,只有完全在同一个区域内发送才会出现冲突,因此冲突危险区是纯ALOHA的一半
slottedALOHA.py:
import numpy as np
import matplotlib.pyplot as plt
import random
from task3_slottedALOHA.Tag import Tag
font3 = {'family': 'SimHei',
'weight': 'normal',
'size': 20,
}
slotLength = 10
def cal(tagNum, slotLen):
"""
function: 计算标签数量为tagNum、时隙大小slotLen时的信道利用率
:param tagNum: 标签数量
:param slotLen: 时隙大小
:return: 返回信道利用率
"""
tagList = []
vis = []
for i in range(tagNum):
tag = Tag()
tagList.append(tag)
tag.slot = random.randint(1, 125)
vis.append(False)
ratio = []
while 1:
flag = 0
cnt = 0
index = []
for i in range(tagNum):
if vis[i]: # 表明该标签已经静默
flag += 1
else:
if tagList[i].slot == 0:
cnt += 1
index.append(i)
tagList[i].slot -= 1
if cnt == 1: # 表明只有一个标签在该时隙发送数据
vis[index[0]] = True
ratio.append(slotLength/slotLen)
elif cnt > 1: #表明发生碰撞
for i in index:
if vis[i] == False: #表明该标签数据尚未发送完毕
tagList[i].slot = random.randint(1, 250)
ratio.append(0)
else:
ratio.append(0)
if flag == tagNum:
break
print(tagNum, np.average(ratio))
return np.average(ratio) # 1.2是为了逼近36.8
def main():
print('---------------标签数量k对信道利用率的影响--------------')
tagNum = 250
ratio = []
for i in range(1, tagNum*2):
rate = []
for j in range(3):
t = cal(i, slotLength)
rate.append(t)
ratio.append(np.average(rate))
plt.plot(np.arange(1, tagNum*2), ratio, color='r', linestyle='--', marker='*', linewidth=2.0)
plt.xlabel('标签数量', font3)
plt.ylabel('信道利用率', font3)
plt.show()
print('---------------时隙大小t对信道利用率的影响--------------')
ratio.clear()
for i in range(slotLength, slotLength+100):
rate = []
for j in range(3):
t = cal(100, i)
rate.append(t)
ratio.append(np.average(rate))
plt.plot(np.arange(slotLength, slotLength+100), ratio, color='b', linestyle='-', marker='*', linewidth=2.0)
plt.xlabel('时隙大小', font3)
plt.ylabel('信道利用率', font3)
plt.show()
if __name__ == '__main__':
main()
Tag.py没用,可以不用管
参考资料: