35
35
RelayNum = 2
36
36
TotalNum = MacroNum + PicoNum + FemtoNum + RelayNum
37
37
usernum = np .random .randint (20 ,50 )
38
+ # usernum = np.random.randint(50,60)
38
39
print "usernum=%d" % usernum
39
40
40
41
macroR = 500.0 ##宏基站的覆盖半径/m
56
57
57
58
# 用户的坐标位置和基站的坐标位置
58
59
UserX ,UserY , BSX ,BSY = Draw (samples_num = usernum ,R = 500 )#接收用户坐标和基站坐标(不包括宏基站)
59
-
60
+
61
+ '''
62
+ """------------------------------------此 函 数 已 经 废 弃----------------------------------------"""
60
63
def sinr(BSid,Userchannellist,chan):###BSid基站类型:0:picoBS;1:MacroBS,已分配信道列表Userchannellist,chan要给用户分配的信道
61
64
"""
62
65
信噪比公式 sinr = P(n,s)*D(n,k)**(-4)/(Interference+Noise)
@@ -66,10 +69,12 @@ def sinr(BSid,Userchannellist,chan):###BSid基站类型:0:picoBS;1:MacroBS,
66
69
L(n):基站n的覆盖半径
67
70
"""
68
71
pass
72
+ '''
69
73
70
- def classifyUser (ux ,uy ,bsx ,bsy , r ):##定义一个分类函数
74
+ def classifyUser (r , ux = UserX ,uy = UserY ,bsx = BSX ,bsy = BSY ):##定义一个分类函数
71
75
'''
72
76
将用户按照:是否处于某个基站覆盖范围分类,r基站的半径
77
+ 基站坐标不能包含宏基站坐标,宏基站用户需等待所有其他类型的基站分类完毕之后才能得到
73
78
74
79
'''
75
80
if (len (ux )> len (uy )):ux = ux [:len (uy )]
@@ -78,15 +83,15 @@ def classifyUser(ux,uy,bsx,bsy,r):##定义一个分类函数
78
83
elif (len (bsx )< len (bsy )):uy = uy [:len (ux )]
79
84
#初始化一个列表,每一行代表一个基站范围内的用户列表
80
85
BSCoverage = []
81
- for i in xrange (len (BSX )):##处于两个基站交叉区域的用户会出现在两个基站的list中
86
+ for i in xrange (len (bsx )):##处于两个基站交叉区域的用户会出现在两个基站的list中
82
87
BSCoverage .append ( [(x ,y ) for x ,y in zip (ux ,uy ) if distance (x , y , bsx [i ], bsy [i ])<= r ])
83
88
temp = []
84
89
for i in BSCoverage :
85
90
temp += i
86
- #过滤掉重复的坐标
91
+ ### 过滤掉重复的坐标
87
92
temp = list (set (temp ))
88
- #筛选只在宏基站内的用户坐标, 最后一行为只分布在宏基站范围内的用户
89
- BSCoverage .append ([(x ,y ) for x ,y in zip (UserX , UserY ) if (x ,y ) not in temp ])
93
+ ### 筛选只在宏基站内的用户坐标, 最后一行为只分布在宏基站范围内的用户
94
+ BSCoverage .append ([(x ,y ) for x ,y in zip (ux , uy ) if (x ,y ) not in temp ])
90
95
return BSCoverage
91
96
92
97
def getDM (ux ,uy ,bsx ,bsy ):
@@ -102,18 +107,20 @@ def getDM(ux,uy,bsx,bsy):
102
107
else :exit (0 )
103
108
return DM
104
109
105
- def interfere (n ,s ,chanlist ,BSX ,BSY ):
110
+ def interfere (n ,s ,chanlist ,bsx = BSX ,bsy = BSY ):
106
111
'''
107
112
##不同基站相同信道才会产生干扰,除此之外只有噪声,基站BS_n 在信道chan_s上的干扰,不同基站只要分配了相同编号的信道,
108
113
##无论是否给同一个用户都会相互干扰,只是相同编号的信道分配给同一个用户干扰最大
109
114
chanlist 是信道的分配列表 等同于下面的BSchanAllocate,已分配信道是用用户坐标表示的,未分配信道值为-1
110
115
'''
116
+ BSX += [0 ]
117
+ BSY += [0 ]
111
118
interf = 0
112
119
for i in xrange (len (chanlist )):#循环基站数量次
113
120
if (i != n and chanlist [i ][s ]!= - 1 ):##如果不是参数中的基站,且信道已经分配给用户(信道值为-1说明:此信道未分配,值为用户坐标说明此信道已经分配给该坐标用户)
114
121
k = chanlist [n ][s ] #定位连接基站n分配信道s的用户
115
122
116
- d = distance (k [0 ],k [1 ],BSX [i ],BSY [i ])
123
+ d = distance (k [0 ],k [1 ],bsx [i ],bsy [i ])
117
124
if i != (len (chanlist )- 1 ):#最后一个基站为宏基站,如果不是最后一个基站,功率p为微基站功率
118
125
p = microAveragePower
119
126
else : #否则为宏基站功率
@@ -140,16 +147,45 @@ def interfere(n,s,chanlist,BSX,BSY):
140
147
BS5 : [-1,-1,....,-1]
141
148
]
142
149
'''
143
- def channelAllocate (BSCover ):
150
+ def RateNow (chanlist ,user ,bsx = BSX ,bsy = BSY ):
151
+ """
152
+ 根据当前的用户分配求当前用户的速率 ,BSchanAllocate是信道分配列表,user表示要获取速率的用户
153
+ """
154
+ BSX += [0 ]
155
+ BSY += [0 ]
156
+ rate = 0 ##初始速率设置为0
157
+ for BSn in xrange (len (chanlist )):##以信道分配的矩阵长度作为循环次数
158
+ AvgBand = channelbandwidth
159
+ if BSn != (len (chanlist )- 1 ):
160
+ pt = pt = microAveragePower ###微基站的平均信道功率
161
+ P = picoPower ##基站总共功率
162
+ radius = 100 ##m
163
+ else :
164
+ pt = macroAveragePower ###微基站的平均信道功率
165
+ P = macroPower ##基站总共功率
166
+ radius = 500 ##m
167
+
168
+ for userindex in xrange (len (chanlist [BSn ])):##第BSn个基站信道长度做循环次数
169
+ if user == chanlist [BSn ][userindex ]:###判断用户是否在当前循环基站分配了信道
170
+ Interf = interfere (BSn , userindex , chanlist , bsx , bsy )##求干扰
171
+ d = distance (user [0 ],user [1 ],bsx [BSn ],bsy [BSn ])###求用户与基站的距离
172
+ sinr = pt * (d )** (- 4 )/ (Interf + P * radius ** (- 4 )/ alpha )##求信噪比sinr
173
+ rate += AvgBand * log2 (1 + sinr )
174
+
175
+ return rate
176
+
177
+
178
+ def channelAllocate (BSCover ,bsx = BSX ,bsy = BSY ):
144
179
"""
145
180
146
- <<<<<<< HEAD
147
181
"""
182
+ BSX = BSX + [0 ]
183
+ BSY = BSY + [0 ]
148
184
BSchanAllocate = [[- 1 ]* channelnum ]* TotalNum ####定义一个信道分配的矩阵,行代表一个基站,列代表基站的信道
149
- n = 0 ##由于list会出现多个相同值(基站范围内不一定总是存在用户)取下标得到第一此出现的值,故循环n,作为全局的控制变量
150
- for bs in BSCover : ##bs表示当前循环的基站下所有用户的集合bs = [user(0),user(1),user(1),...,user(n)]
185
+
186
+ for n in xrange ( len ( BSCover )): ##n表示当前循环的基站下所有用户的集合编号
151
187
152
- if len (bs ) > 0 : ##判断bs中如果有用户的话,且不是最有一个基站,最后一个基站是宏基站
188
+ if len (BSCover [ n ] ) > 0 : ##当前编号对应的基站中如果有用户的话,继续执行
153
189
##初始化计算基站信息的数据
154
190
if n != (len (BSCover )- 1 ):
155
191
pt = microAveragePower ###微基站的平均信道功率
@@ -163,9 +199,9 @@ def channelAllocate(BSCover):
163
199
AvgBand = channelbandwidth ##每个信道的平均带宽
164
200
165
201
"""第一步:获得当前前基站下:每一个用户与所有信道连接条件下得到的用户速率"""
166
- R = []#初始化一个速度矩阵,一行代表当前基站下用户与所有信道的链接所获得速率值列表 ,列代表信道
167
- for user in bs :
168
- d = distance (user [ 0 ],user [ 1 ],BSX [n ],BSY [n ])## 用户与当前基站的距离
202
+ R = []#初始化一个速度矩阵,一行代表当前基站下一个用户与所有信道的链接所获得速率值列表 ,列代表信道
203
+ for userindex in xrange ( len ( BSCover [ n ])): ##userindex表示对应用户的下标值
204
+ d = distance (BSCover [ n ][ userindex ][ 0 ],BSCover [ n ][ userindex ][ 1 ],bsx [n ],bsy [n ])## 用户与当前基站的距离
169
205
r = []
170
206
for j in xrange (channelnum ):
171
207
@@ -181,11 +217,11 @@ def channelAllocate(BSCover):
181
217
#print len(R)
182
218
183
219
"""第二步:进行信道的分配,使用的贪心算法,用户选择(或者说基站分配)当前速率值最大的信道"""
184
- for userj in bs :
185
- j = bs . index ( userj ) ##获取当前用户的下标(用户坐标不存在两个相同的)
220
+ for userj in xrange ( len ( BSCover [ n ])) :
221
+ j = userj ##获取当前用户的下标(用户坐标不存在两个相同的)
186
222
print "基站编号: %d" % (n )
187
223
188
- Rnow = 0 ##表示用户当下的速率,这样做是有问题的!!!!???????
224
+ Rnow = RateNow ( BSchanAllocate , BSCover [ n ][ j ], BSX , BSY ) ##表示用户当下的速率,已改正【【【应该从信道分配list中获取当前用户的当前速率,刚开始用户的求得速率值为0】】】
189
225
while (Rnow < Rmin ):##用户速率大于最低速率,
190
226
if BSchanAllocate [n ].count (- 1 )> 0 :#当前基站还有未分配的信道,还有一个else,如果当前基站的信道数量不够该如何处理
191
227
Rnow += max (R [j ])
@@ -204,22 +240,24 @@ def channelAllocate(BSCover):
204
240
print "All channels are busy"
205
241
exit (0 )
206
242
print "\n "
207
- n = n + 1 ##当前基站的分配完毕,n+1进入下一个基站的额信道分配
243
+ # n = n + 1 ##当前基站的分配完毕,n+1进入下一个基站的额信道分配
208
244
209
245
return BSchanAllocate
210
246
211
247
if __name__ == "__main__" :
212
248
213
- BSCover = classifyUser (UserX , UserY , BSX , BSY , r = 100 )
249
+ BSCover = classifyUser (r = 100 )
214
250
##将用户按照基站的覆盖范围分类之后,将宏基站的坐标加入到基站坐标列表中去
215
- BSX = BSX + [0 ]
216
- BSY = BSY + [0 ]
217
- # for i in xrange(len(BSX)):
218
- # print (BSX[i],BSY[i])
219
- # print "\n"
220
- #
221
- BSchanAllocate = channelAllocate (BSCover )
222
- for i in BSchanAllocate :
223
- print i
251
+ # s = 0
252
+ # for i in BSCover:
253
+ # print i
254
+ # s += len(i)
255
+ # print "len(i)=%d"%len(i)
256
+ # print "sum user:%d"%s
257
+
258
+ for i in [0 ,1 ]:
259
+ BSchanAllocate = channelAllocate (BSCover )
260
+ for i in BSchanAllocate :
261
+ print i
224
262
225
263
0 commit comments