|
1 | 1 | # -*-coding:utf-8 -*-
|
2 | 2 | import random
|
3 | 3 | import copy
|
| 4 | +import numpy as np |
| 5 | +import matplotlib.pyplot as plt |
4 | 6 |
|
5 |
| -birds=int(raw_input('Enter count of bird: ')) |
6 |
| -xcount=int(raw_input('Enter count of x: ')) |
7 |
| -pos=[] |
8 |
| -speed=[] |
9 |
| -bestpos=[] |
10 |
| -birdsbestpos=[] |
11 |
| -w=0.8 |
12 |
| -c1=2 |
13 |
| -c2=2 |
14 |
| -r1=0.6 |
15 |
| -r2=0.3 |
16 |
| -for i in range(birds): |
17 |
| - pos.append([]) |
18 |
| - speed.append([]) |
19 |
| - bestpos.append([]) |
20 |
| - |
21 |
| -def GenerateRandVec(List): |
22 |
| - for i in range(xcount): |
23 |
| - List.append(random.randrange(1,100)) |
24 |
| - |
25 |
| -def CalDis(List): |
26 |
| - dis=0.0 |
27 |
| - for i in List: |
28 |
| - dis+=i**2 |
29 |
| - return dis |
30 |
| - |
31 |
| -for i in range(birds): #initial all birds' pos,speed |
32 |
| - GenerateRandVec(pos[i]) |
33 |
| - GenerateRandVec(speed[i]) |
34 |
| - bestpos[i]=copy.deepcopy(pos[i]) |
35 |
| - |
36 |
| -def FindBirdsMostPos(): |
37 |
| - best=CalDis(bestpos[0]) |
38 |
| - index=0 |
39 |
| - for i in range(birds): |
40 |
| - temp=CalDis(bestpos[i]) |
41 |
| - if temp<best: |
42 |
| - best=temp |
43 |
| - index=i |
44 |
| - return bestpos[index] |
45 |
| - |
46 |
| -birdsbestpos=FindBirdsMostPos() #initial birdsbestpos |
47 |
| - |
48 |
| -def NumMulVec(num,List): #result is in list |
49 |
| - for i in range(len(List)): |
50 |
| - List[i]*=num |
51 |
| - return List |
52 |
| - |
53 |
| -def VecSubVec(list1,list2): #result is in list1 |
54 |
| - for i in range(len(list1)): |
55 |
| - list1[i]-=list2[i] |
56 |
| - return list1 |
57 |
| - |
58 |
| -def VecAddVec(list1,list2): #result is in list1 |
59 |
| - for i in range(len(list1)): |
60 |
| - list1[i]+=list2[i] |
61 |
| - return list1 |
62 |
| - |
63 |
| -def UpdateSpeed(): |
64 |
| - #global speed |
65 |
| - for i in range(birds): |
66 |
| - temp1=NumMulVec(w,speed[i][:]) |
67 |
| - temp2=VecSubVec(bestpos[i][:],pos[i]) |
68 |
| - temp2=NumMulVec(c1*r1,temp2[:]) |
69 |
| - temp1=VecAddVec(temp1[:],temp2) |
70 |
| - temp2=VecSubVec(birdsbestpos[:],pos[i]) |
71 |
| - temp2=NumMulVec(c2*r2,temp2[:]) |
72 |
| - speed[i]=VecAddVec(temp1,temp2) |
| 7 | + |
| 8 | + |
| 9 | +class Bird(object):##定义一个鸟类(粒子类) |
| 10 | + |
| 11 | + def __init__(self, speed, position, fit, lBestPosition, lBestFit): |
| 12 | + ''' |
| 13 | + 初始化的信息:speed粒子的速率,position:粒子的位置,fit适应度,lBestPostion粒子经理的最佳位置, |
| 14 | + lBestFit粒子的最佳是硬度值 |
| 15 | + ''' |
| 16 | + self.speed = speed |
| 17 | + self.position = position |
| 18 | + self.fit = fit |
| 19 | + self.lBestFit = lBestFit |
| 20 | + self.lBestPosition = lBestPosition |
| 21 | + |
| 22 | + |
| 23 | +#----------------------PSO参数设置--------------------------------- |
| 24 | +class PSO(): |
| 25 | + def __init__(self,pN,dim,max_iter): |
| 26 | + self.w = 0.8 |
| 27 | + self.c1 = 2 |
| 28 | + self.c2 = 2 |
| 29 | + self.r1= 0.6 |
| 30 | + self.r2=0.3 |
| 31 | + self.pN = pN #粒子数量 |
| 32 | + self.dim = dim #搜索维度 |
| 33 | + self.max_iter = max_iter #迭代次数 |
| 34 | + self.X = np.zeros((self.pN,self.dim)) #所有粒子的位置和速度 |
| 35 | + self.V = np.zeros((self.pN,self.dim)) |
| 36 | + self.pbest = np.zeros((self.pN,self.dim)) #个体经历的最佳位置和全局最佳位置 |
| 37 | + self.gbest = np.zeros((1,self.dim)) |
| 38 | + self.p_fit = np.zeros(self.pN) #每个个体的历史最佳适应值 |
| 39 | + self.fit = 1e10 #全局最佳适应值 |
73 | 40 |
|
74 |
| -def UpdatePos(): |
75 |
| - global bestpos,birdsbestpos |
76 |
| - for i in range(birds): |
77 |
| - VecAddVec(pos[i],speed[i]) |
78 |
| - if CalDis(pos[i])<CalDis(bestpos[i]): |
79 |
| - bestpos[i]=copy.deepcopy(pos[i]) |
80 |
| - birdsbestpos=FindBirdsMostPos() |
| 41 | +#---------------------目标函数Sphere函数----------------------------- |
| 42 | + def function(self,x): |
| 43 | + sum = 0 |
| 44 | + length = len(x) |
| 45 | + x = x**2 |
| 46 | + for i in range(length): |
| 47 | + sum += x[i] |
| 48 | + return sum |
| 49 | +#---------------------初始化种群---------------------------------- |
| 50 | + def init_Population(self): |
| 51 | + for i in range(self.pN): |
| 52 | + for j in range(self.dim): |
| 53 | + self.X[i][j] = random.uniform(0,1) |
| 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 |
| 60 | + self.gbest = self.X[i] |
81 | 61 |
|
82 |
| -for i in range(100): |
83 |
| - #print birdsbestpos |
84 |
| - print CalDis(birdsbestpos) |
85 |
| - UpdateSpeed() |
86 |
| - UpdatePos() |
| 62 | +#----------------------更新粒子位置---------------------------------- |
| 63 | + def iterator(self): |
| 64 | + fitness = [] |
| 65 | + for t in range(self.max_iter): |
| 66 | + for i in range(self.pN): #更新gbest\pbest |
| 67 | + temp = self.function(self.X[i]) |
| 68 | + if(temp<self.p_fit[i]): #更新个体最优 |
| 69 | + self.p_fit[i] = temp |
| 70 | + self.pbest[i] = self.X[i] |
| 71 | + if(self.p_fit[i] < self.fit): #更新全局最优 |
| 72 | + self.gbest = self.X[i] |
| 73 | + self.fit = self.p_fit[i] |
| 74 | + for i in range(self.pN): |
| 75 | + 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]) |
87 | 76 |
|
88 |
| - |
89 |
| -# raw_input() |
90 |
| - |
91 |
| - |
92 |
| - |
| 77 | + self.X[i] = self.X[i] + self.V[i] |
| 78 | + fitness.append(self.fit) |
| 79 | + print(self.fit) #输出最优值 |
| 80 | + return fitness |
| 81 | +#----------------------程序执行----------------------- |
| 82 | +my_pso = PSO(pN=30,dim=5,max_iter=100) |
| 83 | +my_pso.init_Population() |
| 84 | +fitness = my_pso.iterator() |
| 85 | +#-------------------画图-------------------- |
| 86 | +plt.figure(1) |
| 87 | +plt.title("Figure1") |
| 88 | +plt.xlabel("iterators", size=14) |
| 89 | +plt.ylabel("fitness", size=14) |
| 90 | +t = np.array([t for t in range(0,100)]) |
| 91 | +fitness = np.array(fitness) |
| 92 | +plt.plot(t,fitness, color='b',linewidth=3) |
| 93 | +plt.show() |
93 | 94 |
|
94 | 95 |
|
95 | 96 |
|
|
0 commit comments