import random
# y= -(400-x)*(400-x)+160000的最大值
# 初始化种群
def creat(number, min_pos, max_pos):
population = []
for i in range(number):
population.append([])# 定义一个二维数组
for i in range(number): # 四个参数:当前位置,速度,适应度,个体最优解
population[i].append(random.randint(min_pos, max_pos))
population[i].append(0)
population[i].append(0)
population[i].append(random.randint(min_pos, max_pos))
return population
# 适应度计算
def fitness(population, number):
for i in range(number):
y = -(400-population[i][0])*(400-population[i][0])+160000
population[i][2] = y
return population
# 速度改变
# v_next = wv_old + c1r1(pbest - x_old) + c2r2(gbest - x_old)
def speep_change(population, w, r1, r2, number, speed_limit):
gbest = 0
temp = 0
for i in range(number):
if temp < population[i][2]:
temp = population[i][2] # 通过最有适应度找到个体
gbest = population[i][0] # 找到群体最优解
# print(gbest)
for i in range(number):
c1 = random.random()
c2 = random.random()
v_next = w*population[i][1] + c1*r1*(population[i][3] - population[i][0]) + c2*r2*(gbest - population[i][0])
if v_next > speed_limit:
v_next = speed_limit
if v_next < -speed_limit:
v_next = -speed_limit
population[i][1] = v_next
return population
# 位置改变
def loc_change(population, number):
for i in range(number):
population[i][0] = population[i][0] + population[i][1]
return population
number = 20
min_pos = 0
max_pos = 1000
w = r1 = r2 = 1
train_times = 200
speed_limit = 0.2*(max_pos - min_pos)
population = creat(number, min_pos, max_pos)
for i in range(train_times):
population = fitness(population, number)
population = speep_change(population, w, r1, r2, number, speed_limit)
population = loc_change(population, number)
# print(population)
population = fitness(population, number)
print(population)
best = 0
temp = 0
for i in range(number):
if temp < population[i][2]:
temp = population[i][2]
best = population[i][0]
print(best)
粒子群算法PSO python简单实现
于 2023-04-26 11:19:04 首次发布