Bianchi模型、python计算及ns3验证

news2024/11/24 14:40:54

由于项目与学习需要,最近学习了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/24302361icon-default.png?t=O83Ahttps://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#头长度 bit

self.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 = 0

nn = range(5, 50)

self.calculate_p_t()

计算冲突概率p和某个STA的发送概率τ:

def calculate_p_t(self):
        def equations(x):
            p, t = x
            my_sum = 0.0
            for 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 = 80
        self.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.pyicon-default.png?t=O83Ahttps://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 plt


class 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.840210
    def __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 varz
        self.bitrate = 56E6
        self.n = 30

        self.b00 = 0

        self.ACK = 14 * 8
        self.SIFS = 10E-6
        self.slot = 9E-6
        self.DIFS = 3 * 9E-6
        self.H = 2 * 8

        self.E_P = 80
        self.E_P_star = 100

        self.W = 12
        self.m = 7

        self.prop_delay = 0

        # dependent varz
        self.p = 0
        self.t = 0
        self.Ps = 0
        self.P_tr = 0
        self.T_s = 0
        self.T_c = 0
        self.S = 0

        self.bitrate = bitrate
        self.n = n
        self.ACK = ACK
        self.SIFS = SIFS
        self.slot = slot
        self.DIFS = DIFS
        self.E_P = E_P
        self.E_P_star = E_P_star
        self.W = W
        self.m = m
        self.H = H
        self.prop_delay = prop_delay

        self.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.W
            b_i0 = self.p ** i * self.b00
        else:
            W_i = 2.0 ** self.m * self.W
            b_i0 = self.p ** self.m / (1 - self.p) * self.b00

        return (W_i - k) / W_i * b_i0

    def check_p_t(self):
        c1 = self.p - 1.0 + (1.0 - self.t) ** (self.n - 1.0) <= 1.49012e-08
        my_sum = 0.0
        for i in range(0, self.m):
            my_sum += (2.0 * self.p) ** i
        c2 = 2.0 / (1.0 + self.W + self.p * self.W * my_sum) - self.t <= 1.49012e-08
        return c1 and c2

    def calculate_p_t(self):
        def equations(x):
            p, t 

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

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

相关文章

基于双PI控制器和SVPWM的定转子双永磁同步电机simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 永磁同步电机的基本结构和工作原理 4.2 双PI控制器的设计方法 4.3 SVPWM 的实现原理 5.完整工程文件 1.课题概述 为了实现定转子双永磁同步电机的高性能控制&#xff0c;通常采用双 PI 控制器和 S…

Linux系统创建新分区并挂载的方法

一、引言 本文以CentOS为例讲述Linux系统创建新分区并挂载的方法。如下图所示&#xff0c;用fdisk -l命令可以看到该CentOS系统下有一个磁盘/dev/vda&#xff0c;其容量为2199G&#xff0c;即2T。该磁盘有两个分区&#xff1a;vda1和vda2&#xff1a; 用lsblk命令可以查看到磁…

Ancient City Ruins 古代城市遗址废墟建筑游戏场景

这个包包含450多个古代遗迹预制件,可组合模块化预制件和许多建筑元素。它适用于室内和室外,并允许不同层次的定制建筑。 [亮点] 超过450个古代遗迹的预制件 可组合的模块化预制件 许多建筑元素 适用于室内和室外 允许不同层次的自定义建筑 预制房间和建筑 废墟装饰道具 基本自…

jQuery——循环翻页

本文分享到此结束&#xff0c;欢迎大家评论区相互讨论学习&#xff0c;下一篇继续分享jQuery中自动翻页功能的学习。

