@@ -143,6 +143,7 @@ def interfere(n,s,chanlist,BSX,BSY):
143
143
def channelAllocate (BSCover ):
144
144
"""
145
145
146
+ <<<<<<< HEAD
146
147
"""
147
148
BSchanAllocate = [[- 1 ]* channelnum ]* TotalNum ####定义一个信道分配的矩阵,行代表一个基站,列代表基站的信道
148
149
n = 0 ##由于list会出现多个相同值(基站范围内不一定总是存在用户)取下标得到第一此出现的值,故循环n,作为全局的控制变量
@@ -218,4 +219,73 @@ def channelAllocate(BSCover):
218
219
for i in BSchanAllocate :
219
220
print i
220
221
222
+ == == == =
223
+ if len (bs ) > 0 : ##判断bs中如果有用户的话,且不是最有一个基站,最后一个基站是宏基站
224
+ ##初始化计算基站信息的数据
225
+ if n != (len (BSCover )- 1 ):
226
+ pt = microAveragePower ###微基站的平均信道功率
227
+ P = picoPower ##基站总共功率
228
+ radius = 100 ##m
229
+ else :
230
+ pt = macroAveragePower ##宏基站的平均信道功率
231
+ P = macroPower
232
+ radius = 500 ##m
233
+ # Interf = 0 ##干扰
234
+ AvgBand = channelbandwidth ##每个信道的平均带宽
235
+
236
+ ##求当前基站范围内的用户与当前基站的距离
237
+ D = []
238
+ for useri in bs :#循环当前基站中用户数量次
239
+ d = distance (useri [0 ],useri [1 ],BSX [n ],BSY [n ])
240
+ D .append (d )##得到当前基站下的用户与当前基站距离的列表
241
+
242
+ ##利用循环求当前基站下:每一个用户与所有信道连接条件下可获得的用户速率
243
+ R = []#初始化一个速度矩阵,一行代表当前基站下用户与所有信道的链接所获得速率值列表,列代表信道
244
+ for user in bs :
245
+ # R = []#初始化一个速度列表,当前循环的基站下覆盖的各个用户:假设信道分配给每一个用户的情形下得到的速率
246
+ r = []
247
+ for j in xrange (channelnum ):
248
+ '''这样做会出现一个问题:当前用户对应基站的所有信道得到的速率值是一样的,因功率是平均功率,距离是固定的,刚开始分配时先分配的基站不存在干扰,
249
+ 后续分配的基站产生干扰,因此得到的速率矩阵的每一行都是由相同的值组成的'''
250
+ Interf = interfere (n , j , BSchanAllocate , BSX , BSY )##n表示的是基站,j 是信道,chanlist是信道分配的列表
251
+ sinr = pt * (D [bs .index (user )])** (- 4 )/ (Interf + P * radius ** (- 4 )/ alpha )##求sinr
252
+ rate = AvgBand * log2 (1 + sinr )
253
+ ##将得到的速率值r,追加到当前 用户速度一维列表中,
254
+ #每一个速率值对应一个信道:R =[r0,r1,r2,..]
255
+ r .append (rate )
256
+ R .append (r )
257
+ # print R
258
+ # print len(R[0])
259
+
260
+ ##下一步进行信道的分配,使用的贪心算法,用户选择(或者说基站分配)当前速率值最大的信道
261
+
262
+ for userj in bs :
263
+ j = bs .index (userj )##获取当前用户的下标(用户坐标不会存在重复)
264
+
265
+ Rnow = 0 ##表示用户当下的速率,这样做是有问题的!!!!???????
266
+ while (Rnow < Rmin ):##用户速率大于最低速率,
267
+ if BSchanAllocate [n ].count (- 1 )> 0 :#当前基站还有未分配的信道
268
+
269
+ Rnow += max (R [j ])
270
+ chanid = R [j ].index (max (R [j ]))##将当前用户速率值最大值对应的第一个(可能会出现速率并列最大的)信道标号赋值给chanid
271
+ BSchanAllocate [n ][chanid ]= userj ##在基站n的信道s对应位置写入用户坐标
272
+ for rm in xrange (len (R )):##循环速率矩阵行
273
+ #row = R.index(rm)#获取行坐标
274
+ for rn in xrange (len (R [j ])):
275
+ # col = rm.index(rn)##获取列坐标
276
+ if (rm != j and rn != chanid ):R [rm ][rn ]= 0
277
+
278
+ else :
279
+ print "All channels are busy"
280
+ exit (0 )
281
+ n = n + 1
282
+
283
+
284
+ if __name__ == "__main__" :
285
+ print "\n "
286
+ for i in BSchanAllocate :
287
+ print i
288
+
289
+ print len (BSchanAllocate [0 ])- BSchanAllocate [0 ].count (- 1 )
290
+ > >> >> >> e3f12020d4e3a98ad90a9ce41a00f670cd5f2fc8
221
291
0 commit comments