智能优化算法之粒子群模型(含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协议调试代理工具&#…

市场全局复盘 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、插入图片 & 排版图…

解决删除文件后 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 由于…

软件开发流程分析

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

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

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

【LLM】大模型之RLHF和替代方法(DPO、RAILF、ReST等)

note SFT使用交叉熵损失函数&#xff0c;目标是调整参数使模型输出与标准答案一致&#xff0c;不能从整体把控output质量&#xff0c;RLHF&#xff08;分为奖励模型训练、近端策略优化两个步骤&#xff09;则是将output作为一个整体考虑&#xff0c;优化目标是使模型生成高质量…

火山引擎边缘计算用硬核助力赛事直播

经过一个多月激烈争夺&#xff0c;2023英雄联盟全球总决赛终于在11月19日落下帷幕。精彩的对决和高热话题使得直播平台观赛人数暴增&#xff0c;给直播平台稳定性和资源储备提出了巨大的考验。

推荐3dmax常用15款插件,快来了解一下吧!

推荐3dmax常用15款插件&#xff0c;快来了解一下吧&#xff01; 插件是3ds MAX软件的重要组成部分&#xff0c;提供了太多便利&#xff0c;也提升了建模、渲染和动画的效率&#xff0c;下面就给大家推荐25款常用的3dMax插件。 1&#xff09;DashedShape DashedShape实线转虚线…

3c分支语句和循环语句(非重点)

文章目录 1. 什么是语句&#xff1f;2. 分支语句&#xff08;选择结构&#xff09;2.1 if语句2.1.1 悬空else2.1.2 if书写形式的对比 2.2 switch语句2.2.1 在switch语句中的 break2.2.2 default子句 3. 循环语句3.1 while循环3.1.1 while语句中的break和continue3.2 for循环3.2…

研表究明,文字的序顺并不定一能响影GPT-4读阅

深度学习自然语言处理 原创作者&#xff1a;yy 很多年前&#xff0c;你一定在互联网上看过这张图&#xff0c;展示了人脑能够阅读和理解打乱顺序的单词和句子&#xff01;而最近东京大学的研究发现&#xff0c;大语言模型&#xff08;LLMs&#xff09; 尤其是 GPT-4&#xff0c…

对象与对象数组

对象与对象数组 实验介绍 本章节主要介绍对象数组和对象成员。在实际的开发中&#xff0c;对象数组和对象成员是经常使用的&#xff0c;所以首先需要学习对象数组与对象成员的各种使用方法。 提示&#xff1a;为了方便课程讲解&#xff0c;示例代码使用类内定义的方式实现&a…

19 redis缓存数据同步问题

1、缓存穿透 指缓存和数据库中都没有的数据&#xff0c;而用户不断发起请求。由于缓存不命中&#xff0c;并且出于容错考虑&#xff0c;如果从存储层查不到数据则不写入缓存&#xff0c;这将导致这个不存在的数据每次请求都要到存储层去查询&#xff0c;缓存就没有意义了。 在…