实验课一 -- 粒子群算法PSO

文章目录

  • 算法说明:
  • 算法流程:
  • 代码实现:
  • 结果展示:
  • 结束

算法说明:

我看了下别人写的,这个粒子群算法的思想来源与鸟类捕食
我按我的理解解释一下:
很多只鸟在草原找食物,所有鸟刚开始都不知道食物在哪里,但是鸟儿们很聪明,会互相交流,同时食物有气味,鸟儿们可以通过气味判断自己离食物的远近,闻到气味最大的鸟儿会大叫告诉其他鸟儿,其他鸟儿也往气味最大的鸟身边飞,在它周围区域寻找。
因此,人们就使用这个模型来解决某些问题。也即是让鸟儿帮我们解决问题了

算法流程:

首先,我们要明白算法里面有什么元素:

1,群体规模N,鸟儿的数量
2,维度n,鸟儿所处世界维度,鸟儿是二次元鸟儿的话,那维度就是2
3,惯性权重w,鸟儿是有惯性的,这里表示鸟儿保持速度的能力吧
4,个体学习因子c1,鸟儿的学习能力
5,群体学习因子c2,鸟儿们的学习能力
6,随机数r1,r2,用这两个数保证随机性
7,鸟儿位置X,这个X可以用一个二维数组表示,记录每只鸟儿的位置
8,鸟儿速度V,这个V可以用一个二维数组表示,记录每只鸟儿的速度
9,个体适应度P,这个P可以用一个一维数组表示,记录每只鸟儿的适应度
10,最佳适应度PD,P中最小的值就是当前最佳适应度,当前最佳和历史最佳对比,谁小谁最佳
11,最佳位置pos_best,最佳适应度所在的位置
12,迭代次数k,我们迭代运算的次数
13,满意值t,这个值表示我们能够接受的最小界限,即当最佳适应度PD低于这个值时,我们也大差不差得到了我们满意的结果

接下来开始:

第一步,初始化
鸟儿们的位置和速度都是随机的,但是位置和速度都是有限制的
我们要随机给每只鸟儿安排位置和速度

第二步,算适应度
算适应度需要相应的公式来算,一般情况下,我们要通过我们要解决的问题来算这个适应度
选择当前最佳适应度,选最小的,并保留这个值相对应的位置,同时比对当前最佳适应度和历史最佳适应度,选最小的最佳

第三步,更新速度与位置
我们要根据公式来更新速度与位置
速度公式:
在这里插入图片描述
位置更新公式:
在这里插入图片描述
要注意的是,当我们更新速度和位置的时候要注意范围,即不要让它们超出范围,它们超出范围的话,就按边界值算

第四步 判断是否结束
当次数达到了规定迭代次数时可以结束
当最佳适应度值小于最小界限的时候可以结束
如果没有满足以上条件,那就返回第二步重新执行

代码实现:

目前只写了python的,能够展示粒子群的移动:
PSO.py

