智能优化算法之粒子群模型(含python案例代码)

粒子群优化模型概述

        粒子群优化(Particle Swarm Optimization,简称PSO)是一种基于群体智能的优化算法,最早由美国社会心理学家James KennedyRussell Eberhart1995年提出。PSO的灵感来自鸟群和鱼群等自然界群体行为的观察。

        PSO的基本思想是通过模拟群体中个体的协作和信息共享来寻找问题的最优解。在PSO中,个体被称为“粒子”,每个粒子代表搜索空间中的一个潜在解。这些粒子通过在搜索空间中移动来寻找最优解,其移动的方向和速度受到个体经验和群体经验的影响。

PSO的基本模型

  1. 粒子表示: 每个粒子都有一个位置向量和一个速度向量,它们分别表示在搜索空间中的当前位置和移动的速度。
  2. 适应度函数: 问题的目标函数被定义为适应度函数,粒子的目标是最小化或最大化这个适应度函数。
  3. 个体最优解: 每个粒子都会记住自己在搜索空间中找到的最好位置,称为个体最优解。
  4. 全局最优解: 在整个粒子群中,会有一个粒子记住全局最优解,即整个群体中适应度最好的位置。
  5. 更新规则: 粒子根据一定的更新规则(通常包括个体经验和群体经验)来调整自己的位置和速度。

更新规则的一般形式为:

其中:

        这个算法在不同问题上取得了很好的效果,特别是在连续优化问题中。在使用PSO时,需要根据具体问题来调整算法的参数,例如粒子数目、学习因子、惯性权重等。

什么时候用粒子群优化?

        粒子群优化(Particle Swarm Optimization,PSO)是一种用于求解优化问题的群体智能算法。PSO适用于多种优化问题,但其特定的优点和适用场景使得它在某些情况下更为合适。

        连续优化问题: PSO主要用于求解连续优化问题,其中目标函数是连续可导的。这包括了许多工程和科学应用,如机器学习模型的参数优化、神经网络权重的调整、信号处理、控制系统设计等。

        无约束问题: PSO对问题的约束较为宽松,因此适用于无约束优化问题。如果问题具有复杂的约束条件,可能需要对PSO进行改进或选择其他更适合处理约束问题的优化算法。

        高维空间: PSO在高维搜索空间中表现良好。对于具有大量变量的问题,PSO能够有效地探索搜索空间,找到全局最优解。

        全局优化: PSO的群体协作机制使其对全局优化问题具有较好的收敛性。它有助于避免陷入局部最优解,尤其在搜索空间复杂或存在多个局部最优解的情况下。

        简单实现: PSO的实现相对简单,不需要太多的参数调整。这使得它成为一种易于使用和理解的优化算法,特别适用于初学者或对算法细节不太敏感的应用场景。

        动态环境: PSO对于动态环境中的优化问题具有较好的适应性。由于其实时更新的特性,PSO能够快速适应目标函数或搜索空间的变化。

        尽管PSO在许多情况下表现良好,但在某些问题上可能不如其他优化算法,因此在选择优化算法时,应根据具体问题的特性、算法的优点和缺点做出合理的选择。

案例代码1

        以下是一个简单的粒子群优化算法的 Python 示例代码。这个例子是一个简单的单变量优化问题,目标是最小化函数f(x)=x^2+5.

