@@ -107,25 +107,30 @@ def getDM(ux,uy,bsx,bsy):
107
107
else :exit (0 )
108
108
return DM
109
109
110
- def interfere (n ,s ,chanlist ,bsx = BSX ,bsy = BSY ):
110
+ def interfere (n ,s ,chanlist ,bsx ,bsy ):
111
111
'''
112
112
##不同基站相同信道才会产生干扰,除此之外只有噪声,基站BS_n 在信道chan_s上的干扰,不同基站只要分配了相同编号的信道,
113
113
##无论是否给同一个用户都会相互干扰,只是相同编号的信道分配给同一个用户干扰最大
114
- chanlist 是信道的分配列表 等同于下面的BSchanAllocate,已分配信道是用用户坐标表示的,未分配信道值为-1
114
+ chanlist 是信道的分配矩阵 等同于下面的BSchanAllocate,已分配信道的位置将-1修改为用用户坐标(UserX,UserY),未分配信道值为-1
115
+
116
+ 信道分配矩阵的每一行必须与基站坐标的每一行对应起来,最后一行是宏基站的信道分配
115
117
'''
116
- BSX += [0 ]
117
- BSY += [0 ]
118
+
118
119
interf = 0
119
- for i in xrange (len (chanlist )):#循环基站数量次
120
- if (i != n and chanlist [i ][s ]!= - 1 ):##如果不是参数中的基站,且信道已经分配给用户(信道值为-1说明:此信道未分配,值为用户坐标说明此信道已经分配给该坐标用户)
121
- k = chanlist [n ][s ] #定位连接基站n分配信道s的用户
122
-
123
- d = distance (k [0 ],k [1 ],bsx [i ],bsy [i ])
124
- if i != (len (chanlist )- 1 ):#最后一个基站为宏基站,如果不是最后一个基站,功率p为微基站功率
125
- p = microAveragePower
126
- else : #否则为宏基站功率
127
- p = macroAveragePower
128
- interf += p * (d ** (- 4 ))
120
+ if (len (chanlist )== len (bsx )):###必须保证信道分配矩阵 的行数与基站的数量相同,便于计算距离获取基站的坐标值
121
+ for i in xrange (len (chanlist )):#循环基站数量次
122
+ if (i != n and chanlist [i ][s ]!= - 1 ):##如果不是参数中的基站,且信道已经分配给用户(信道值为-1说明:此信道未分配,值为用户坐标说明此信道已经分配给该坐标用户)
123
+ k = chanlist [n ][s ] #定位连接基站n分配信道s的用户
124
+ print "k=%d" % k
125
+ d = distance (k [0 ],k [1 ],bsx [i ],bsy [i ])
126
+ if i != (len (chanlist )- 1 ):#最后一个基站为宏基站,如果不是最后一个基站,功率p为微基站功率
127
+ p = microAveragePower
128
+ else : #否则为宏基站功率
129
+ p = macroAveragePower
130
+ interf += p * (d ** (- 4 ))
131
+ else :
132
+ print "function interfere len(BS)!=len(chanlist)"
133
+ exit (0 )
129
134
return interf
130
135
131
136
##基站到用户的距离DM,行代表某个基站,列代表用户
@@ -147,40 +152,42 @@ def interfere(n,s,chanlist,bsx=BSX,bsy=BSY):
147
152
BS5 : [-1,-1,....,-1]
148
153
]
149
154
'''
150
- def RateNow (chanlist ,user ,bsx = BSX ,bsy = BSY ):
155
+ def RateNow (chanlist ,user ,bsx ,bsy ):
151
156
"""
152
157
根据当前的用户分配求当前用户的速率 ,BSchanAllocate是信道分配列表,user表示要获取速率的用户
153
158
"""
154
- BSX += [0 ]
155
- BSY += [0 ]
159
+
156
160
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
-
161
+ if (len (chanlist )== len (bsx )):
162
+ for BSn in xrange (len (chanlist )):##以信道分配的矩阵长度作为循环次数
163
+ AvgBand = channelbandwidth
164
+ if BSn != (len (chanlist )- 1 ):
165
+ pt = microAveragePower ###微基站的平均信道功率
166
+ P = picoPower ##基站总共功率
167
+ radius = 100 ##m
168
+ else :
169
+ pt = macroAveragePower ###微基站的平均信道功率
170
+ P = macroPower ##基站总共功率
171
+ radius = 500 ##m
172
+
173
+ for userindex in xrange (len (chanlist [BSn ])):##第BSn个基站信道长度做循环次数
174
+ if user == chanlist [BSn ][userindex ]:###判断用户是否在当前循环基站分配了信道
175
+ Interf = interfere (BSn , userindex , chanlist , bsx , bsy )##求干扰
176
+ d = distance (user [0 ],user [1 ],bsx [BSn ],bsy [BSn ])###求用户与基站的距离
177
+ sinr = pt * (d )** (- 4 )/ (Interf + P * radius ** (- 4 )/ alpha )##求信噪比sinr
178
+ rate += AvgBand * log2 (1 + sinr )
179
+ else :
180
+ print "function RateNow : len(bsx)!=len(chanlist)"
181
+ print "len(bsx)=%d,len(chanlist)=%d" % (len (bsx ),len (chanlist ))
182
+ exit (0 )
175
183
return rate
176
184
177
185
178
- def channelAllocate (BSCover ,bsx = BSX ,bsy = BSY ):
186
+ def channelAllocate (BSCover ,bsx ,bsy ):
179
187
"""
180
188
181
189
"""
182
- BSX = BSX + [0 ]
183
- BSY = BSY + [0 ]
190
+
184
191
BSchanAllocate = [[- 1 ]* channelnum ]* TotalNum ####定义一个信道分配的矩阵,行代表一个基站,列代表基站的信道
185
192
186
193
for n in xrange (len (BSCover )):##n表示当前循环的基站下所有用户的集合编号
@@ -205,7 +212,7 @@ def channelAllocate(BSCover,bsx=BSX,bsy=BSY):
205
212
r = []
206
213
for j in xrange (channelnum ):
207
214
208
- Interf = interfere (n , j , BSchanAllocate , BSX , BSY )##n表示的是基站,j 是信道,chanlist是信道分配的列表
215
+ Interf = interfere (n , j , BSchanAllocate , bsx , bsy )##n表示的是基站,j 是信道,chanlist是信道分配的列表
209
216
# sinr = pt*(D[bs.index(user)])**(-4)/(Interf + P*radius**(-4)/alpha)##求sinr
210
217
sinr = pt * (d )** (- 4 )/ (Interf + P * radius ** (- 4 )/ alpha )##求sinr
211
218
rate = AvgBand * log2 (1 + sinr )
@@ -221,7 +228,7 @@ def channelAllocate(BSCover,bsx=BSX,bsy=BSY):
221
228
j = userj ##获取当前用户的下标(用户坐标不存在两个相同的)
222
229
print "基站编号: %d" % (n )
223
230
224
- Rnow = RateNow (BSchanAllocate , BSCover [n ][j ], BSX , BSY )##表示用户当下的速率,已改正【【【应该从信道分配list中获取当前用户的当前速率,刚开始用户的求得速率值为0】】】
231
+ Rnow = RateNow (BSchanAllocate , BSCover [n ][j ], bsx , bsy )##表示用户当下的速率,已改正【【【应该从信道分配list中获取当前用户的当前速率,刚开始用户的求得速率值为0】】】
225
232
while (Rnow < Rmin ):##用户速率大于最低速率,
226
233
if BSchanAllocate [n ].count (- 1 )> 0 :#当前基站还有未分配的信道,还有一个else,如果当前基站的信道数量不够该如何处理
227
234
Rnow += max (R [j ])
@@ -245,8 +252,11 @@ def channelAllocate(BSCover,bsx=BSX,bsy=BSY):
245
252
return BSchanAllocate
246
253
247
254
if __name__ == "__main__" :
248
-
255
+
249
256
BSCover = classifyUser (r = 100 )
257
+
258
+ BSX = BSX + [0 ]
259
+ BSY = BSY + [0 ]
250
260
##将用户按照基站的覆盖范围分类之后,将宏基站的坐标加入到基站坐标列表中去
251
261
# s = 0
252
262
# for i in BSCover:
@@ -255,9 +265,9 @@ def channelAllocate(BSCover,bsx=BSX,bsy=BSY):
255
265
# print "len(i)=%d"%len(i)
256
266
# print "sum user:%d"%s
257
267
258
- for i in [ 0 , 1 ]:
259
- BSchanAllocate = channelAllocate (BSCover )
260
- for i in BSchanAllocate :
261
- print i
268
+
269
+ # BSchanAllocate = channelAllocate(BSCover)
270
+ # for i in BSchanAllocate:
271
+ # print i
262
272
263
273
0 commit comments