【含文档】基于Springboot+Android的个人财务系统的设计与实现(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

(贪心) 反悔贪心之反悔堆

文章目录 ⭐例题&#x1f6a9;题意与思路 ⭐返回贪心&#x1f6a9;原理&#xff08;反悔池&#xff09;&#x1f6a9;落实到题&#x1f6a9;AC code ⭐练习题⭐END&#x1f31f;交流方式 ⭐例题 经典例题&#xff1a; 871. 最低加油次数 &#x1f6a9;题意与思路 题意&#xf…

【光追模组】使命召唤7黑色行动光追mod,调色并修改光影,并且支持光追效果,游戏画质大提升

大家好&#xff0c;今天小编我给大家继续引入一款游戏mod&#xff0c;这次这个模组主要是针对使命召唤7黑色行动进行修改&#xff0c;如果你觉得游戏本身光影有缺陷&#xff0c;觉得游戏色彩有点失真的话&#xff0c;或者说你想让使命召唤7这款游戏增加对光线追踪的支持的话&am…

RESTful风格接口+Swagger生成Web API文档

RESTful风格接口Swagger生成Web API文档 文章目录 RESTful风格接口Swagger生成Web API文档1.RESTful风格接口RESTful简介RESTful详细图示常见http状态码springboot实现RESTfulRESTful springboot设计实例demo 2.Swagger生产Web API文档Swagger简介使用Swagger1.加入依赖2.配置S…

C++笔记之shared_ptr的reset()函数

C++笔记之shared_ptr的reset()函数 code review! std::shared_ptr 的 reset() 函数用于管理指针的生命周期。以下是它的几种用法和功能: 用法 无参数调用: reset() 会释放当前管理的对象,并将指针置为空。std::shared_ptr<int> ptr = std::make_shared

数据库原理及应用:用实例理解关系代数(传统集合运算和专门关系运算)

&#xff01;注意&#xff01;&#xff1a;本篇博客只是利用实例来更好地理解关系代数&#xff0c;有关本章内容专业的表达式在此篇博客中未被提及。本博客中关系和表格这两个表达是等价的。 关系操作分为传统集合运算和专门关系运算&#xff0c;这一篇博客我们将从实例进行关系…

Go基本数据结构

1.jdk丰富的数据结构 Jdk提供了许多基本数据结构的实现&#xff0c;这些数据结构是Java Collections Framework的一部分&#xff0c;位于java.util包中。以下是一些常见的数据结构&#xff1a; ArrayList&#xff1a;一个可调整大小的数组实现&#xff0c;支持快速随机访问。 …

[Algorithm][贪心][合并区间][无重叠区间][用最少数量的箭引爆气球]详细讲解

目录 1.合并区间1.题目链接2.算法原理详解3.代码实现 2.无重叠区间1.题目链接2.算法原理详解3.代码实现 3.用最少数量的箭引爆气球1.题目链接2.算法原理详解3.代码实现 1.合并区间 1.题目链接 合并区间 2.算法原理详解 区间问题思路&#xff1a; 排序 左端点(本题)右端点 根…

Docker安装及使用记录

本文汇总一下 Docker 的安装过程和使用过程中的问题 安装过程 Windows Linux 更新软件源&#xff1a;Linux安装前可先更新以下各自发行版包管理器的软件源 卸载旧版本&#xff1a;如果之前安装过的话&#xff0c;可以先卸载 yum remove docker docker-common docker-sel…

『网络游戏』自适应制作登录UI【01】

首先创建项目 修改场景名字为SceneLogin 创建一个Plane面板 - 将摄像机照射Plane 新建游戏启动场景GameRoot 新建空节点重命名为GameRoot 在子级下创建Canvas 拖拽EventSystem至子级 在Canvas子级下创建空节点重命名为LoginWnd - 即登录窗口 创建公告按钮 创建字体文本 创建输入…

基于SpringBoot“花开富贵”花园管理系统【附源码】

效果如下&#xff1a; 系统注册页面 系统首页界面 植物信息详细页面 后台登录界面 管理员主界面 植物分类管理界面 植物信息管理界面 园艺记录管理界面 研究背景 随着城市化进程的加快和人们生活质量的提升&#xff0c;越来越多的人开始追求与自然和谐共生的生活方式&#xf…

RabbitMQ(学习前言)

目录 学习MQ之前有必要先去温故下微服务知识体系&#xff0c;以加深本章节的理解 一、微服务间的通讯方式 1. 基本介绍 2. 同步通讯 2.1. 什么是同步通讯 2.2. 同步通讯存在的问题 问题一&#xff1a;耦合度高 问题二&#xff1a;性能和吞吐能力下降 问题三&#xff1a…

YOLOv11改进,YOLOv11添加DCNv4可变性卷积(windows系统成功编译),二次创新C2f结构,全网最详细教程

改进训练结果前: 二次创新C2f结构训练结果: 摘要 引入了可变形卷积 v4 (DCNv4),这是一种为广泛视觉应用设计的高效且有效的操作算子。DCNv4通过两项关键增强解决了其前身DCNv3的局限性:1. 移除空间聚合中的softmax归一化,以增强其动态特性和表达能力;2. 优化内存访问以…

【动态规划-4.2 最长递增子序列(LIS)】力扣300. 最长递增子序列

给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的 子序列 。 示例 1&…

LVM——让Linux磁盘空间的弹性管理

什么是LVM&#xff1f; LVM(Logical Volume Manager)逻辑卷管理是在Linux2.4内核以上实现的磁盘管理技术。它是Linux环境下对 磁盘分区进行管理的一种机制。现在不仅仅是Linux系统上可以使用LVM这种磁盘管理机制&#xff0c;对于其它的类UNIX操作系统&#xff0c;以及windows操…

用Manim简单解释奇异值分解(SVD)和图像处理方面的应

一&#xff0c;介绍 奇异值分解&#xff08;SVD&#xff09;是一种重要的矩阵分解技术&#xff0c;在统计学、信号处理和机器学习等领域有广泛应用。对于任意给定的矩阵 A&#xff08;可以是任意形状的矩阵&#xff09;&#xff0c;SVD将其分解为三个特定的矩阵的乘积&#x…