import random# 粒子群优化算法
def particle_swarm_optimization(obj_func, num_particles, num_iterations):# 初始化粒子群particles = [{'position': random.uniform(-10, 10),'velocity': random.uniform(-1, 1),'pbest_position': 0,'pbest_value': float('inf')} for _ in range(num_particles)]# 寻找全局最优解的粒子gbest_particle = min(particles, key=lambda p: obj_func(p['position']))# PSO参数inertia_weight = 0.5cognitive_coefficient = 1.5social_coefficient = 1.5# 开始优化迭代for _ in range(num_iterations):for particle in particles:# 更新速度和位置r1, r2 = random.uniform(0, 1), random.uniform(0, 1)particle['velocity'] = (inertia_weight * particle['velocity'] +cognitive_coefficient * r1 * (particle['pbest_position'] - particle['position']) +social_coefficient * r2 * (gbest_particle['pbest_position'] - particle['position']))particle['position'] += particle['velocity']# 更新个体最优解current_value = obj_func(particle['position'])if current_value < particle['pbest_value']:particle['pbest_value'] = current_valueparticle['pbest_position'] = particle['position']# 更新全局最优解if current_value < gbest_particle['pbest_value']:gbest_particle = {'pbest_position': particle['pbest_position'],'pbest_value': particle['pbest_value']}return gbest_particle['pbest_position']# 示例问题:最小化函数 f(x) = x^2 + 5
def objective_function(x):return x**2 + 5# 运行粒子群优化算法
best_solution = particle_swarm_optimization(objective_function, num_particles=30, num_iterations=100)# 打印结果
print("最优解:", best_solution)
print("最优解对应的目标函数值:", objective_function(best_solution))

        这只是一个简单的示例,实际应用中可能需要根据问题的复杂性进行更多的调整和改进。在实际问题中,需要调整粒子数量、迭代次数、参数等来获得更好的性能。

案例代码2

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3Ddef fit_fun(x):  # 适应函数return sum(100.0 * (x[0][1:] - x[0][:-1] ** 2.0) ** 2.0 + (1 - x[0][:-1]) ** 2.0)class Particle:# 初始化def __init__(self, x_max, max_vel, dim):self.__pos = np.random.uniform(-x_max, x_max, (1, dim))  # 粒子的位置self.__vel = np.random.uniform(-max_vel, max_vel, (1, dim))  # 粒子的速度self.__bestPos = np.zeros((1, dim))  # 粒子最好的位置self.__fitnessValue = fit_fun(self.__pos)  # 适应度函数值def set_pos(self, value):self.__pos = valuedef get_pos(self):return self.__posdef set_best_pos(self, value):self.__bestPos = valuedef get_best_pos(self):return self.__bestPosdef set_vel(self, value):self.__vel = valuedef get_vel(self):return self.__veldef set_fitness_value(self, value):self.__fitnessValue = valuedef get_fitness_value(self):return self.__fitnessValueclass PSO:def __init__(self, dim, size, iter_num, x_max, max_vel, tol, best_fitness_value=float('Inf'), C1=2, C2=2, W=1):self.C1 = C1self.C2 = C2self.W = Wself.dim = dim  # 粒子的维度self.size = size  # 粒子个数self.iter_num = iter_num  # 迭代次数self.x_max = x_maxself.max_vel = max_vel  # 粒子最大速度self.tol = tol  # 截至条件self.best_fitness_value = best_fitness_valueself.best_position = np.zeros((1, dim))  # 种群最优位置self.fitness_val_list = []  # 每次迭代最优适应值# 对种群进行初始化self.Particle_list = [Particle(self.x_max, self.max_vel, self.dim) for i in range(self.size)]def set_bestFitnessValue(self, value):self.best_fitness_value = valuedef get_bestFitnessValue(self):return self.best_fitness_valuedef set_bestPosition(self, value):self.best_position = valuedef get_bestPosition(self):return self.best_position# 更新速度def update_vel(self, part):vel_value = self.W * part.get_vel() + self.C1 * np.random.rand() * (part.get_best_pos() - part.get_pos()) \+ self.C2 * np.random.rand() * (self.get_bestPosition() - part.get_pos())vel_value[vel_value > self.max_vel] = self.max_velvel_value[vel_value < -self.max_vel] = -self.max_velpart.set_vel(vel_value)# 更新位置def update_pos(self, part):pos_value = part.get_pos() + part.get_vel()part.set_pos(pos_value)value = fit_fun(part.get_pos())if value < part.get_fitness_value():part.set_fitness_value(value)part.set_best_pos(pos_value)if value < self.get_bestFitnessValue():self.set_bestFitnessValue(value)self.set_bestPosition(pos_value)def update_ndim(self):for i in range(self.iter_num):for part in self.Particle_list:self.update_vel(part)  # 更新速度self.update_pos(part)  # 更新位置self.fitness_val_list.append(self.get_bestFitnessValue())  # 每次迭代完把当前的最优适应度存到列表print('第{}次最佳适应值为{}'.format(i, self.get_bestFitnessValue()))if self.get_bestFitnessValue() < self.tol:breakreturn self.fitness_val_list, self.get_bestPosition()if __name__ == '__main__':# test 香蕉函数pso = PSO(4, 5, 10000, 30, 60, 1e-4, C1=2, C2=2, W=1)fit_var_list, best_pos = pso.update_ndim()print("最优位置:" + str(best_pos))print("最优解:" + str(fit_var_list[-1]))plt.plot(range(len(fit_var_list)), fit_var_list, alpha=0.5)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/214625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux驱动入门——编写第一个驱动

