Skip to content

Commit cb955ca

Browse files
committed
5-9.2
5-9.2
1 parent b8178b7 commit cb955ca

File tree

2 files changed

+86
-85
lines changed

2 files changed

+86
-85
lines changed

coverage.pyc

-1.44 KB
Binary file not shown.

pso.py

Lines changed: 86 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,95 +1,96 @@
11
# -*-coding:utf-8 -*-
22
import random
33
import copy
4+
import numpy as np
5+
import matplotlib.pyplot as plt
46

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 #全局最佳适应值
7340

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]
8161

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])
8776

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()
9394

9495

9596

0 commit comments

Comments
 (0)