Allenfenqu/liziquntestttt.py

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