目录 前言 驱动入门知识 1.APP 打开的文件在内核中如何表示 2.打开字符设备节点时&#xff0c;内核中也有对应的 struct file 编写 Hello 驱动程序步骤 1.流程介绍 2.驱动代码&#xff1a; 3.应用层代码&#xff1a; 4.本驱动程序的 Makefile 内容&#xff1a; 5.上机…

4fiddler抓包工具的使用

一、定义 1.1 抓包的定义 说明&#xff1a;客户端向服务器发送请求以及服务器响应客户端的请求&#xff0c;都是以数据包来传递的。 抓包(packet capture)&#xff1a;通过工具拦截客户端与服务器交互的数据包 1.2 fiddler的介绍 Fiddler是一个http协议调试代理工具&#…

Java程序设计基础 - 课程概述

文章目录 一、程序员最具共性的心理特征二、Java开发工程师的岗位要求(一)素质和职业道德需求(二)岗位能力需求统计三、针对Java工程师岗位需求的课程目标(一)熟练掌握Java编程语言,掌握编程技能(二)精通使用集成开发工具Eclipse或IntelliJ IDEA(三)需要将“用户体验…

市场全局复盘 20231208

一、板块成交额排名&#xff1a; 资金流入前三个板块K 线&#xff1a; 行业成交额排名&#xff1a; 个股资金流入排名&#xff1a; select 成交额排名 ,近日指标提示 ,短线主题 ,涨停分析,CODE,名称,DDE大单净量,现价,量比,连板天,周涨停,月涨停,年涨停天,连涨天,…

【每日一题】—— B. StORage room(Codeforces Round 912 (Div. 2))(位操作符)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

工业传感器

工业传感器 电子元器件百科 文章目录 工业传感器前言一、工业传感器是什么二、工业传感器的类别三、工业传感器的应用实例四、工业传感器的作用原理总结前言 工业传感器的应用可以帮助提高工业过程的效率、安全性和可靠性,实现工业自动化和智能化。 一、工业传感器是什么 工…

使用阿里云国际CDN加速后网站无法访问的排查步骤

使用阿里云国际CDN加速后网站无法访问的排查步骤&#xff0c;下面是一些常见的问题&#xff0c;以&#xff1a;www.c.9he.com为例&#xff0c;如果解决不了来信服务器厂商解决。 检查CDN访问异常是CDN节点的问题还是源站问题 如果是源站访问异常&#xff0c;请直接排查源站服务…

Faster R-CNN

Faster R-CNN是作者Ross Girshick继Fast R-CNN后的又一力作。同样使用VGG16作推理速度在GPU上达到5fps(包括候选区域的生成)&#xff0c;准确率为网络的backbone&#xff0c;也有进一步的提升。在2015年的ILSVRC以及COCO竞赛中获得多个项目的第一名。 算法流程 右边这部分和Fa…

算法Day27 身材管理(三维背包)

身材管理&#xff08;三维背包&#xff09; Description Input Output Sample 代码 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt(); // 输入n的值int money sca…

KaiOS 运营商相关文件operator_variant_manager.js代码功能和调试

