76 lines
2.8 KiB
Python
76 lines
2.8 KiB
Python
import numpy as np
|
|
|
|
|
|
def PSO_multi_obj(fitness_func, n_particles, n_dims, n_objs, max_iter=100, w=0.7, c1=1.4, c2=1.4):
|
|
# 定义初始的粒子群
|
|
swarm_position = np.empty((n_particles, n_dims))
|
|
for i in range(n_particles):
|
|
swarm_position[i] = individuals['chrom'][i]
|
|
|
|
# 定义粒子群速度
|
|
swarm_velocity = np.zeros((n_particles, n_dims))
|
|
|
|
# 定义粒子群最优位置
|
|
swarm_best_position = swarm_position.copy()
|
|
|
|
# 计算初始粒子群适应度
|
|
swarm_fitness = np.empty((n_particles, n_objs))
|
|
for i in range(n_particles):
|
|
swarm_fitness[i] = fitness_func(individuals['chrom'][i])
|
|
|
|
# 定义每个粒子历史最优位置
|
|
particle_best_position = swarm_position.copy()
|
|
|
|
# 定义每个粒子历史最优适应度
|
|
particle_best_fitness = swarm_fitness.copy()
|
|
|
|
# 定义全局最优位置
|
|
global_best_position = swarm_best_position[np.argmin(swarm_fitness)]
|
|
|
|
# 定义全局最优适应度
|
|
global_best_fitness = np.min(swarm_fitness)
|
|
|
|
# 进行迭代
|
|
for t in range(max_iter):
|
|
# 更新粒子群速度和位置
|
|
swarm_velocity = w * swarm_velocity + \
|
|
c1 * np.random.rand(n_particles, n_dims) * (particle_best_position - swarm_position) + \
|
|
c2 * np.random.rand(n_particles, n_dims) * (global_best_position - swarm_position)
|
|
swarm_position += swarm_velocity
|
|
|
|
# 将超出边界的位置调整到边界内
|
|
for i in range(n_particles):
|
|
for j in range(n_dims):
|
|
if swarm_position[i][j] < bound[j][0]:
|
|
swarm_position[i][j] = bound[j][0]
|
|
if swarm_position[i][j] > bound[j][1]:
|
|
swarm_position[i][j] = bound[j][1]
|
|
|
|
# 计算新的适应度
|
|
for i in range(n_particles):
|
|
fitness = fitness_func(swarm_position[i])
|
|
swarm_fitness[i] = fitness
|
|
|
|
# 更新粒子历史最优位置
|
|
for i in range(n_particles):
|
|
if np.min(swarm_fitness[i]) < np.min(particle_best_fitness[i]):
|
|
particle_best_fitness[i] = swarm_fitness[i]
|
|
particle_best_position[i] = swarm_position[i]
|
|
|
|
|
|
# 更新粒子群最优位置
|
|
for i in range(n_particles):
|
|
if np.min(particle_best_fitness[i]) < np.min(swarm_fitness[i]):
|
|
swarm_best_position[i] = particle_best_position[i]
|
|
|
|
# 更新全局最优位置
|
|
if np.min(swarm_fitness) < global_best_fitness:
|
|
global_best_fitness = np.min(swarm_fitness)
|
|
global_best_position = swarm_position[np.argmin(swarm_fitness)]
|
|
|
|
# 记录每一次迭代的全局最优适应度
|
|
trace.append(global_best_fitness)
|
|
|
|
# 返回最终的全局最优位置和适应度
|
|
return global_best_position
|