前面介绍了《粒子群算法》的基本原理,这里结合实例,看看粒子群算法是怎样解决实际问题的。采用过的函数和《遗传算法实例》中的一样:

f(x)=x+10sin5x+7cos4x

f(x) = x + 10\sin 5x + 7\cos 4x

求其在区间[-10,10]之间的最大值。下面是该函数的图像:

在本例中,我们可以把x作为个体的染色体,函数值f(x)作为其适应度值,适应度越大,个体越优秀,最大的适应度就是我们要求的最大值。
直接看代码吧(直接看注释就能看懂)。

# -*- coding: utf-8 -*-import numpy as np# 粒子(鸟)
class particle:def __init__(self):self.pos = 0  # 粒子当前位置self.speed = 0self.pbest = 0  # 粒子历史最好位置class PSO:def __init__(self):self.w = 0.5  # 惯性因子self.c1 = 1  # 自我认知学习因子self.c2 = 1  # 社会认知学习因子self.gbest = 0  # 种群当前最好位置self.N = 20  # 种群中粒子数量self.POP = []  # 种群self.iter_N = 100  # 迭代次数# 适应度值计算函数def fitness(self, x):return x + 10 * np.sin(5 * x) + 7 * np.cos(4 * x)# 找到全局最优解def g_best(self, pop):for bird in pop:if bird.fitness > self.fitness(self.gbest):self.gbest = bird.pos# 初始化种群def initPopulation(self, pop, N):for i in range(N):bird = particle()bird.pos = np.random.uniform(-10, 10)bird.fitness = self.fitness(bird.pos)bird.pbest = bird.fitnesspop.append(bird)# 找到种群中的最优位置self.g_best(pop)# 更新速度和位置def update(self, pop):for bird in pop:# 速度更新speed = self.w * bird.speed + self.c1 * np.random.random() * (bird.pbest - bird.pos) + self.c2 * np.random.random() * (self.gbest - bird.pos)# 位置更新pos = bird.pos + speedif -10 < pos < 10: # 必须在搜索空间内bird.pos = posbird.speed = speed# 更新适应度bird.fitness = self.fitness(bird.pos)# 是否需要更新本粒子历史最好位置if bird.fitness > self.fitness(bird.pbest):bird.pbest = bird.pos# 最终执行def implement(self):# 初始化种群self.initPopulation(self.POP, self.N)# 迭代for i in range(self.iter_N):# 更新速度和位置self.update(self.POP)# 更新种群中最好位置self.g_best(self.POP)pso = PSO()
pso.implement()for ind in pso.POP:print("x=", ind.pos, "f(x)=", ind.fitness)

某一次执行中生成的种群结果:
x= 7.44390041845 f(x)= 2.34326279816
x= 9.48378207609 f(x)= 13.3821268397
x= 6.3672261374 f(x)= 17.0548851104
x= 7.85674414126 f(x)= 24.855362869
x= 7.85674414216 f(x)= 24.855362869
x= 7.85674414201 f(x)= 24.855362869
x= 7.85674414185 f(x)= 24.855362869
x= 8.02319542929 f(x)= 20.1093330013
x= 7.85674414327 f(x)= 24.855362869
x= 7.85674414414 f(x)= 24.855362869
x= 7.85674414288 f(x)= 24.855362869
x= 7.85674414296 f(x)= 24.855362869
x= 7.85674414178 f(x)= 24.855362869
x= 7.85674414174 f(x)= 24.855362869
x= 7.8567441494 f(x)= 24.855362869
x= 6.44588532539 f(x)= 19.2820411821
x= 7.85674414041 f(x)= 24.855362869
x= 9.93067628809 f(x)= 1.12241685006
x= 7.8567441425 f(x)= 24.855362869
x= 8.81867117742 f(x)= 4.6512749143
得到的最优解结果为:
X=7.85674414174 f(x)=24.855362869
从图像上看符合要求。其结果图像如下,红色点表示种群中个体的位置。

# 绘图代码
import matplotlib.pyplot as plt
def func(x):return x + 10 * np.sin(5 * x) + 7 * np.cos(4 * x)x = np.linspace(-10, 10, 10000)
y = func(x)scatter_x = np.array([ind.pos for ind in pso.POP])
scatter_y = np.array([ind.fitness for ind in pso.POP])
plt.plot(x, y)
plt.scatter(scatter_x, scatter_y, c='r')
plt.show()