gaia/apps/system/js/operator_variant_manager.js at master mozilla-b2g/gaia GitHub js文件接口功能 No 接口/常量 功能 1 OperatorVariantManager var OperatorVariantManager function(core) 2 OperatorVariantManager.IMPORTS OperatorVariantManager.I…

搜集怎么绘制三维曲线和曲面?

1、针对函数对象是单一变量、两个函数的情况。用plot3函数&#xff1b;&#xff08;三维曲线&#xff09; 看一下matlab官方的例子&#xff1a; t 0:pi/50:10*pi; st sin(t); ct cos(t); plot3(st,ct,t) 绘制出来的曲线&#xff1a; 几个比较关键的点&#xff1a; &…

【Marp】基于Markdown-Marp快速制作PPT

【Marp】基于Markdown-Marp快速制作PPT 文章目录 【Marp】基于Markdown-Marp快速制作PPT零、参考资料一、Marp基本语法&#xff08;创建分页&#xff0c;排版图片&#xff0c;更换主题&#xff0c;Marp扩展指令修改样式&#xff09;1、创建新的PPT页面2、插入图片 & 排版图…

小功能实现(二十)分类统计,Map取值自增

前言 从Map取值&#xff0c;根据获取的类型进行统计&#xff0c;若有则1&#xff0c;若无则新增新的分类纯属灵机一动 步骤 for (String str : stringList) {int counttypeMap.getOrDefault(str,0);typeMap.put(resultList[2],count); }

解决删除文件后 WSL2 磁盘空间不释放的问题

查看 Linux distributions 打开 PowerShell 并执行如下命令&#xff1a; wsl -l -v 搜索并找到 ext4.vhdx 文件 我的 ext4.vhdx 文件如下&#xff1a; C:\Users\xxx\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu22.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdx 由于…

vue中yarn install超时问题

囚笼中的网络固然可以稳定局势&#xff0c;不让猴子们得以随时醒悟&#xff01;给你吃的你就好好吃&#xff0c;不要有其他的翻然醒悟的时刻。无论如何&#xff0c;愚蠢的活着也是一种幸福&#xff0c;听着那些耐心寻味的统计幸福指数&#xff0c;我们不由的幸福的一批。。 最…

软件开发流程分析

软件开发流程分析 相关概念1 原型设计2 产品设计3 交互设计4 代码实现详细步骤 相关概念 前端&#xff1a;自研API&#xff0c;调用第三放API 后端&#xff1a;自研API&#xff0c;第三方API 数据库&#xff1a;Mysql&#xff0c;数据采集&#xff0c;数据迁移 服务器&#xf…

算法与数据结构--最短路径Dijkstra算法

题目&#xff1a; 算法与数据结构实验题 10.20 迷路 ★实验任务 学长经常迷路&#xff0c;现在他又遇到问题了&#xff0c;需要求救。 假设他有一张地图&#xff0c;上面有N个点&#xff0c;M条路&#xff0c;他现在在编号为S的地方&#xff0c;想要去编号为E的地方&#x…

Linux中的几个重要指令

关於 Process 处理的指令 1. ps ps 是用来显示目前你的 process 或系统 processes 的状况。 以下列出比较常用的参数: 其选项说明如下: -a 列出包括其他 users 的 process 状况。 -u 显示 user - oriented 的 process 状况 。 -x 显示包括没有 terminal 控制的 process 状…

程序员养生指南。。。

【关注微信公众号&#xff1a;跟强哥学SQL&#xff0c;回复“笔试”免费领取大厂SQL笔试题。】 作为一个程序员&#xff0c;确实需要特别关注健康问题。长时间的熬夜加班、久坐不动等工作习惯可能会导致身体亚健康状态。以下是一些养生延寿的建议&#xff1a; 1. 定期运动&…

数据结构:第13关:查找两个单词链表共同后缀的起始结点

任务描述编程要求 输入输出测试说明来源 任务描述 本关任务&#xff1a;假定采用带头结点的单链表保存单词&#xff0c;当两个单词有相同的后缀时&#xff0c;则可共享相同的后缀空间。 例如&#xff0c;“loading”和“being”的存储映像如下图所示&#xff1a; 设str1和str2…