PSO 算法的变体python实现
上演化计算课的时候老师让我们实现EOPSO算法(一种精英反向的粒子群优化算法),下面是他的算法步骤:


首先我们需要知道一些基础知识:
(1)基础PSO算法

(2)精英反向解

import numpy as np
import random
import math class Population:
def __init__(self,min_range_x,max_range_x,min_range_v,max_range_v,w,c1,c2,r1,r2,size,dim,rounds,f,CR,k,object_func):
self.min_range_x = min_range_x
self.max_range_x = max_range_x
self.min_range_v = min_range_v
self.max_range_v = max_range_v
self.w = w
self.c1 = c1
self.c2 = c2
self.r1 = r1
self.r2 = r2
self.size = size
self.dimension = dim
self.rounds = rounds
self.f = f
self.CR = CR
self.k = k
self.get_object_function_value = object_func
self.cur_round = 0
#初始化粒子位置和速度,gbest,pbest,精英反向解
self.X = np.array([np.array([random.uniform(self.min_range_x, self.max_range_x) for s in range(self.dimension)])
for tmp in range(size)])
self.V = np.array([np.array([random.uniform(self.min_range_v, self.max_range_v) for s in range(self.dimension)])
for tmp in range(size)])
self.object_function_values = [self.get_object_function_value(v) for v in self.X]
self.pbest = self.X.copy()
self.gbest = self.X[np.argmin(self.object_function_values)] # self.opx = [np.array([self.k * (self.X[:,s].min() + self.X[:,s].max) - self.X[tmp][s] for s in range(self.dimension)])
# for tmp in range(size)]
self.opx = np.zeros_like(self.X)
self.m = np.zeros_like(self.gbest) #生成反向精英向量
def make_op(self):
for i in range(self.size):
for j in range(self.dimension):
da=self.X[:,j].min()
db=self.X[:,j].max()
self.opx[i][j] = self.k*(da+db) - self.X[i][j]
if self.opx[i][j] < self.min_range_x or self.opx[i][j] > self.max_range_x:
self.opx[i][j] = random.uniform(self.min_range_x, self.max_range_x) #选择
def select(self):
for i in range(self.size):
x1 = self.X[i]
x2 = self.opx[i]
if self.get_object_function_value(x1) >= self.get_object_function_value(x2):
self.pbest[i] = x2
else:
self.pbest[i] = x1
if self.get_object_function_value(self.pbest[i]) <= self.get_object_function_value(self.gbest):
self.gbest = self.pbest[i] # 变异
def mutate(self):
for i in range(self.size):
r0, r1, r2, r3 = 0, 0, 0, 0
while r0 == r1 or r1 == r2 or r2 == r3 or r0 == r3 or r0 == r2 or r1 == r3 or r0 == i:
r0 = random.randint(0, self.size - 1)
r1 = random.randint(0, self.size - 1)
r2 = random.randint(0, self.size - 1)
r3 = random.randint(0, self.size - 1)
#变异向量
for j in range(self.dimension):
self.m[j] = self.gbest[j] + self.f * (self.X[r0][j] - self.X[r1][j]) + self.f * (self.X[r2][j] - self.X[r3][j])
if self.m[j] > self.max_range_x or self.m[j] < self.min_range_x:
self.m[j] = random.uniform(self.min_range_x, self.max_range_x) #交叉
def crossover(self):
Jrand = random.randint(0, self.dimension)
for j in range(self.dimension):
if random.random() >= self.CR and j != Jrand:
self.gbest[j] = self.m[j] #更新速度和位置
def updata(self):
for i in range(self.size):
for j in range(self.dimension):
self.V[i][j] = self.w * self.V[i][j] + self.c1 * self.r1 * (self.pbest[i][j] - self.X[i][j]) + \
self.c2 * self.r2 * (self.gbest[j] - self.X[i][j])
self.X[i][j] = self.X[i][j] + self.V[i][j] def print_best(self):
m = min(self.object_function_values)
i = self.object_function_values.index(m)
print("轮数:" + str(self.cur_round))
print("最佳个体:" + str(self.X[i]))
print("目标函数值:" + str(m)) def evolution(self):
JR = 0.3
while self.cur_round < self.rounds:
if random.random() < JR:
self.make_op()
self.select()
else:
self.updata()
self.mutate()
self.crossover()
self.print_best()
self.cur_round = self.cur_round + 1 if __name__ == "__main__":
def func(x):
return x**2
p = Population(min_range_x=-3,max_range_x=3,min_range_v=-3,max_range_v=3,w=0.6,c1=1.193,c2=1.193,
r1=random.random(),r2=random.random(),size=30,dim=1,rounds=100,f=1,CR=0.1,k=random.random()
,object_func=func)
p.evolution()
PSO 算法的变体python实现的更多相关文章
- 道长的算法笔记:KMP算法及其各种变体
(一)如何优化暴力算法 Waiting... (二)KMP模板 KMP 算法的精髓在于 \(next\) 数组,\(next[i]=j\) 代表 \(p[1,j]=p[i-j+1,i]\),\(nex ...
- TensorFlow利用A3C算法训练智能体玩CartPole游戏
本教程讲解如何使用深度强化学习训练一个可以在 CartPole 游戏中获胜的模型.研究人员使用 tf.keras.OpenAI 训练了一个使用「异步优势动作评价」(Asynchronous Advan ...
- DRL 教程 | 如何保持运动小车上的旗杆屹立不倒?TensorFlow利用A3C算法训练智能体玩CartPole游戏
本教程讲解如何使用深度强化学习训练一个可以在 CartPole 游戏中获胜的模型.研究人员使用 tf.keras.OpenAI 训练了一个使用「异步优势动作评价」(Asynchronous Advan ...
- 模拟退火算法SA原理及python、java、php、c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径
模拟退火算法SA原理及python.java.php.c++语言代码实现TSP旅行商问题,智能优化算法,随机寻优算法,全局最短路径 模拟退火算法(Simulated Annealing,SA)最早的思 ...
- 自然语言19.1_Lemmatizing with NLTK(单词变体还原)
QQ:231469242 欢迎喜欢nltk朋友交流 https://www.pythonprogramming.net/lemmatizing-nltk-tutorial/?completed=/na ...
- Jade——变体的HTML
什么是jade? jade是一个模板引擎,是变体的HTML. 模板引擎就是一个库,用来解释素具渲染视图的框架,也可以叫做HTML的预处理语言. jade是Node.js的一个模板引擎,他的语法借鉴了H ...
- RNN及其变体框架
RNN及其变体框架 含RNN推导 LSTM理解 理解LSTM网络 算法细节理解及参考文献
- 【Visual Lisp】变体与安全数组
(vlax-make-variant) ;;创建一个未初始化的变体 ;;01.整型值变体(setq myvar (vlax-make-variant 10)) ;;创建整型值变体,返回 #<va ...
- labview 变体数据类型
变体数据类型是LabVIEW中多种数据类型的容器.将其它数据转换为变体时,变体将存储数据和数据的原始类型,保证日后可将变体数据反向转换. 例如,如将字符串数据转换为变体,变体将存储字符串的文本,以及说 ...
- 机器学习经典算法详解及Python实现--基于SMO的SVM分类器
原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector ...
随机推荐
- openssl常用操作
参考:https://www.golinuxcloud.com/openssl-view-certificate/ 查看证书信息 openssl x509 -in server.crt -text - ...
- 第二周day6
第二周day6,星期六 所花时间:0 代码量:0 搏客量:1 了解到的知识点:多锻炼.
- Qt多线程编程之QThreadPool 和 QRunnable使用
说到线程通常会想到QThread,但其实Qt中创建线程的方式有多种,这里主要介绍其中一种QRunnable,QRunnable和QThread用法有些不同,并且使用场景也有区别.要介绍QRunnabl ...
- Spring Boot应用启动
1.Eclipse 中启动Spring Boot应用 右键应用程序启动类, Run As Java Application 2.maven 命令: mvn spring-boot:run 在应用程序启 ...
- Vue watch监听 date中的变量 与 数组或者对象的数据变化
直接看下面代码: 1.红色的的为一个对象,watch监听时.需要借助 computed 属性,否则watch监听打印出来的新旧值看不出.(注:方法可以随便写,但是 computed 中 与 watch ...
- win10休眠后自动开机解决方案
工作时候打开的文件挺多的,所以就懒得关机了,因为再开机还要再次打开这么多的工具文档之类 windows还有两项就是睡眠和休眠 睡眠会把所有内容保存到内存里面,但要维持这些内容不丢失就要一直给内存供电, ...
- shell—if + case条件语句
if 条件语句 1. 概述 在shell的各种条件结构和流程控制结构中都要进行各种测试,然后根据测试结果执行不同的操作,有时候也会与 if 等条件语句相结合,来完成测试判断,以减少程序运行错误. 2. ...
- Rocky linux command-1
在Linux下一切皆文件 everything is file,包括目录也是文件的一种而这些文件被分为七种类型: • -:普通文件 • d: 目录文件 • b: 块设备 • c: 字符设备 • l: ...
- Linux安装证书
Linux安装 vCenter root CA: 1.访问vCenter管理页面,下载"下载受信任的根 CA 证书" 2.压缩文件内带有数字作为扩展名(.0..1 等)的文件是根证 ...
- 3.Linux安装docker
Docker作为一个软件集装箱化平台,可以让开发者构建应用程序时,将它与其依赖环境一起打包到一个容器中,然后很容易地发布和应用到任意平台中. 进入docker官网找到安装文档 https://docs ...