粒子群算法实例-求解函数极值相关推荐

  1. 粒子群算法理解+求解01背包问题

    最近在学群体优化算法,做个学习笔记吧,本人蒟蒻,有不对的地方还情多多包涵. 1.粒子群算法的理解. 粒子群算法是一种智能优化算法,模拟的是鸟内捕食行为.假设有一群鸟,在一个区域内觅食,这个区域内只有一 ...

  2. 【机器学习】基于粒子群算法的非线性函数寻优

    本微信图文介绍了基于粒子群算法的非线性函数寻优过程,并利用Matlab实现.

  3. 粒子群算法PSO求解最大值和最小值案例(超详细注释)

    目录 前言 1.粒子群算法简介和难点理解 1.1概念理解 ①非劣解集和支配 ②个体极值和群体极值 ③个体适应度值和群体适应度值 1.2 算法流程和理解 1.3 速度和位置更新公式 1.4 rand.r ...

  4. 配电网粒子群算法实例

    算例: 一.故障信息的数学表示 在上图中K表示断路器,每一个断路器上均有一个FTU装置,可以反馈断路器开关是否过流,用表示上传的故障信息,反映的是各分段开关处是否流过故障电流有故障电流为1,否则为0) ...

  5. 【机器学习】基于自适应变异粒子群算法的非线性函数寻优

    本微信图文详细介绍了自适应变异粒子群算法的基本原理以及在非线性函数寻优中的应用. ---------–华丽分割线---------- 我们免费提供本文介绍方法的源码,你可以私信我们领取,如果你在领取源 ...

  6. 数学建模常用算法:粒子群算法(PSO)求解二元函数最小值+限定x,y范围测试【java实现--详细注释+Matlab绘制粒子群飞行过程】

    代码 package com.dam.heuristic.pso.test;import java.util.List; import java.util.Random;public class Ps ...

  7. 遗传算法实例-求解函数极值

    前面在<遗传算法通识>中介绍了基本原理,这里结合实例,看看遗传算法是怎样解决实际问题的. 有一个函数: f(x)=x+10sin5x+7cos4x f(x) = x + 10\sin 5x ...

  8. 基于莱维飞行改进的粒子群算法输电线桩路径优化,粒子群算法通过shubert函数测试效果,混沌粒子群

    摘要 环境保护,节能减排,减少碳排放越来越受到现代社会的重视,本文利用莱维飞行改进的粒子群算法优化输电线桩路径,对输电线路路径进行优化设计并加以合理选择,有助于构建稳定.高效的输电网络,保证电能供给质 ...

  9. 粒子群算法求解多元函数最值问题

    粒子群算法求解多元函数最值问题 一.简介 多元函数极值&最值问题通常使用导数/偏导数进行推导,这里尝试使用启发式算法进行求解近似最优解.选用粒子群算法进行求解,粒子群算法模仿鸟群觅食行为,核心 ...

最新文章

  1. shell磁盘监控自动化处理
  2. Linux系统安装Apache 2.4.6
  3. 数据库事务的概念及其实现原理
  4. HDFS DataNode 设计实现解析
  5. xcode12.3 swift 桥接文件_OC与Swift混编项目迁移到Swift4.2小记
  6. 程序员的代码行数越少越好?
  7. Codeforces Round #565 (Div. 3) B. Merge it!
  8. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_5.RabbitMQ研究-入门程序-生产者...
  9. SpringMVC注解@RequestParam(转)
  10. python 电力系统时域仿真_电力系统暂态计算_时域仿真方法
  11. p5.js 入门教程
  12. Nmap 扫描主机端口
  13. html5图片在线剪辑,Web端裁剪图片方法
  14. Makefile 自动化变量及其说明
  15. linux删除卸载npm,卸载安装node npm (Mac linux )
  16. [数学]二维对数正态分布的概率分布,期望,方差和相关系数
  17. 我眼中的CTO:提升IT管理的价值
  18. 别只会搜日志了,求你懂点原理吧(超详细)
  19. VLAN的划分方法有哪些?
  20. java说课_Java说课演示稿.ppt

热门文章

  1. 【PAT】B1048 数字加密
  2. Activiti工作流从入门到入土:完整Hello World大比拼(Activiti工作流 API结合实例讲解)
  3. 他,跳槽季用这样的方法复习进了阿里
  4. SpringMVC中跳转路径的问题
  5. MongoDB从立地到成佛(介绍、安装、增删改查)
  6. 欧拉函数/欧拉函数打表 lightoj1370(java/c++ )
  7. 深究AngularJS——AngularJS中的Controller(控制器)
  8. redis集群扩容和缩容_Full-Stack-Notes
  9. 电脑如何进入bios模式_电脑如何进入bios关闭软驱
  10. ksql 数量大于2_别人1加1大于2大于3,雍禾植发1加1小于2……