import math
import sys
from math import cos, sqrt
import numpy as np
from PyQt5 import QtCore
from PyQt5.QtWidgets import *
import random
# 1 初始化粒子群参数
import time
class PSO(QWidget):up = QtCore.pyqtSignal(int, int, np.ndarray)def __init__(self):"""列表:X: 记录粒子位置(-400,400)V: 记录粒子速度(-20,20)P: 记录响应粒子搜索到的最佳位置PD: 群体最优位置单值:Fp: 个体历史最优位置Fg: 群体历史最优位置:return:"""super().__init__()# 初始化位置与速度def ini(self):self.N = 1000  # 群规模self.D = 2  # 群维度self.K = 1000  # 迭代次数self.w = 1  # 惯性权重self.c1 = 2  # 个体学习因子self.c2 = 2  # 群体学习因子self.r1 = random.uniform(0, 1)  # 随机数1self.r2 = random.uniform(0, 1)  # 随机数2self.MAX_X = 400  # 位置最大self.MIN_X = -400  # 位置最小self.MAX_V = 5  # 速度最大self.MIN_V = -5  # 速度最小self.X = np.zeros((self.N, self.D))self.V = np.zeros((self.N, self.D))self.XN = np.zeros((self.N, self.D))self.VN = np.zeros((self.N, self.D))self.P = []self.PD = 10086self.ans = []# self.choose = 1     # 公式选择for i in range(self.N):for j in range(self.D):a = random.uniform(self.MIN_X, self.MAX_X)self.X[i][j] = ab = random.uniform(self.MIN_V, self.MAX_V)self.V[i][j] = bdef check_x(self, x):if self.MAX_X <= x:return self.MAX_Xelif self.MIN_X >= x:return self.MIN_Xreturn xdef check_v(self, v):if self.MAX_V <= v:return self.MAX_Velif self.MIN_V >= v:return self.MIN_Vreturn v# 公式计算:def Cal1(self):for i in range(self.N):res1 = 0  # X平方res2 = 1for j in range(self.D):res1 = res1 + self.X[i][j]*self.X[i][j]res2 = res2 * cos(self.X[i][j] / sqrt(j + 1))ans = 1+1/4000 * res1 - res2self.P.append(ans)# 更新速度与位置def Cal2(self):for i in range(self.N):ans = 20 + self.X[i][0]*self.X[i][0] + \self.X[i][1]*self.X[i][1] -   \10*(cos(2*math.pi*self.X[i][0])+cos(2*math.pi*self.X[i][1]))self.P.append(ans)def Update_X_Y(self):# print("更新")# 获取下一步速度for i in range(self.N):for j in range(self.D):self.VN[i][j] = self.w * self.V[i][j] + \self.c1*self.r1*(self.P[i]-self.X[i][j])+\self.c2*self.r2*(self.P[i]-self.X[i][j])self.VN[i][j] = self.check_v(self.VN[i][j])# 更新位置self.XN[i][j] = self.X[i][j] + self.VN[i][j]self.XN[i][j] = self.check_x(self.XN[i][j])# 下一次迭代了,该换换了for i in range(self.N):for j in range(self.D):self.V[i][j] = self.VN[i][j]self.X[i][j] = self.XN[i][j]self.P = []self.r1 = random.uniform(0, 1)  # 随机数1self.r2 = random.uniform(0, 1)  # 随机数2def go1(self):self.ini()print("开始,初始化")print("群初始位置:")for i in range(self.N):print(f'X{i+1}: ', end=' ')print(self.X[i])print("群初始速度:")for i in range(self.N):print(f'V{i + 1}: ', end=' ')print(self.V[i])# 最佳适应度公式选择def go2(self):if self.choose == 1:self.Cal1()elif self.choose == 2:self.Cal2()def start(self):self.go1()self.tol = 1e-6for i in range(self.K):QApplication.processEvents()# time.sleep(0.1)print(f"第{i+1}次迭代", end=" ")self.up.emit(self.N, self.D, self.X)QApplication.processEvents()self.go2()a = min(self.P)pos = self.X[self.P.index(a)]if self.PD > a:self.PD = aself.ans = posif self.PD < self.tol:break# print("取群体历史最优解并更新个体位置")print(f"目前最佳值:  {self.PD}")self.Update_X_Y()if self.choose == 1:print("选择公式1")elif self.choose == 2:print("选择公式2")print(f"最终结果: {self.PD}")print(f'最佳位置: {self.ans}')# 只显示结果可运行这个if __name__ == "__main__":app = QApplication(sys.argv)PSO = PSO()PSO.show()PSO.hide()PSO.start()sys.exit(app.exec_())

窗口展示Window.py

import sysfrom PyQt5 import QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPainter,  QColor
from PyQt5.QtCore import Qt, QPointfrom PSO import PSO_translate = QtCore.QCoreApplication.translate  # 翻译函数class Window(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("人工智能")menubar = self.menuBar()self.menu = menubar.addMenu('粒子群算法')self.setGeometry(100, 100, 1000, 1000)self.points = []  # 存储点的列表self.central_widget = DrawingWidget()self.setCentralWidget(self.central_widget)QApplication.processEvents()self.actionPSO1 = QAction("公式1", self)self.actionPSO1.triggered.connect(self.PSO1)self.actionPSO2 = QAction("公式2", self)self.actionPSO2.triggered.connect(self.PSO2)self.menu.addAction(self.actionPSO1)self.menu.addAction(self.actionPSO2)QApplication.processEvents()def PSO1(self):self.central_widget.PSO.choose = 1self.central_widget.PSO.start()def PSO2(self):self.central_widget.PSO.choose = 2self.central_widget.PSO.start()class DrawingWidget(QWidget):def __init__(self):super().__init__()self.setGeometry(0, 0, 1000, 1000)self.points = []  # 存储点的列表self.PSO = PSO()self.PSO.up.connect(self.op)QApplication.processEvents()def paintEvent(self, event):painter = QPainter(self)painter.setRenderHint(QPainter.Antialiasing)painter.setPen(QColor(0, 0, 255))  # 设置画笔颜色为蓝色painter.setBrush(Qt.SolidPattern)for point in self.points:painter.drawEllipse(point, 2, 2)  # 绘制小圆点def op(self, n, d, lis):q = []for i in range(n):p = QPoint(int(lis[i, 0]+400), int(lis[i, 1]+400))q.append(p)self.points = qself.update()if __name__ == '__main__':app = QApplication(sys.argv)window = Window()window.show()sys.exit(app.exec_())

结果展示:

公式1:
在这里插入图片描述
在这里插入图片描述

公式2:
在这里插入图片描述
在这里插入图片描述

结束

以上仅代表我个人的见解,或许会出错,请见谅并麻烦指出,谢谢

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

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

相关文章

如何使用bat脚本启动指定目录下的jar包

