35
35
RelayNum = 2
36
36
TotalNum = MacroNum + PicoNum + FemtoNum + RelayNum
37
37
usernum = np .random .randint (20 ,50 )
38
+ print "usernum=%d" % usernum
38
39
39
40
macroR = 500.0 ##宏基站的覆盖半径/m
40
41
microR = 100.0 ##微基站的覆盖半径/m
@@ -105,7 +106,7 @@ def interfere(n,s,chanlist,BSX,BSY):
105
106
'''
106
107
##不同基站相同信道才会产生干扰,除此之外只有噪声,基站BS_n 在信道chan_s上的干扰,不同基站只要分配了相同编号的信道,
107
108
##无论是否给同一个用户都会相互干扰,只是相同编号的信道分配给同一个用户干扰最大
108
- chanlist 是信道的分配列表 等同于下面的BSchanAllocate,已分配信道是用用户坐标表示的,未分配信道值值为 -1
109
+ chanlist 是信道的分配列表 等同于下面的BSchanAllocate,已分配信道是用用户坐标表示的,未分配信道值为 -1
109
110
'''
110
111
interf = 0
111
112
for i in xrange (len (chanlist )):#循环基站数量次
@@ -127,12 +128,7 @@ def interfere(n,s,chanlist,BSX,BSY):
127
128
"""
128
129
BSCover 一行代表一个基站 下的所有用户
129
130
"""
130
- BSCover = classifyUser (UserX ,UserY ,BSX ,BSY , r = 100 )
131
131
132
- ##将用户按照基站的覆盖范围分类之后,将宏基站的坐标加入到基站坐标列表中去
133
- BSX = BSX + [0 ]
134
- BSY = BSY + [0 ]
135
-
136
132
'''
137
133
#初始化一个信道分配矩阵,每一行代表一个基站的信道的分配,未分配的信道记为-1,如果某个信道分配给用户了,则标记为 用户 坐标
138
134
BSchanAllocate = [
@@ -144,74 +140,82 @@ def interfere(n,s,chanlist,BSX,BSY):
144
140
BS5 : [-1,-1,....,-1]
145
141
]
146
142
'''
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
+ """
154
145
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 )
195
181
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
212
206
213
207
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
+
217
221
0 commit comments