Bianchi模型、python计算及ns3验证
由于项目与学习需要,最近学习了bianchi模型,并在python中进行了公式->代码的转化,仿真结果与ns3结果对比。
本文更多的是理解模型各个部分的含义、把各个简单的推导过程转化为python、ns3对比:
1 理论吞吐与传输概率、传输成功概率、包长、速率、排队时间、成功传输时间、碰撞耗时的关系
2 传输概率、传输成功概率、包长、速率、排队时间、成功传输时间、碰撞耗时的关系这几个参数的简单推导
3 各个公式都有最初的已知量、推导出的中间量、最终的目标吞吐,一级一级的整理就可获得最初已知量和目标吞吐的关系,并将其画图
4 ns3在无实测环境的情况下,是一个比较好的验证环境,对比第三步的图以及仿真结果图,可以验证模型是否符合实测情况
而事实上,建模的标准流程就是以上步骤:根据初始变量、各种场景,列出基本的推导->根据中间量导出吞吐或者延时->算出各个情况下吞吐、延时结果,描点画出折线->ns3设置同样的条件,仿真对应的延时吞吐结果,描点并证明自己的模型可靠
分为3部分
本文为第一部分
第二部分是Bianchi模型、python计算及ns3验证_关于E[P*]的补充-CSDN博客
第三部分是验证2~10 STA的情况下,bianchi和ns3对比结果Bianchi模型、python计算及ns3验证_关于2~10 STA验证的补充-CSDN博客
bianchi模型简要说明
来源:
https://zhuanlan.zhihu.com/p/24302361https://zhuanlan.zhihu.com/p/24302361
结合2步骤中的python代码看公式:
预设
self.bitrate = 56E6#传输速率,如连续传输56Mbit,需要1s
self.n = 30#STA数目self.b00 = 0#马尔科夫链回到 0 0状态的概率self.ACK = 14 * 8#ack包长度 bit
self.SIFS = 10E-6#sifs时间 10us
self.slot = 9E-6#9us
self.DIFS = 3 * 9E-6#difs时间 3*slot
self.H = 2 * 8#头长度 bitself.E_P = 80#平均包长
self.E_P_star = 100#碰撞包最长平均包长self.W = 12#初始化窗口大小
self.m = 7#最大退避轮次self.prop_delay = 0#传播时延
在开始计算前再初始化一次:
bitrate = 1E6
ACK = 112 + 128
SIFS = 28E-6
slot = 50E-6
DIFS = 128E-6
E_P = 8184
E_P_star = E_P
WW = [32, 128]
mm = [3, 5]
H = 272 + 128
prop_delay = 0nn = range(5, 50)
self.calculate_p_t()
计算冲突概率p和某个STA的发送概率τ:
def calculate_p_t(self):def equations(x):p, t = xmy_sum = 0.0for i in range(0, self.m):my_sum += (2.0 * p) ** i
##p - 1.0 + (1.0 - t) ** (self.n - 1.0),
##2.0 / (1.0 + self.W + p * self.W * my_sum) - t return ( p - 1.0 + (1.0 - t) ** (self.n - 1.0), 2.0 / (1.0 + self.W + p * self.W * my_sum) - t )self.p, self.t = fsolve(equations, (0.1, 0.1))print("System solved, error (p, tau): " + str(equations((self.p, self.t))))
其中起始窗口Wmin、最大重试次数m、STA数目n都是已知的。
my_sum 是Σ求和结果,calculate_p_t联立以上公式并求出p与t的结果——上式只有p和τ两个未知数,可以解出结果。
self.calculate_Ptr()
def calculate_Ptr(self):self.P_tr = 1.0 - (1.0 - self.t) ** self.n
计算n个STA,除了大家都没尝试传输以外的情况——有一个或多个STA尝试传输——其中包含传输成功和碰撞两种情况。
中间值已知
self.calculate_Ps()
def calculate_Ps(self):self.Ps = self.n * self.t * (1.0 - self.t) ** (self.n - 1) / self.P_tr
计算在有STA传输的情况下,只有一个STA尝试传输而其他STA都没尝试传输的概率,共有n个STA,所以是n倍。
self.calculate_Ts()
def calculate_Ts(self):self.T_s = self.H / self.bitrate + self.E_P / self.bitrate + self.SIFS + self.prop_delay + self.ACK / self.bitrate + self.DIFS + self.prop_delay
self.calculate_Tc()
def calculate_Tc(self):self.T_c = self.H / self.bitrate + self.E_P_star / self.bitrate + self.DIFS + self.prop_delay
Ts是成功传输耗时,Tc是碰撞传输耗时,其中H是头用时,EP是负载也就是数据部分用时,ack是回ACK用时,SIFS是负载和ack之间的等待延时,DIFS是传输成功或传输收不到ack之后的等待延时 、δ是传播时延——不过事实上SIFS和DIFS本来就是等传播时延的时间,传播时延含了,所以self.prop_delay = 0
其中Tc的计算Ep*是碰撞包的最长包的平均值,如果假设所有的包长都相等,则Ep=Ep*,我们这里取值(如不假设包长相等,参看Bianchi模型、python计算及ns3验证_关于E[P*]的补充-CSDN博客文章浏览阅读21次。bianchi的原文,在包长都选一样的情况下,P=E[P]=E[P*],也就是说正常传输、碰撞的payload耗时都是一样的——不过bianchi分析了如果引入不同的长度会造成何种影响:k个STA包碰撞的情况下,决定E[P*]的是k个STA中时间占用最长的那个,事实上此公式很让人不解,左侧需要求值是平均最大包长,右边分母是概率,分子左半边也是概率,分母右半边如果按照PDF看的话也是概率,如果按照CDF看就是概率的积分,再乘以1作为取值,就合理了。https://blog.csdn.net/Mr_liu_666/article/details/142748859)
self.E_P = 80self.E_P_star = 100
Ep Ep* H ACK的长度都已知,除以已知的bitrate就是对应时间,δ DIFS SIFS都已知
self.calculate_S()
def calculate_S(self):self.S = self.Ps * self.P_tr * (self.E_P / self.bitrate) / ((1.0 - self.P_tr) * self.slot + self.P_tr * self.Ps * self.T_s + self.P_tr * (1.0 - self.Ps) * self.T_c)
中间值都已知
self.calculate_b00()
def calculate_b00(self):self.b00 = 2.0 * (1.0 - 2.0 * self.p) * (1.0 - self.p) / ((1.0 - 2.0 * self.p) * (self.W + 1) + self.p * self.W * (1.0 - (2.0 * self.p)**self.m))
初始窗口W、最大退避重试次数m已知,中间量已知
python公式化
来源:
https://github.com/segmentation-fault/BianchiPy/blob/master/calculate_bianchi_tr.pyhttps://github.com/segmentation-fault/BianchiPy/blob/master/calculate_bianchi_tr.py
源码内容:
__author__ = 'antonio franco''''
Copyright (C) 2018 Antonio Franco (antonio_franco@live.it)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
'''from scipy.optimize import fsolve
import matplotlib.pyplot as pltclass Bianchi:# Calculates the throughput of a saturated IEEE 802.11 WLAN basic scheme according to:# G.Bianchi, "Performance analysis of the IEEE 802.11 distributed coordination function," in IEEE# Journal on Selected Areas in Communications, vol. 18, no. 3, pp. 535 - 547, March 2000.# doi: 10.1109 / 49.840210def __init__(self, bitrate, n, ACK, SIFS, slot, DIFS, E_P, E_P_star, W, m, H, prop_delay):# INPUT:# bitrate: raw bitrate in bps# n: number of STAs# ACK: ACK length in bits# SIFS: SIFS duration in seconds# slot: slot duration in seconds# DIFS: DIFS duration in seconds# E_P: average packet payload size in bits# E_P_star: average length of the longest packet payload involved in a collision in bit (for an example, see eq. 16 in the paper)# W: Minimum contention window size in slots# m: Retry limit# H: Header size in bits# prop_delay: Propagation delay in seconds## OUTPUT:# S: normalized system throughput, defined as the fraction of time the channel is used to successfully transmit payload bits.# p: the probability of a collision seen by a packet being transmitted on the channel# t: the probability that a station transmits in a randomly chosen slot time# Ps: the probability that a transmission occurring on the channel is successful is given by the probability that exactly one station transmits on the channel, conditioned on the fact that at least one station transmits# P_tr: the probability that there is at least one transmission in the considered slot time# T_s: the average time the channel is sensed busy, in seconds# T_c: the average time the channel is sensed busy by each station during a collision in seconds.# independent varzself.bitrate = 56E6self.n = 30self.b00 = 0self.ACK = 14 * 8self.SIFS = 10E-6self.slot = 9E-6self.DIFS = 3 * 9E-6self.H = 2 * 8self.E_P = 80self.E_P_star = 100self.W = 12self.m = 7self.prop_delay = 0# dependent varzself.p = 0self.t = 0self.Ps = 0self.P_tr = 0self.T_s = 0self.T_c = 0self.S = 0self.bitrate = bitrateself.n = nself.ACK = ACKself.SIFS = SIFSself.slot = slotself.DIFS = DIFSself.E_P = E_Pself.E_P_star = E_P_starself.W = Wself.m = mself.H = Hself.prop_delay = prop_delayself.calculate_p_t()self.calculate_Ptr()self.calculate_Ps()self.calculate_Ts()self.calculate_Tc()self.calculate_S()self.calculate_b00()def calculate_b00(self):self.b00 = 2.0 * (1.0 - 2.0 * self.p) * (1.0 - self.p) / ((1.0 - 2.0 * self.p) * (self.W + 1) + self.p * self.W * (1.0 - (2.0 * self.p)**self.m))def calculate_b(self, i, k):if i < self.m:W_i = 2.0 ** i * self.Wb_i0 = self.p ** i * self.b00else:W_i = 2.0 ** self.m * self.Wb_i0 = self.p ** self.m / (1 - self.p) * self.b00return (W_i - k) / W_i * b_i0def check_p_t(self):c1 = self.p - 1.0 + (1.0 - self.t) ** (self.n - 1.0) <= 1.49012e-08my_sum = 0.0for i in range(0, self.m):my_sum += (2.0 * self.p) ** ic2 = 2.0 / (1.0 + self.W + self.p * self.W * my_sum) - self.t <= 1.49012e-08return c1 and c2def calculate_p_t(self):def equations(x):p, t
相关文章:

Bianchi模型、python计算及ns3验证
由于项目与学习需要,最近学习了bianchi模型,并在python中进行了公式->代码的转化,仿真结果与ns3结果对比。 本文更多的是理解模型各个部分的含义、把各个简单的推导过程转化为python、ns3对比: 1 理论吞吐与传输概率、传输成功概率、包长、速率、排队时间、成功传输时…...

SQL常用语法
SQL(Structured Query Language)是一种用于存储、操作和检索数据库中数据的标准编程语言。以下是一些常用的 SQL 语法: 数据库操作 创建数据库:CREATE DATABASE database_name;删除数据库:DROP DATABASE database_name…...

计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...

浏览器前端向后端提供服务
WEB后端向浏览器前端提供服务是最常见的场景,前端向后端的接口发起GET或者POST请求,后端收到请求后执行服务器端任务进行处理,完成后向前端发送响应。 那浏览器前端向后端提供服务是什么鬼? 说来话长,长话短说。我在人…...

文本到语音或视频的构想
₦X8s43Y1iIquVAeF₦ 在Python中,有几个库和模块可以用来实现文本到语音的转换,并且可以生成带有背景音乐的视频。以下是一些可用的库: 1. pyttsx3:这是一个离线文本到语音转换库,它支持多种语音引擎,不依…...

请解释一下数据库的分区和分片?请解释一下数据库的日志和日志的重要性?
请解释一下数据库的分区和分片? 数据库的分区和分片是两种用于提高数据库性能和可扩展性的技术,它们各自具有不同的特点和应用场景。以下是对这两种技术的详细解释: 一、数据库分区 定义: 数据库分区是将一个大型的数据库表或索…...

windows C++-创建数据流代理(二)
完整的数据流演示 下图显示了 dataflow_agent 类的完整数据流网络: 由于 run 方法是在一个单独的线程上调用的,因此在完全连接网络之前,其他线程可以将消息发送到网络。 _source 数据成员是一个 unbounded_buffer 对象,用于缓冲…...

大数据毕业设计选题推荐-个性化图书推荐系统-Python数据可视化-Hive-Hadoop-Spark
✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…...

【Redis入门到精通九】Redis中的主从复制
目录 主从复制 1.配置主从复制 2.主从复制中的拓扑结构 3.主从复制原理 4.主从复制总结 主从复制 在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到其他服务器,满⾜故障恢复和负载均衡等需求。Redis 也是如此,它为我们提…...

系统架构设计师论文《论企业应用系统的数据持久层架构设计》精选试读
论文真题 数据持久层(Data Persistence Layer)通常位于企业应用系统的业务逻辑层和数据源层之间,为整个项目提供一个高层、统一、安全、并发的数据持久机制,完成对各种数据进行持久化的编程工作,并为系统业务逻辑层提…...

策略模式和模板模式的区别
目录 一、实现方式 策略模式 模板模式 二、使用场景 三、优点 四、举例 一、实现方式 策略模式 定义策略接口 Strategy创建具体策略类 OperationAdd、OperationSubtract、OperationMultiply创建一个上下文类 Context,包含一个策略对象的引用,并通…...

【ubuntu】ubuntu20.04安装conda
1.下载 安装参考:https://blog.csdn.net/weixin_44119391/article/details/128577681 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 2.安装 sudo chmod 777 -R ./Anaconda3-5.3.1-Linux-x86_64.sh ./Anaconda3-5.3.1-Linux-x86_64.sh Enter键确认安装…...

使用 SAP ABAP Webdynpro 实现 ABAP Push Channel 的 Web Socket 客户端
本系列前三篇文章,笔者向大家介绍了基于 ABAP Push Channel(简称 APC)的 TCP Socket 服务器端和客户端的编程,以及 Web Socket 的服务器端实现。 使用 ABAP 实现 TCP Socket 编程 (1) - 客户端部分的实现使用 ABAP 实现 TCP Socket 编程 (2) - 服务器端部分的实现使用 ABAP 实…...

15分钟学 Python 第41天:Python 爬虫入门(六)第二篇
Day41:Python爬取猫眼电影网站的电影信息 1. 项目背景 在本项目中,我们将使用 Python 爬虫技术从猫眼电影网站抓取电影信息。猫眼电影是一个知名的电影信息平台,提供了丰富的电影相关数据。通过这个练习,您将深入学习如何抓取动…...

电脑提示d3dcompiler_47.dll缺失怎么修复,仔细介绍dll的解决方法
1. d3dcompiler_47.dll 概述 1.1 定义与作用 d3dcompiler_47.dll 是 Microsoft DirectX 的一个关键组件,作为一个动态链接库(DLL)文件,它在 Windows 操作系统中扮演着至关重要的角色。DirectX 是一套由微软开发的用于处理多媒体…...

CPU中的寄存器是什么以及它的工作原理是什么?
在计算机科学中,寄存器是数字设备中的一个重要组成部分,它用于存储数据和指令以快速处理。寄存器充当临时存储区,信息可以在这里被快速访问和操作,以执行复杂任务。寄存器是计算机中最基础的存储类型,它们在帮助机器高…...

【EXCEL数据处理】000021 案例 保姆级教程,附多个操作案例。EXCEL文档安全性设置。
前言:哈喽,大家好,今天给大家分享一篇文章!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【EXCEL数据处理】000021 案例 保姆级教程,附多个操作案例。…...

windows7 32bit安装JDK以及EclipseEE
如果你的电脑是 Windows 7 32-bit 系统,那么需要下载并安装适用于 32-bit 系统的 JDK 和 Eclipse EE。以下是具体的步骤和下载链接: 1. 下载并安装适用于 Windows 32-bit 的 JDK 1.1 下载适用于 32-bit 的 JDK Oracle 不再提供最新版本的 32-bit JDK&…...

Python中的Enum
Python中的Enum Enum(枚举)在很多应用场景中都会出现,因此绝大部分编程语言都实现了Enum类型,Python也不列外,但列外的是Enum在Python3.4中才被正式支持,我们先来看看Python3中的Enum是怎么使用的。 枚举的…...

于BERT的中文问答系统12
主要改进点 日志配置: 确保日志文件按日期和时间生成,便于追踪不同运行的记录。 数据处理: 增加了对数据加载过程中错误的捕获和日志记录,确保程序能够跳过无效数据并继续运行。 模型训练: 增加了重新训练模型的功…...

基于SpringBoot“花开富贵”花园管理系统【附源码】
效果如下: 系统注册页面 系统首页界面 植物信息详细页面 后台登录界面 管理员主界面 植物分类管理界面 植物信息管理界面 园艺记录管理界面 研究背景 随着城市化进程的加快和人们生活质量的提升,越来越多的人开始追求与自然和谐共生的生活方式…...

MySQL连接查询:自连接
先看我的表结构 emp表 自连接也就是把一个表看作是两个作用的表就好,也就是说我把emp看作员工表,也看做领导表 自连接 基本语法 select 字段列表 FROM 表A 别名A JOIN 表A 别名B ON 条件;例子1:查询员工 及其 所属领导的名字 select a.n…...

Prometheus+Grafana备忘
Grafana安装 官网 https://grafana.com/grafana/download 官网提供了几种安装方式,我用最简单的 yum install -y https://dl.grafana.com/enterprise/release/grafana-enterprise-11.2.2-1.x86_64.rpm启动 //如果需要在系统启动时自动启动Grafana,可以…...

基于ssm实现的建筑装修图纸管理平台(源码+文档)
项目简介 基于ssm实现的建筑装修图纸管理平台,主要功能如下: 技术栈 后端框框:spring/springmvc/mybatis 前端框架:html/JavaScript/Css/vue/elementui 运行环境:JDK1.8/MySQL5.7/idea(可选)…...

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-07目录1. Evaluation of Large Language Models for Summarization Tasks in the Medical Domain: A Narrative Review摘要研究…...

Mahalanobis distance 马哈拉诺比斯距离
马哈拉诺比斯距离(Mahalanobis Distance)是一种衡量点与分布之间距离的度量,尤其适用于多维数据。与欧几里得距离不同,马哈拉诺比斯距离考虑了数据的协方差结构,因此在统计分析和异常值检测中非常有用。 定义 给定一…...

R语言绘制直方图
直方图是一种统计图表。它将数据分成若干区间,统计每个区间内数据的数量或频率,用矩形条高度表示。能直观展现数据分布特征,如集中趋势、离散程度等。在数据分析、质量控制、市场调研等领域广泛应用,可帮助人们快速了解数据整体形…...

论文阅读笔记-LogME: Practical Assessment of Pre-trained Models for Transfer Learning
前言 在NLP领域,预训练模型(准确的说应该是预训练语言模型)似乎已经成为各大任务必备的模块了,经常有看到文章称后BERT时代或后XXX时代,分析对比了许多主流模型的优缺点,这些相对而言有些停留在理论层面,可是有时候对于手上正在解决的任务,要用到预训练语言模型时,面…...

求二叉树的带权路径长度
二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之和。给定一棵二叉树T,采用二叉链表存储。结点结构为: 其中叶结点的weight域保存该结点的非负权值。设root为指向T的根结点的指针,请设计求T的WPL的算法…...

Hive数仓操作(十五)
Hive 开窗函数 Hive窗口函数是一种特殊的函数,允许用户在查询中对一组行进行计算,而不仅仅是单独的行。窗口函数可以在 SQL 查询中进行聚合、排名、累积计算等。这使得窗口函数在数据分析和报告生成中非常有用。 窗口函数的基本组成部分 函数类型&…...