Skip to content

Commit e5f153a

Browse files
committed
5-6
5-6
1 parent 93735a5 commit e5f153a

File tree

1 file changed

+55
-45
lines changed

1 file changed

+55
-45
lines changed

CAPalloction.py

Lines changed: 55 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -107,25 +107,30 @@ def getDM(ux,uy,bsx,bsy):
107107
else:exit(0)
108108
return DM
109109

110-
def interfere(n,s,chanlist,bsx=BSX,bsy=BSY):
110+
def interfere(n,s,chanlist,bsx,bsy):
111111
'''
112112
##不同基站相同信道才会产生干扰,除此之外只有噪声,基站BS_n 在信道chan_s上的干扰,不同基站只要分配了相同编号的信道,
113113
##无论是否给同一个用户都会相互干扰,只是相同编号的信道分配给同一个用户干扰最大
114-
chanlist 是信道的分配列表 等同于下面的BSchanAllocate,已分配信道是用用户坐标表示的,未分配信道值为-1
114+
chanlist 是信道的分配矩阵 等同于下面的BSchanAllocate,已分配信道的位置将-1修改为用用户坐标(UserX,UserY),未分配信道值为-1
115+
116+
信道分配矩阵的每一行必须与基站坐标的每一行对应起来,最后一行是宏基站的信道分配
115117
'''
116-
BSX +=[0]
117-
BSY +=[0]
118+
118119
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)
129134
return interf
130135

131136
##基站到用户的距离DM,行代表某个基站,列代表用户
@@ -147,40 +152,42 @@ def interfere(n,s,chanlist,bsx=BSX,bsy=BSY):
147152
BS5 : [-1,-1,....,-1]
148153
]
149154
'''
150-
def RateNow(chanlist,user,bsx=BSX,bsy=BSY):
155+
def RateNow(chanlist,user,bsx,bsy):
151156
"""
152157
根据当前的用户分配求当前用户的速率 ,BSchanAllocate是信道分配列表,user表示要获取速率的用户
153158
"""
154-
BSX +=[0]
155-
BSY +=[0]
159+
156160
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)
175183
return rate
176184

177185

178-
def channelAllocate(BSCover,bsx=BSX,bsy=BSY):
186+
def channelAllocate(BSCover,bsx,bsy):
179187
"""
180188
181189
"""
182-
BSX=BSX+[0]
183-
BSY=BSY+[0]
190+
184191
BSchanAllocate = [[-1]*channelnum]*TotalNum ####定义一个信道分配的矩阵,行代表一个基站,列代表基站的信道
185192

186193
for n in xrange(len(BSCover)):##n表示当前循环的基站下所有用户的集合编号
@@ -205,7 +212,7 @@ def channelAllocate(BSCover,bsx=BSX,bsy=BSY):
205212
r = []
206213
for j in xrange(channelnum):
207214

208-
Interf = interfere(n, j, BSchanAllocate, BSX, BSY)##n表示的是基站,j 是信道,chanlist是信道分配的列表
215+
Interf = interfere(n, j, BSchanAllocate, bsx, bsy)##n表示的是基站,j 是信道,chanlist是信道分配的列表
209216
# sinr = pt*(D[bs.index(user)])**(-4)/(Interf + P*radius**(-4)/alpha)##求sinr
210217
sinr = pt*(d)**(-4)/(Interf + P*radius**(-4)/alpha)##求sinr
211218
rate = AvgBand*log2(1+sinr)
@@ -221,7 +228,7 @@ def channelAllocate(BSCover,bsx=BSX,bsy=BSY):
221228
j = userj##获取当前用户的下标(用户坐标不存在两个相同的)
222229
print "基站编号: %d"%(n)
223230

224-
Rnow=RateNow(BSchanAllocate, BSCover[n][j], BSX, BSY)##表示用户当下的速率,已改正【【【应该从信道分配list中获取当前用户的当前速率,刚开始用户的求得速率值为0】】】
231+
Rnow=RateNow(BSchanAllocate, BSCover[n][j], bsx, bsy)##表示用户当下的速率,已改正【【【应该从信道分配list中获取当前用户的当前速率,刚开始用户的求得速率值为0】】】
225232
while(Rnow < Rmin):##用户速率大于最低速率,
226233
if BSchanAllocate[n].count(-1)>0:#当前基站还有未分配的信道,还有一个else,如果当前基站的信道数量不够该如何处理
227234
Rnow += max(R[j])
@@ -245,8 +252,11 @@ def channelAllocate(BSCover,bsx=BSX,bsy=BSY):
245252
return BSchanAllocate
246253

247254
if __name__=="__main__":
248-
255+
249256
BSCover = classifyUser(r=100)
257+
258+
BSX = BSX+[0]
259+
BSY = BSY+[0]
250260
##将用户按照基站的覆盖范围分类之后,将宏基站的坐标加入到基站坐标列表中去
251261
# s = 0
252262
# for i in BSCover:
@@ -255,9 +265,9 @@ def channelAllocate(BSCover,bsx=BSX,bsy=BSY):
255265
# print "len(i)=%d"%len(i)
256266
# print "sum user:%d"%s
257267

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
262272

263273

0 commit comments

Comments
 (0)