3 A" M. {% v% N# f: t8 d! a0 j为了方便解题,我们可以在模拟的同时对一些参数进行计算,例如在我的这段代码中,计算了: 4 } Q; C+ _. H; B5 |4 B. J1 q- v; I) c1 R8 j% d* \
number of all node,所有节点的个数6 X w8 k; w9 d9 i
number of broadcast node,当前正在广播的节点个数以及其比例(number of broadcast node / number of all node) & v+ g0 A+ |5 h3 K( c* l" N; T" gnumber of effective receipt node,当前有效接收到广播的节点个数以及其比例(number of effective receipt node / number of all node)% Z$ Q6 ]/ Y9 Y1 t! M
number of conflict receipt node,当前冲突节点的个数以及其比例(num node conflict / num node receipt)" E \, @2 e: {' f& ]3 N- ~
演示: * l2 S% i6 N9 J9 s; X& C5 {4 S5 R! a6 H! I. {1 R) \ x1 K- o
7 }' D% }8 P8 a# f5 O( i # 依概率构造广播节点和接收节点 & J# X1 S3 Z9 Y& j& H7 [0 [2 j% h node_broadcast = [] # 广播节点 C7 J, R4 j( J, p! l) }, y8 q node_receipt = [] # 接收节点# K9 G; |( @) ]$ u8 s, g+ _/ L: ?( O
for i in range(len(x_all)): & r! I# L* B w# G! r' q. }5 X random_pro = random.uniform(0, 1) H9 Q2 a. |8 n, X2 `9 b0 m
if random_pro <= 0.2:2 m4 {3 g& O$ _9 w$ R
node_broadcast.append([x_all, y_all])0 N% w* I. w1 z) H( s
num_node_broadcast += 1* ?3 [" d* x* Q% o6 [- J: Z/ l' ~
else:, w# w% Q4 f1 s
node_receipt.append([x_all, y_all])& \, C) i9 }: z' {1 }/ h% q9 v" o1 b
list_node_broadcast.append(num_node_broadcast) # 记录一次循环的广播节点个数8 ]1 ^) @, K; ?7 q- j, s
" E6 x, L b% W" [# e, f # 计算有效的接收节点 , s L/ {9 w* H# { effective_receipt_node = [] # l' j9 [8 n3 [/ Q4 ^# D. p conflict_receipt_node = [] 6 I" O: q8 J1 G s- v% W for each_receipt in node_receipt: 7 q- o5 k5 |1 j: S( v5 @ flag = 0 # 该变量用来指示某个接收节点是否处于多个广播节点的广播范围之内,0表示0个,1表示1个...以此类推: V4 X! {. Y8 {" g) Z b9 U" P/ j
for each_broadcast in node_broadcast: - l+ r, M1 Y7 ~9 F4 P if math.sqrt((each_receipt[0]-each_broadcast[0])**2 + (each_receipt[1]-each_broadcast[1])**2) < radius:. T: U" \8 }3 J) V; T7 Z( ]2 t& b
flag += 1 I$ u7 M- x7 |
if flag > 1: 5 K7 w3 d: t/ f( d7 m4 P l num_node_conflict += 1 " d( C0 Z; k* q conflict_receipt_node.append(each_receipt) " D7 m2 v# _/ S% G- s if flag == 1: $ m7 P& {. _- n' E' l( t% P- \ effective_receipt_node.append(each_receipt); d% N1 W* Q O; ^3 B( A
num_node_receipt += 11 X+ l! m, E# H% d5 n& P
list_node_receipt.append(num_node_receipt) # 记录一次循环的有效节点接收个数& g6 F# l1 o* K9 H C7 C# q5 e
list_node_conflict.append(num_node_conflict) # 记录一次循环的冲突节点个数 + f$ |! J4 B0 e8 _3 L7 P$ p' @6 C & z+ T5 z( o C3 q Y5 z1 s # 提取广播节点、接收节点、有效接收节点的坐标 ' X7 Q! i# N! v) O* B4 } broadcast_x = [i[0] for i in node_broadcast] 7 V$ d3 {# A1 L7 Q( w! u0 u broadcast_y = [i[1] for i in node_broadcast]" X+ N4 C4 k: \$ a/ A7 J
receipt_x = [i[0] for i in node_receipt]' Q, K! M* i: n5 ^ p
receipt_y = [i[1] for i in node_receipt]; e, h. h1 l; P0 w
effective_receipt_x = [[i[0] for i in effective_receipt_node]] 5 G( }. W2 H1 I* c* u- x effective_receipt_y = [[i[1] for i in effective_receipt_node]] & H( `8 N# d4 A, L3 k1 B! M9 ? conflict_receipt_x = [[i[0] for i in conflict_receipt_node]] # |* l' A; m5 F3 l6 j0 A conflict_receipt_y = [[i[1] for i in conflict_receipt_node]]1 h d4 I% W' F% H* }0 Y
+ k5 F. ^3 {) D- F plt.cla() # 清除当前绘图4 j& U/ O. S0 h% \* ~& ]3 B
$ f- \" W7 B7 W; z/ c1 A # 绘制散点图8 e n) ~& F1 Q* m2 B
plt.scatter(broadcast_x, broadcast_y, s=500, c='#ffffff', edgecolors='#000000', label='broadcast') # 绘制广播节点: L8 t' C" m0 V; L1 o5 D) x4 Y3 \" V4 p! o
plt.scatter(receipt_x, receipt_y, s=10, c='#000000', edgecolors='#000000', label='receipt') # 绘制全部接收节点 9 u* W+ J5 N5 o. ]" b1 {8 b plt.scatter(effective_receipt_x, effective_receipt_y, s=10, c='#32b16c', edgecolors='#32b16c', label='effective receipt') # 绘制有效接收节点 8 H1 q z+ I" I4 I plt.scatter(conflict_receipt_x, conflict_receipt_y, s=10, c='#e60012', edgecolors='#e60012', label='conflict receipt') # 绘制冲突接收节点; ~' z1 {$ B/ [' ]# }4 K3 Z# f
1 U. P6 j" Q* l
# 图中的文字说明 , Q, i& n9 B2 @ plt.text(0.35, 0.1, 'number of all node: %d' % N, fontdict={'size': 10, 'color': 'red'})& d0 X- {$ e' U9 L1 t+ I
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'}) $ {6 H# E3 o7 A$ B3 k 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'})& @& s% C/ b( s5 |, l5 k
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'}) . T5 D# \0 v: a' Q, e& u , H% d9 v8 W4 {% U5 ^: K6 z1 X plt.axis('off') 7 s9 n- X& `# I# i$ c5 B6 X" l% w5 @ plt.xlim(-0.1, 1.1) 9 ?; |$ z9 l; N1 s7 K plt.ylim(-0.1, 1.1) 4 Q. q0 ?/ d0 l' J plt.style.use('ggplot')0 l5 [7 I! V) G+ m
plt.legend(loc='lower left') I% ~: A. D: l8 X4 P
plt.pause(0.2) # 保留绘图0.2s2 r. z! B9 O( p; b C O; R0 l
. j& B8 ?! E+ U" }9 r. }' v
plt.ioff() # 循环结束8 H: ?# z4 f6 a& u
plt.show() 4 J' F; {# p; ^% g L5 h8 i1 h6 t) M' ?4 o3 f" b/ x2 k% U. s5 o
print("有效发送" + str(numpy.mean(list_node_broadcast)))1 I7 z( h# ^$ a
print("有效接收" + str(numpy.mean(list_node_receipt)))4 [5 ~0 G" _7 U- X i
print("冲突" + str(numpy.mean(list_node_conflict)))9 @4 r. C- N, x1 A& F
print("Sy" + str(numpy.mean(list_node_conflict)/numpy.mean(list_node_broadcast))) 2 w, o5 ]1 d- A; _+ B& C; @. G) d' y1 e" ]
x_axis = [str(i)+"t" for i in range(50)]/ \) b8 G/ ~; e9 i1 o& ^