QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 2092|回复: 0
打印 上一主题 下一主题

用Python模拟一个区域广播通信网络

[复制链接]
字体大小: 正常 放大
浅夏110 实名认证       

542

主题

15

听众

1万

积分

  • TA的每日心情
    开心
    2020-11-14 17:15
  • 签到天数: 74 天

    [LV.6]常住居民II

    邮箱绑定达人

    群组2019美赛冲刺课程

    群组站长地区赛培训

    群组2019考研数学 桃子老师

    群组2018教师培训(呼伦贝

    群组2019考研数学 站长系列

    跳转到指定楼层
    1#
    发表于 2020-5-17 10:07 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta |邮箱已经成功绑定
    题干:" Z2 G. e" ~( H/ v, X
    考虑这样的一个无线网:每个通信节点都是低功率的发射器,并且在进行着空间上的低速连续运动 (无法预知运动方向及其改变的规律),所以对一个节点而言,只有和它距离在一定范围之内的节点才能收到它的信号,而且节点会 (在未声明的情况下) 相互接近或远离。每个节点需要不定期地、断续地发送信息,但会时刻保持收听信息。发送和收听工作可以同时进行。在这个通信网络中,完全没有网络的基础设施,而且每个节点只需要把自己的信息广播出去,需要此条信息的节点只需要被动收听即可,并不需要点对点地持续交换信息。所有信息只能使用同一个频率发送,一旦有两个或多个节点的广播发生冲突,能同时收听到它们的节点就都能监听到冲突。
    / H* c9 P" f, U' ?$ i* Y' F$ s. M6 c  B- V4 e% `
    我们假设发送每条信息所占用的时间都是等长的。所有的节点都拥有同样的内置算法,并拥有一个校准过的高精度时钟。! b8 j$ m2 l3 b# U1 }7 ?
    8 w! p! G: E2 O0 R
    分析:1 C7 k( _7 ]- g5 e0 d, N: p
    我们可以模拟一个题干中所描述的无线网,由于广播的不定期、断续地发送,我们可以用概率p pp来对广播发送进行描述,同时规定广播的半径r rr和同一区域出现的通信节点个数(用户输入)和产生的位置(随机)。
    2 e1 T$ e+ ?. Z- H) b# H
    ! P2 D* ^/ S! \. U$ I) M7 [2 l需要注意的是,节点会在空间上的低速连续运动,同时无法预知运动方向及其改变的规律,这点要用随机取模拟。9 p- V7 Y) t* D) @

    8 w1 G# `* u" D% {, ^6 R为了方便解题,我们可以在模拟的同时对一些参数进行计算,例如在我的这段代码中,计算了:+ L/ j- `& d% n% V
    6 `# \. I3 l, e+ `" O
    number of all node,所有节点的个数% s1 L7 `5 b% S% o: t' o
    number of broadcast node,当前正在广播的节点个数以及其比例(number of broadcast node / number of all node)9 C: E; Y  t! V7 G
    number of effective receipt node,当前有效接收到广播的节点个数以及其比例(number of effective receipt node / number of all node): e2 a" F0 f  a! G0 F! y8 ]
    number of conflict receipt node,当前冲突节点的个数以及其比例(num node conflict / num node receipt)
    . f% |) O" F' `. H: V$ y2 T演示:
    & \2 G- r* q- G$ f& C$ V8 m+ m. w4 N) P# B3 _
    ! T) T: @  O4 D2 S' G  _# {9 L
    对图中的图符进行解释:
      T2 ]5 ~+ N- ?0 j3 v2 v; T2 I- Q  Z
    broadcast,当前正在广播的节点及其广播域
    + e4 j8 A; d, q. C( H7 ^receipt,节点
    * W$ P1 `: ]" z& x4 I$ Y. m3 [effective receipt,当前有效接收到广播的节点
    7 t4 T# h  z+ fconflict receipt,当前接收发生冲突的节点
    * H+ E0 @5 N* [: |代码:
    ! }  m' T- w' A# j9 B" f9 ?可以通过如下代码模拟,或者自己完善:+ A! \6 F/ C4 z5 ?

    ( U% ]% h7 a4 p9 f: Kimport datetime
    . P, X1 U* D, a$ j0 Uimport math* H7 F9 Q0 n& D8 E  m6 \2 z
    import random
    + h) r9 h+ s1 O( k/ vimport numpy! Y0 q6 |1 G5 L3 |' k3 J
    import time
    5 ?7 Q/ a- J; z; {/ W' S9 [8 \5 l; ~. n7 |( W* J- h
    import matplotlib.pyplot as plt
    . Y6 V! K+ n& K- b# l; ~2 X4 pimport numpy as np" ?* o4 N5 o$ e+ W) p
    ! ?1 L, @7 {3 z" \( p. {+ b
    # 可调参数
    + F# D2 [4 Q9 nN =200 # 节点个数# _5 m0 F0 ?  |3 Z7 B  c; p
    seed = datetime.datetime.now() # 点产生的随机种子
    1 G4 ~1 F. Y0 P+ ]. Z2 j6 w& hp = 0.2 # 某一时间点发送信号的概率
    + N$ b6 e3 }; n) b- x, T9 I; W* vradius = 0.05 # 广播半径2 |5 @9 ~2 K8 _7 M9 U7 ?4 M" r

    : _5 k# Z4 `) M+ tplt.ion() # 循环开始
    % h& Q, t1 h/ {* L# f. Eplt.show()% b2 r4 J- x* w. n6 V: k

    ; u1 M0 s  }% K$ `- h' H5 x# 构造节点,全部存入一个列表
    1 ~) e' P& A) gx_all = np.random.rand(N); X+ s$ @! k. Q- A! h! u8 g5 R
    y_all = np.random.rand(N)
    6 F* Y9 ]5 t* K$ P  f5 p1 H% s3 M4 H+ z: }$ z
    list_node_broadcast = []
    + p. g9 F$ R* ^% B$ N+ Olist_node_receipt = []2 K) y" {5 m8 \" B% b
    list_node_conflict = []5 \$ b; E6 x) }4 u% \

    ( t! Q( N! F" k5 M+ n( |for _ in range(50):
    ; W' O- `8 U- P    # 结果参数5 M$ ^  L8 L; {$ V3 c
        num_node_broadcast = 0 # 正在广播的节点的个数" ~* }6 y! H0 @0 I: `
        num_node_receipt = 0 # 有效接收的节点的个数
    2 U9 l4 U* q; e* a: U    num_node_conflict = 0 # 发生冲突的节点个数0 U4 W% S. V" {5 N; _

    3 m( g7 c% w: _: o% U    for each_index in range(len(x_all)):& \3 k- Y0 L* [
            randonX = random.uniform(-0.01, 0.01)9 V4 g$ ~3 w8 R, H
            x_all[each_index] += randonX. k8 B8 c0 j) b' g, v
            randonY = random.uniform(-0.01, 0.01)
    8 G% ?+ [' L4 D8 h        y_all[each_index] += randonY& i$ @, B5 c- w) ]( z% v" w: e
    0 M. D% h$ b; J+ X: _2 N: l. r
        # 依概率构造广播节点和接收节点% r: T7 E! U$ x  D0 Q
        node_broadcast = [] # 广播节点% P3 K! g  Z- t# K
        node_receipt = [] # 接收节点' P* o- g+ I$ a# O7 F
        for i in range(len(x_all)):
    $ [2 r+ a, N  e5 s! |        random_pro = random.uniform(0, 1)
    6 {0 |. V: v6 j" w  @. x        if random_pro <= 0.2:% h( r; b$ }6 X8 j" m0 I
                node_broadcast.append([x_all, y_all])
    7 J4 b+ j1 c# C, M% G) c  f            num_node_broadcast += 1  s7 v' d4 u5 Q; ~% K
            else:7 q% I6 h& l& F0 l. B* j
                node_receipt.append([x_all, y_all])
    6 G, i! q+ L+ m    list_node_broadcast.append(num_node_broadcast) # 记录一次循环的广播节点个数
    & D9 m. a5 ^: {2 P# [5 P' m3 Z% n8 t( z& R7 b  q; U; ]/ g
        # 计算有效的接收节点
    : R" b4 A$ R8 x% r6 q" R# ~    effective_receipt_node = []# Z# a6 Y! l( A& T
        conflict_receipt_node = []
    7 g$ \3 K6 c0 ^    for each_receipt in node_receipt:
    7 I) ?& P' m  `8 a% I        flag = 0 # 该变量用来指示某个接收节点是否处于多个广播节点的广播范围之内,0表示0个,1表示1个...以此类推( z0 ?- \1 b! g9 K8 b# }. r3 P
            for each_broadcast in node_broadcast:& a- N9 C+ o6 b: C* j5 u
                if math.sqrt((each_receipt[0]-each_broadcast[0])**2 + (each_receipt[1]-each_broadcast[1])**2) < radius:
    . A- P2 X- Y3 u  B, X                flag += 1
    $ z3 ]3 |9 F- V+ [7 r& h        if flag > 1:  b: \1 B' Q; E
                num_node_conflict += 1, k% Y0 a* }, u& Z5 v0 A6 i$ Q
                conflict_receipt_node.append(each_receipt)
    . {) n! Z1 I# R        if flag == 1:
    4 D$ B+ D) K8 H0 i$ E/ Q            effective_receipt_node.append(each_receipt)8 }  j+ d. x) W" P% U) y. b
                num_node_receipt += 1
    ! G, W: Y9 U7 [+ Z3 I) M. D3 ~  A    list_node_receipt.append(num_node_receipt) # 记录一次循环的有效节点接收个数7 o4 J2 _3 t* d* Q
        list_node_conflict.append(num_node_conflict) # 记录一次循环的冲突节点个数9 d# k% O+ U; H3 D: d* Q( u4 o. l
    + C5 Z# F7 }7 {  J7 d( ~5 ~* q: i& Y' _
        # 提取广播节点、接收节点、有效接收节点的坐标1 X! C1 n, x: _0 G4 a) g
        broadcast_x = [i[0] for i in node_broadcast]
    9 X2 v$ U" C6 r$ }' L" c    broadcast_y = [i[1] for i in node_broadcast]4 w2 J) b) Z% \; B; _
        receipt_x = [i[0] for i in node_receipt]; K& q) c- N' R" Z: {
        receipt_y = [i[1] for i in node_receipt]4 I5 l& [5 K6 P% Q
        effective_receipt_x = [[i[0] for i in effective_receipt_node]]% r0 P0 C3 d3 k2 q9 S
        effective_receipt_y = [[i[1] for i in effective_receipt_node]]
    + F# @/ _% J1 r    conflict_receipt_x = [[i[0] for i in conflict_receipt_node]], F9 `2 C' @8 f; b: b) @. ~! f
        conflict_receipt_y = [[i[1] for i in conflict_receipt_node]]" T; _  \( I* x. [, I/ ], Y0 K

    . j/ d/ u, v- \) c    plt.cla()  # 清除当前绘图
    ! @" u0 \! b: |- O) U: ]7 {$ w; q5 N$ {  Y5 s3 j9 l4 ~
        # 绘制散点图
    ! U) Q& \1 k9 {    plt.scatter(broadcast_x, broadcast_y, s=500, c='#ffffff', edgecolors='#000000', label='broadcast') # 绘制广播节点
    ) w3 P5 R& ~9 M' Y  B' ?$ K9 `. K    plt.scatter(receipt_x, receipt_y, s=10, c='#000000', edgecolors='#000000', label='receipt') # 绘制全部接收节点
    & W  T9 I9 w& ]' B    plt.scatter(effective_receipt_x, effective_receipt_y, s=10, c='#32b16c', edgecolors='#32b16c', label='effective receipt') # 绘制有效接收节点
    # g5 F+ V4 D5 @" {    plt.scatter(conflict_receipt_x, conflict_receipt_y, s=10, c='#e60012', edgecolors='#e60012', label='conflict receipt') # 绘制冲突接收节点% M& J0 k& s. a, V1 v& \

    5 f. `* Z5 D- S6 g/ Z    # 图中的文字说明
    6 }* l: V( Y  m$ _3 \) ?3 c# o    plt.text(0.35, 0.1, 'number of all node: %d' % N, fontdict={'size': 10, 'color': 'red'})
    ) ?# f1 m" [7 E1 x' Y2 B+ d) r    plt.text(0.35, 0.05, 'number of broadcast node: %d (%0.2f)' % (num_node_broadcast, num_node_broadcast/N), fontdict={'size':10, 'color':'red'})% k3 K& Q& s- }& `. G2 |; F
        plt.text(0.35, 0, 'number of effective receipt node: %d (%0.2f)' % (num_node_receipt, num_node_receipt/(N-num_node_broadcast)), fontdict={'size':10, 'color':'red'})
    " D7 g  e' q6 @( ?2 h    plt.text(0.35, -0.05, 'number of conflict receipt node: %d (%0.2f)' % (num_node_conflict, num_node_conflict/num_node_receipt), fontdict={'size':10, 'color':'red'})
    ( G3 J0 m% P- V/ k9 V( j
    " ?# w; k0 C  _" p. x( [" x9 u; c    plt.axis('off')  x% x8 z. t2 t  C* I  s
        plt.xlim(-0.1, 1.1)# U- E, ?7 A0 e8 q# p
        plt.ylim(-0.1, 1.1)
    4 s$ H. b* o/ R% t* Q0 A    plt.style.use('ggplot')
    0 s& w8 S' w0 R! `    plt.legend(loc='lower left')9 g  b0 O! O0 S7 C+ I% a3 J
        plt.pause(0.2)  # 保留绘图0.2s
    * l6 ~9 J! W( j* x) U( E) D# N
    / X2 V5 U" f: W( j; d7 `plt.ioff() # 循环结束/ `6 F& |3 i0 G3 F
    plt.show(); j& F, D$ a, d* Z& C$ Y# a7 J' p
    , I+ Y- r' U( Q0 T' M& U4 z
    print("有效发送" + str(numpy.mean(list_node_broadcast)))) h3 h5 e( P9 H) g! a
    print("有效接收" + str(numpy.mean(list_node_receipt)))
    ; Q+ E/ I7 B  q8 v+ `print("冲突" + str(numpy.mean(list_node_conflict)))" a0 R* y9 A5 S) T& ?  t( @1 Q* G
    print("Sy" + str(numpy.mean(list_node_conflict)/numpy.mean(list_node_broadcast)))
    * H0 S5 b3 d! E2 ^/ I7 B7 s8 i7 I2 H0 Y+ `% ?2 Q0 A
    x_axis = [str(i)+"t" for i in range(50)]5 a+ z- ?% @; V; R. x3 A) ]0 B% e
    $ N& K8 l- c7 j, K/ X
    fig = plt.figure(figsize=(12,4)), f8 K: l2 G, [0 ^
    plt.axis('on')3 G4 V+ a& r: ^7 V" D
    plt.subplot(facecolor='w')
    8 e) a7 T2 V8 G& z3 Splt.plot(x_axis, list_node_broadcast, color='black', linewidth=1.0, linestyle='-', label='广播节点')
    # V: p, o8 D* Z  {/ Yplt.plot(x_axis, list_node_receipt, color='green', linewidth=1.0, linestyle='-', label='接收节点'); G  C3 D/ E* q
    plt.plot(x_axis, list_node_conflict, color='red', linewidth=1.0, linestyle='-', label='冲突节点')6 p* c. l$ @# l

    / O, }" @5 w8 c" s1 [plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签& B# \6 ?2 i# ^  f# z
    plt.xticks(rotation=-45)
      s4 @" X) Q* C8 I: F+ a4 r# bplt.legend(loc='upper left')9 v, P+ K: y" Z; ~
    plt.grid(axis="both")
    / R0 M% }) ]1 f# ~1 T, H8 L# plt.show()
    * u) ?, G' ^# B. Z  d) s: A, ^4 I! L
    ————————————————
    ) C8 G! c% d4 f$ U+ z- T9 S% w$ p版权声明:本文为CSDN博主「白水偷偷画工图」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
      P6 ^& x) @3 i0 y+ R3 `" q原文链接:https://blog.csdn.net/baishuiniyaonulia/article/details/1061012808 V+ N0 Q' i. c9 p

    ' ~/ f- q* w* G; M: }) i
    - f( Y/ t  J9 W5 x, p/ I9 P' y
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-6-15 13:23 , Processed in 0.296966 second(s), 51 queries .

    回顶部