Skip to content

Commit a5a3381

Browse files
committed
5-3.2
5-3.2
1 parent 0068956 commit a5a3381

File tree

1 file changed

+76
-72
lines changed

1 file changed

+76
-72
lines changed

CAPalloction.py

Lines changed: 76 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
RelayNum = 2
3636
TotalNum = MacroNum+PicoNum+FemtoNum+RelayNum
3737
usernum = np.random.randint(20,50)
38+
print "usernum=%d"%usernum
3839

3940
macroR = 500.0 ##宏基站的覆盖半径/m
4041
microR = 100.0 ##微基站的覆盖半径/m
@@ -105,7 +106,7 @@ def interfere(n,s,chanlist,BSX,BSY):
105106
'''
106107
##不同基站相同信道才会产生干扰,除此之外只有噪声,基站BS_n 在信道chan_s上的干扰,不同基站只要分配了相同编号的信道,
107108
##无论是否给同一个用户都会相互干扰,只是相同编号的信道分配给同一个用户干扰最大
108-
chanlist 是信道的分配列表 等同于下面的BSchanAllocate,已分配信道是用用户坐标表示的,未分配信道值值为-1
109+
chanlist 是信道的分配列表 等同于下面的BSchanAllocate,已分配信道是用用户坐标表示的,未分配信道值为-1
109110
'''
110111
interf = 0
111112
for i in xrange(len(chanlist)):#循环基站数量次
@@ -127,12 +128,7 @@ def interfere(n,s,chanlist,BSX,BSY):
127128
"""
128129
BSCover 一行代表一个基站 下的所有用户
129130
"""
130-
BSCover = classifyUser(UserX,UserY,BSX,BSY, r=100)
131131

132-
##将用户按照基站的覆盖范围分类之后,将宏基站的坐标加入到基站坐标列表中去
133-
BSX = BSX + [0]
134-
BSY = BSY + [0]
135-
136132
'''
137133
#初始化一个信道分配矩阵,每一行代表一个基站的信道的分配,未分配的信道记为-1,如果某个信道分配给用户了,则标记为 用户 坐标
138134
BSchanAllocate = [
@@ -144,74 +140,82 @@ def interfere(n,s,chanlist,BSX,BSY):
144140
BS5 : [-1,-1,....,-1]
145141
]
146142
'''
147-
148-
BSchanAllocate = [[-1]*channelnum]*TotalNum ####定义一个信道分配的矩阵,行代表一个基站,列代表基站的信道
149-
userRateDict = {}##用户速率表,记录的是用户当前信道分配条件下获得的速率值
150-
151-
n = 0##由于list会出现多个相同值(基站范围内不一定总是存在用户)取下标得到第一此出现的值,故循环n,作为全局的控制变量
152-
for bs in BSCover:##bs表示当前循环的基站下所有用户的集合bs = [user(0),user(1),user(1),...,user(n)]
153-
# n = BSCover.index(bs)##获取当前基站对应的下标值,以定位当前基站(BSX[n],BSY[n]),问题是:当出现多个空集时,index()的值是第一次出的下标值
143+
def channelAllocate(BSCover):
144+
"""
154145
155-
if len(bs) > 0 : ##判断bs中如果有用户的话,且不是最有一个基站,最后一个基站是宏基站
156-
##初始化计算基站信息的数据
157-
if n!=(len(BSCover)-1):
158-
pt = microAveragePower###微基站的平均信道功率
159-
P = picoPower ##基站总共功率
160-
radius = 100##m
161-
else:
162-
pt = macroAveragePower##宏基站的平均信道功率
163-
P = macroPower
164-
radius = 500##m
165-
# Interf = 0 ##干扰
166-
AvgBand = channelbandwidth##每个信道的平均带宽
167-
168-
##求当前基站范围内的用户与当前基站的距离
169-
D = []
170-
for useri in bs:#循环当前基站中用户数量次
171-
d = distance(useri[0],useri[1],BSX[n],BSY[n])
172-
D.append(d)##得到当前基站下的用户与当前基站距离的列表
173-
174-
##利用循环求当前基站下:每一个用户与所有信道连接条件下可获得的用户速率
175-
R = []#初始化一个速度矩阵,一行代表当前基站下用户与所有信道的链接所获得速率值列表,列代表信道
176-
for user in bs:
177-
# R = []#初始化一个速度列表,当前循环的基站下覆盖的各个用户:假设信道分配给每一个用户的情形下得到的速率
178-
r = []
179-
for j in xrange(channelnum):
180-
181-
Interf = interfere(n, j, BSchanAllocate, BSX, BSY)##n表示的是基站,j 是信道,chanlist是信道分配的列表
182-
sinr = pt*(D[bs.index(user)])**(-4)/(Interf + P*radius**(-4)/alpha)##求sinr
183-
rate = AvgBand*log2(1+sinr)
184-
##将得到的速率值r,追加到当前 用户速度一维列表中,
185-
#每一个速率值对应一个信道:R =[r0,r1,r2,..]
186-
r.append(rate)
187-
R.append(r)
188-
print R
189-
print len(R[0])
190-
191-
##下一步进行信道的分配,使用的贪心算法,用户选择(或者说基站分配)当前速率值最大的信道
192-
193-
for userj in bs:
194-
j = bs.index(userj)##获取当前用户的下标(用户坐标不会存在重复)
146+
"""
147+
BSchanAllocate = [[-1]*channelnum]*TotalNum ####定义一个信道分配的矩阵,行代表一个基站,列代表基站的信道
148+
n = 0##由于list会出现多个相同值(基站范围内不一定总是存在用户)取下标得到第一此出现的值,故循环n,作为全局的控制变量
149+
for bs in BSCover:##bs表示当前循环的基站下所有用户的集合bs = [user(0),user(1),user(1),...,user(n)]
150+
151+
if len(bs) > 0 : ##判断bs中如果有用户的话,且不是最有一个基站,最后一个基站是宏基站
152+
##初始化计算基站信息的数据
153+
if n!=(len(BSCover)-1):
154+
pt = microAveragePower###微基站的平均信道功率
155+
P = picoPower ##基站总共功率
156+
radius = 100##m
157+
else:
158+
pt = macroAveragePower##宏基站的平均信道功率
159+
P = macroPower
160+
radius = 500##m
161+
162+
AvgBand = channelbandwidth##每个信道的平均带宽
163+
164+
"""第一步:获得当前前基站下:每一个用户与所有信道连接条件下得到的用户速率"""
165+
R = []#初始化一个速度矩阵,一行代表当前基站下用户与所有信道的链接所获得速率值列表,列代表信道
166+
for user in bs:
167+
d = distance(user[0],user[1],BSX[n],BSY[n])## 用户与当前基站的距离
168+
r = []
169+
for j in xrange(channelnum):
170+
171+
Interf = interfere(n, j, BSchanAllocate, BSX, BSY)##n表示的是基站,j 是信道,chanlist是信道分配的列表
172+
# sinr = pt*(D[bs.index(user)])**(-4)/(Interf + P*radius**(-4)/alpha)##求sinr
173+
sinr = pt*(d)**(-4)/(Interf + P*radius**(-4)/alpha)##求sinr
174+
rate = AvgBand*log2(1+sinr)
175+
r.append(rate)
176+
##将得到的速率值r,追加到当前 用户速度一维列表中,
177+
#每一个速率值对应一个信道:R =[r0,r1,r2,..]
178+
179+
R.append(r)
180+
print len(R)
195181

