#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author: 'JF'
# name: PSO
# datetime:2022/1/11 17:26
# software:PyCharm
import random
import numpy as np
import matplotlib.pyplot as plt
class PSO:
"""粒子群算法
Parameters:
------------
dimension:变量维数
times:迭代次数上限
size:种群大小
x_low:位置约束最小值
x_up:位置约束最大值
v_low:速度约束最小值
v_high:速度约束最大值
Returns:
-------------
final_best:最佳变量
"""
def __init__(self,dimension,times,size,x_low,x_up,v_low,v_high):
#初始化
self.dimension = dimension #变量个数
self.time = times # 迭代次数
self.size = size # 种群大小
self.bound = [x_low, x_up] #变量约束
self.v_low = v_low #速度最小约束
self.v_high = v_high#速度最大约束
self.x=np.zeros((self.size,self.dimension))#所有粒子的位置
self.v =np.zeros((self.size,self.dimension))#所有粒子的速度
self.p_best = np.zeros((self.size,self.dimension))# 每个粒子的历史最优位置
self.g_best = np.zeros((1,self.dimension))[0]# 全局历史最优
#初始化第0次迭代的全局最优解
temp = -100000
for i in range(self.size):
for j in range(self.dimension):
self.x[i][j] = random.uniform(self.bound[0][j],self.bound[1][j])
self.v[i][j] = random.uniform(self.v_low,self.v_high)
self.p_best[i] = self.x[i]
fit = self.fitness(self.p_best[i])
# 修改
if fit > temp:
self.g_best = self.p_best[i]
temp = fit
def fitness(self,_x):
"计算个体适应值"
# _y = math.sqrt(reduce(lambda __x, __y: __x ** 2 + __y ** 2, _x))
# y = math.floor()#目标函数
_y = -np.abs(np.sin(_x[0]) * np.cos(_x[1]) * np.exp(np.abs(1 - np.sqrt(_x[0] ** 2 + _x[1] ** 2) / np.pi)))
return _y
def update(self, size):
c1 = 2.0 #个体学习因子
c2 = 2.0 #群体学习因子
w = 0.8 #自身权重因子
for i in range(size):
#更新速度(核心)
self.v[i] = w*self.v[i]+c1 * random.uniform(0,1)*(self.p_best[i]-self.x[i])+c2 * random.uniform(0,1)*(self.g_best-self.x[i])
#速度限制
for j in range(self.dimension):
if self.v[i][j] < self.v_low:self.v[i][j]=self.v_low
if self.v[i][j]>self.v_high:self.v[i][j] = self.v_high
#更新位置
self.x[i] = self.x[i] + self.v[i]
# 位置限制
for j in range(self.dimension):
if self.x[i][j]<self.bound[0][j]:self.x[i][j] = self.bound[0][j]
if self.x[i][j]>self.bound[1][j]:self.x[i][j] = self.bound[1][j]
# 更新p_best和g_best
if self.fitness(self.x[i])>self.fitness(self.p_best[i]):self.p_best[i]=self.x[i]
if self.fitness(self.x[i])>self.fitness(self.g_best):self.g_best=self.x[i]
def pso(self,draw_figure):
best=[]
# self.final_best = np.array([1,2,3,4,5])
self.final_best = np.random.randn(self.dimension)
for gen in range(self.time):
self.update(self.size)
if self.fitness(self.g_best)>self.fitness(self.final_best):
self.final_best = self.g_best.copy()
print(f'当前最佳位置:{self.final_best}')
# print(f'当前最佳适应度:{temp}')
best.append(self.fitness(self.final_best))
if draw_figure:
plt.figure(num=1)
plt.plot(best, color='red',marker='.',ms=15)
plt.show()
return self.final_best
if __name__ == '__main__':
times= 1000
size= 20
dimension = 2
v_low = -0.5
v_high = 0.5
x_low = [-10,-10]
x_up=[10,10]
pso = PSO(dimension,times,size,x_low,x_up,v_low,v_high)
pso.pso(True)
粒子群优化算法的python实现(带例子、详细注释版、迭代结果可视化)
版权申诉
38 浏览量
2023-09-11
09:19:52
上传
评论
收藏 2KB ZIP 举报
小风飞子
- 粉丝: 321
- 资源: 1500
最新资源
- 2001~2022年上市公司数字赋能指数.dta
- 2001~2022年上市公司数字赋能指数.xlsx
- 信息办公石大在线财务管理系统(含源码)-shidacaiwu.rar
- 信息办公电信计费系统完整代码-netctossconformity.rar
- matlab实现TD-SCDMA中初始同步捕捉DwPTS下行同步导频时隙的仿真.zip
- 信息办公玉玺学生信息管理系统-webapps.rar
- 信息办公基于struts的图书管理系统-struts-ts.rar
- 管家婆分销ERP V1 V3 A8II TOP V10.0.2最新全版本通用
- 信息办公基于Ajax+J2EE的MicroERP源码下载-microerp-0.1.rar
- 信息办公双鱼林jsp人事工资系统-wagesmanagesystem.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