4
4
import numpy as np
5
5
import matplotlib .pyplot as plt
6
6
from CAPalloction import readFile ,classifyUser ,getPower ,channelAllocate ,turnInToParticle
7
-
8
-
9
-
10
- class Bird (object ):##定义一个鸟类(粒子类)
11
-
12
- def __init__ (self , speed , position , fit , lBestPosition , lBestFit ):
13
- '''
14
- 初始化的信息:speed粒子的速率,position:粒子的位置,fit适应度,lBestPostion粒子经理的最佳位置,
15
- lBestFit粒子的最佳是硬度值
16
- '''
17
- self .speed = speed
18
- self .position = position
19
- self .fit = fit
20
- self .lBestFit = lBestFit
21
- self .lBestPosition = lBestPosition
22
7
23
8
#----------------------PSO参数设置---------------------------------
24
9
class PSO ():
25
-
26
10
def __init__ (self ,pN ,dim ,max_iter ):
27
11
self .w = 0.8
28
- self .c1 = 2
29
- self .c2 = 2
12
+ self .c1 = 1.4961 # 2
13
+ self .c2 = 1.4961 # 2
30
14
self .r1 = 0.6
31
15
self .r2 = 0.3
32
16
self .channelnum = 64
@@ -35,15 +19,19 @@ def __init__(self,pN,dim,max_iter):
35
19
self .max_iter = max_iter #迭代次数
36
20
self .X = np .zeros ((self .pN ,self .dim )) #所有粒子的位置和速度
37
21
self .V = np .zeros ((self .pN ,self .dim ))
38
- self .pbest = np .zeros ((self .pN ,self .dim )) #个体经历的最佳位置和全局最佳位置
39
- self .gbest = np .zeros ((1 ,self .dim ))
22
+ self .pbest = np .zeros ((self .pN ,self .dim )) #个体经历的最佳位置
23
+ self .gbest = np .zeros ((1 ,self .dim )) #全局最佳位置
40
24
self .p_fit = np .zeros (self .pN ) #每个个体的历史最佳适应值
41
25
self .fit = 1e10 #全局最佳适应值
42
-
26
+ self .filename = ['user.txt' ,'bs.txt' ]
27
+ self .UserX ,self .UserY ,self .BSX ,self .BSY = readFile (* self .filename )
28
+ self .BSCover = classifyUser (100 ,self .UserX ,self .UserY ,self .BSX ,self .BSY )
29
+ self .BSchanAllocate = [[- 1 for i in xrange (self .channelnum )] for j in xrange (len (self .BSCover ))]#初始化信道分配
43
30
#---------------------目标函数Sphere函数-----------------------------
44
31
def function (self ,x ): #x是列表
45
32
'''
46
33
首要解决的问题是 目标函数的的表达式
34
+ 由于粒子由是不同信道的功率等级(比例)表示的,所以
47
35
'''
48
36
sum = 0
49
37
length = len (x )
@@ -54,40 +42,31 @@ def function(self,x): #x是列表
54
42
55
43
#---------------------初始化种群----------------------------------
56
44
def init_Population (self ):
57
- filename = ['user.txt' ,'bs.txt' ]
58
- UserX ,UserY ,BSX ,BSY = readFile (* filename )
59
- BSCover = classifyUser (100 ,UserX ,UserY ,BSX ,BSY )
60
- BSchanAllocate = [[- 1 for i in xrange (self .channelnum )] for j in xrange (len (BSCover ))]#初始化信道分配
61
45
####将宏基站的坐标加入到基站的坐标列表中
62
- BSX = BSX + [0.0 ]
63
- BSY = BSY + [0.0 ]
46
+ self . BSX = self . BSX + [0.0 ]
47
+ self . BSY = self . BSY + [0.0 ]
64
48
for i in xrange (5 ):
65
- BSchanAllocate = channelAllocate (BSCover ,BSchanAllocate ,BSX ,BSY )
49
+ self . BSchanAllocate = channelAllocate (self . BSCover ,self . BSchanAllocate ,self . BSX ,self . BSY )
66
50
67
51
for i in xrange (self .pN ):
68
- self .X [i ] = turnInToParticle (getPower (BSchanAllocate ))#初始化粒子位置
52
+ self .X [i ] = turnInToParticle (getPower (self . BSchanAllocate ))#初始化粒子位置
69
53
for j in range (self .dim ):
70
- self .V [i ][j ] = random .uniform (0 ,1 )
71
- self .pbest [i ] = self .X [i ]
72
- tmp = self .function (self .X [i ])#目标函数
73
- self .p_fit [i ] = tmp
74
- if (tmp < self .fit ):
75
- self .fit = tmp
54
+ self .V [i ][j ] = random .uniform (0 ,1 ) #初始化粒子的速度
55
+ self .pbest [i ] = self .X [i ] ##每个粒子的最佳位置
56
+ tmp = self .function (self .X [i ])#调用目标函数,计算当前粒子的适应值,目标函数是处理每一个粒子的,在这个表达式中显而易见
57
+ self .p_fit [i ] = tmp ##每个粒子最佳适应值
58
+ if (tmp < self .fit ): #判断小于全局最佳适应值,将当前粒子的最佳适应值赋值给全局最佳适应值
59
+ self .fit = tmp #
76
60
self .gbest = self .X [i ]
77
-
78
- # for i in range(self.pN):
79
- # for j in range(self.dim):
80
- # self.X[i][j] = random.uniform(0,1) #初始化种群的位置
81
- # self.V[i][j] = random.uniform(0,1) #初始化种群的速度
82
- # self.pbest[i] = self.X[i]
83
- # tmp = self.function(self.X[i])
84
- # self.p_fit[i] = tmp
85
- # if(tmp < self.fit):
86
- # self.fit = tmp
87
- # self.gbest = self.X[i]
88
- #
89
-
90
-
61
+ #--------------------------粒子的惯性权重-----------------------------
62
+ def inertia_Weight (self ,t ):
63
+ """保证惯性权重开始:0.9全局搜索能力强,最后为0.1:局部搜索能力强"""
64
+ k = (0.9 - 0.1 )/ (1 - self .max_iter )
65
+ b = (0.9 * self .max_iter - 0.1 )/ (self .max_iter - 1 )
66
+ y = k * t + b
67
+ return y
68
+
69
+
91
70
#----------------------更新粒子位置----------------------------------
92
71
def iterator (self ):
93
72
fitness = []
@@ -97,16 +76,18 @@ def iterator(self):
97
76
if (temp < self .p_fit [i ]): #更新个体最优
98
77
self .p_fit [i ] = temp
99
78
self .pbest [i ] = self .X [i ]
100
- if (self .p_fit [i ] < self .fit ): #更新全局最优
79
+ if (self .p_fit [i ] < self .fit ):#更新全局最优
101
80
self .gbest = self .X [i ]
102
- self .fit = self .p_fit [i ]
81
+ self .fit = self .p_fit [i ]
82
+ self .w = self .inertia_Weight (t )##调用类内部的函数,改变w的值,收敛速度明显加快
103
83
for i in range (self .pN ):
104
84
self .V [i ] = self .w * self .V [i ] + self .c1 * self .r1 * (self .pbest [i ] - self .X [i ])+ self .c2 * self .r2 * (self .gbest - self .X [i ])
105
85
106
86
self .X [i ] = self .X [i ] + self .V [i ]
107
87
fitness .append (self .fit )
108
88
print (self .fit ) #输出最优值
109
89
return fitness
90
+ #----------------------------------粒子群类构造结束-------------------------------------------------
110
91
if __name__ == "__main__" :
111
92
#----------------------程序执行-----------------------
112
93
max_iter = 200
0 commit comments