196-
Rnow=0##表示用户当下的速率,这样做是有问题的!!!!???????
197-
while(Rnow < Rmin):##用户速率大于最低速率,
198-
if BSchanAllocate[n].count(-1)>0:#当前基站还有未分配的信道
199-
Rnow += max(R[j])
200-
chanid = R[j].index(max(R[j]))##将当前用户速率值最大值对应的第一个(可能会出现速率并列最大的)信道标号赋值给chanid
201-
for rm in R:##循环速率矩阵行
202-
row = R.index(rm)#获取行坐标
203-
for rn in rm:
204-
col = rm.index(rn)##获取列坐标
205-
if (row!=j and col!=chanid):R[row][col]=0
206-
BSchanAllocate[n][chanid]=userj##在基站n的信道s对应位置写入用户坐标
207-
else:
208-
print "All channels are busy"
209-
exit(0)
210-
n=n+1
211-
182+
"""第二步:进行信道的分配,使用的贪心算法,用户选择(或者说基站分配)当前速率值最大的信道"""
183+
for userj in bs:
184+
j = bs.index(userj)##获取当前用户的下标(用户坐标不存在两个相同的)
185+
186+
Rnow=0##表示用户当下的速率,这样做是有问题的!!!!???????
187+
while(Rnow < Rmin):##用户速率大于最低速率,
188+
if BSchanAllocate[n].count(-1)>0:#当前基站还有未分配的信道,还有一个else,如果当前基站的信道数量不够该如何处理
189+
Rnow += max(R[j])
190+
chanid = R[j].index(max(R[j]))##将当前用户速率值最大值对应的第一个(可能会出现速率并列最大的)信道标号赋值给chanid
191+
BSchanAllocate[n][chanid]=userj##在基站n的信道s对应位置写入用户坐标
192+
193+
for rm in xrange(len(R)):##循环速率矩阵行,将本基站其他用户对应这条信道的速率设置为0
194+
# row = R.index(rm)#获取行坐标
195+
for rn in xrange(len(R[j])):
196+
# col = rm.index(rn)##获取列坐标
197+
if (rm!=j and rn==chanid):R[rm][rn]=0##将已经分配的信道对应其他用户的速率矩阵位置设置为0,表示此信道已经分配不能再分配其他人
198+
#
199+
else: ###如果当前基站的信道已经分配完毕,暂时输出下面的字符串,后续会继续处理这种情况
200+
201+
print "All channels are busy"
202+
exit(0)
203+
n=n+1 ##当前基站的分配完毕,n+1进入下一个基站的额信道分配
204+
205+
return BSchanAllocate
212206

213207
if __name__=="__main__":
214-
print "\n"
215-
# for i in BSchanAllocate:
216-
# print i
208+
209+
BSCover = classifyUser(UserX,UserY,BSX,BSY, r=100)
210+
##将用户按照基站的覆盖范围分类之后,将宏基站的坐标加入到基站坐标列表中去
211+
BSX = BSX + [0]
212+
BSY = BSY + [0]
213+
# for i in xrange(len(BSX)):
214+
# print (BSX[i],BSY[i])
215+
# print "\n"
216+
#
217+
BSchanAllocate = channelAllocate(BSCover)
218+
for i in BSchanAllocate:
219+
print i
220+
217221

0 commit comments

Comments
 (0)