士别三日&#xff0c;当刮目相待。——《三国志》 为了将一个java程序封装成一个简单易用的小工具&#xff0c;使用bat脚本启动jar包。 在txt文档中&#xff0c;键入&#xff1a; echo off java -jar %~dp0core\demo.jar 注意&#xff1a; 1、其中“core”是文件夹的名称&am…

[学习笔记]DeepWalk图神经网络论文精读

参考资料&#xff1a;DeepWalk【图神经网络论文精读】 word2vec 相关论文&#xff1a; Efficient Estimation of Word Representations in Vector Space Distributed Representations of Words and Phrases and their Compositionality 随机游走Ramdom Walk简述 通过随机游…

软件设计模式(二):工厂、门面、调停者和装饰器模式

前言 在这篇文章中&#xff0c;荔枝将会梳理软件设计模式中的四种&#xff1a;工厂模式、Facade模式、Mediator模式和装饰器Decorator模式。其中比较重要的就是工厂模式和装饰器模式&#xff0c;工厂模式在开发中使用的频数比较高。希望荔枝的这篇文章能讲清楚哈哈哈哈&#xf…

【网络通信 -- WebRTC】FlexFec 基本知识点总结概述

【网络通信 -- WebRTC】FlexFec 基本知识点总结概述 【1】FlexFec 的保护方案 假设存在一组源数据包(D L)&#xff0c;其序列号从 1 开始运行到 D L 一维非交错行 FEC(1-D Non-interleaved Row FEC) : 一种连续的源数据包进行保护的方案&#xff0c;可用于恢复按行分组的源…

配置远程访问:让外部网络用户能够使用公司内部的OA办公系统

文章目录 前言1. 确认在内网下能够使用IP端口号登录OA办公系统2. 安装cpolar内网穿透3. 创建隧道映射内网OA系统服务端口4. 实现外网访问公司内网OA系统总结 前言 现在大部分公司都会在公司内网搭建使用自己的办公管理系统&#xff0c;如OA、ERP、金蝶等&#xff0c;员工只需要…

SpringBoot 基于 MongoTemplate 的工具类

一、 什么是MongoDB MongoDB基于分布式文件存储的数据库。由C语言编写。MongoDB是一个高性能&#xff0c;开源&#xff0c;无模式的文档型数据库&#xff0c;是当前NoSql数据库中比较热门的一种。 他支持的数据结构非常松散&#xff0c;是类似json的bjson格式&#xff0c;因此…

S/4 FI之FBL3N/FBL3H/FAGLL03/FAGLL03H的区别

SAP 系统中&#xff0c;为了显示财务凭证行项目&#xff0c;由于不同的时间开发的功能&#xff0c;但实际在使用的过程&#xff0c;到底有些什么样区别&#xff1f; 本文档就是想对这一个问题做一个整体上的说明。 FBL3N&#xff0c;就是传统的行项目报表&#xff0c;在最早的…

vue3之pinia简单使用

一、 Pinia介绍 pinia 是 Vue 的存储库&#xff0c;它允许您跨组件/页面共享状态。就是和vuex一样的实现数据共享。 依据Pinia官方文档&#xff0c;Pinia是2019年由vue.js官方成员重新设计的新一代状态管理器&#xff0c;更替Vuex4成为Vuex5。 Pinia 目前也已经是 vue 官方正式…

9.4 数据库 TCP

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//判断数据库对象是否包含了自己使用的数据库if(!db.contains("Stu.db")){//不存在数据库&#xff0…

IOMesh 为 KubeVirt 提供高效稳定的持久化存储支持(附用户实践)

7 月 11 日&#xff0c;KubeVirt 社区正式宣布发布 Kubernetes 原生虚拟机管理插件 KubeVirt v1.0。这一版本发布不仅标志着 KubeVirt 已进化为生产就绪的虚拟机管理解决方案&#xff0c;也为正在使用虚拟化环境的用户提供了更多元的云化转型路线&#xff1a;搭配 Kubernetes 持…

UMA 2 - Unity Multipurpose Avatar☀️三.给UMA设置默认服饰Recipes

文章目录 🟥 项目基础配置🟧 给UMA配置默认服饰Recipes🟨 设置服饰Recipes属性🟥 项目基础配置 将 UMA_DCS 预制体放到场景中创建空物体,添加DynamicCharacterAvatar 脚本,选择 HumanMaleDCS作为我们的基本模型配置默认Animator 🟧 给UMA配置默认服饰Recipes 服饰Re…

JavaWeb开发中的问题

一&#xff0c;页面没有显示css样式效果 在修改jsp文件时&#xff0c;浏览器呈现效果能发生改变&#xff0c;但修改css样式文件却没有效果&#xff0c;得清除浏览数据&#xff0c;重新运行&#xff0c;css样式才能有效果。以上所得&#xff1a;css文件应该会保存在浏览记录中。…