关于粒子群算法的一些简单尝试

粒子群算法核心思想:(鸟 = 粒子)

(1)许多的鸟站在不同的地方;

(2)每一只鸟都有自己寻找食物的初始飞行方向、飞行速度;

(3)这些鸟儿每隔一段时间寻找一次食物,通过搜集所有鸟的信息,来寻找食物最充足的地方;

一、以公式原理的实现过程逐步讲解;

1、初始化N个粒子,这些粒子有着随机的初始位置和随机的初始速度;

2、计算这些粒子下一步位置,所有的粒子均朝着随机方向以随机的速度移动;

3、寻找所有粒子中的最小值,以及寻找每个粒子在不同时刻的最小值;

先寻找所有粒子中的最小值,对所有的粒子求最小值;

然后选在每个粒子在不同时刻的最小值;每个粒子自身的最小值是能够决定下一步该粒子移动方向和速度的量;

4、更新粒子搜寻的速度,并且更新粒子搜寻的方向,这里不仅有速度的大小,还有方向的角度,因此是一个矢量;

这个里面,随机优化的核心是其初始位置和速度的随机性。因此,更新后的速度应一定程度尽可能保持其先前的速度,以保持其随机性;这个α是惯性权重系数,建议为[0.5,0.8]。

我们还应该在这次迭代中调整速度以接近组最小值,因为它至少是这一步中最好的一个;这个里面c1是权重系数,r1是随机权重系数,第一个c1代表全局最小的权重,推荐范围 0.1-2 ,r1是为了提高随机性,推荐范围 0-1;

另一个同理,c2是代表局部最优的权重,推荐范围 [0.1~2],r2是随机权重系数,推荐范围 0-1;

5、设计停止条件

重复迭代并在特定位置停止:

(1)达到最大迭代次数k;

(2)变化的目标函数小于预设阈值ε;

   (3)我们经常设置速度和位置的限制,以避免不稳定和大的振荡

二、以代码进行逐步讲解

最后通过代码进行实现:求取函数最小值

第一步:首先初始化;

1、定义粒子群个数;N = 100; %群体粒子个数

2、定义粒子维数;几个变量几维度;D = 2; 

3、定义权重因子大小;c1 =2;c2 =2;

4、定义速度范围;这个Vmax = 1; Vmin = -1;

5、定义位置范围;(变量的范围)(这里这么写是因为xy的范围不一致,就分开给出范围)

X1max =1; 

X1min =-1;

X2max =3;

X2min =-2;

Xmax = [X1max X2max];

Xmin = [X1min X2min];

第二步:然后定义初始随机量:

1、定义初始随机位置;

x1 =  rand(N,1) * (X1max-X1min)+X1min; 

x2 =  rand(N,1) * (X2max-X2min)+X2min;

2、定义初始随机速度;

v = rand(N,D) * (Vmax-Vmin)+Vmin;

第三步:初始化个体最优位置和最优值

p=x;  
pbest = ones(N,1); %% 创建一个数组,用于存储每个粒子对应的适应度函数值
for i = 1:N
    pbest(i) = func2(x(i,:)); % 求出初始化种群对应的目标函数值
end

第四步:初始化全局最优位置和最优值;

g = ones(1,D); 
gbest = inf;   
for i = 1:N   
    if(pbest(i) < gbest)
        g = p(i,:);
        gbest = pbest(i);
    end
end

第五步:粒子群群体寻优;这里就不列了,直接把所有代码给出来;这里是大头;

%%%%%%%%%%%%%%粒子群算法求函数极值%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%
function counti()
clear all; %清除所有变量
% close all; %清图
clc; %清屏
N = 100; %群体粒子个数
D = 2; %粒子维数   变量的个数
T = 1000; %最大迭代次数
c1 =2; %权重因子 c1 [0.1 - 2] 越大,保持原来速度的能力越强
c2 =2; %权重因子 c2 [0.1 - 2]
Wmax = 0.8; %惯性权重最大值   
Wmin = 0.4; %惯性权重最小值

X1max =1; %位置最大值
X1min =-1; %位置最小值

X2max =3; %位置最大值
X2min =-2; %位置最小值

Xmax = [X1max X2max];
Xmin = [X1min X2min];

Vmax = 1; %速度最大值
Vmin = -1; %速度最小值
%%%%%%%%%%%%初始化种群个体(限定位置和速度)%%%%%%%%%%%%
x1 =  rand(N,1) * (X1max-X1min)+X1min;
x2 =  rand(N,1) * (X2max-X2min)+X2min;
x = [x1 x2];

v = rand(N,D) * (Vmax-Vmin)+Vmin;
%%%%%%%%%%%%%初始化个体最优位置和最优值%%%%%%%%%%%%%
p = x;  
pbest = ones(N,1); %% 创建一个数组,用于存储每个粒子对应的适应度函数值
for i = 1:N
    pbest(i) = func2(x(i,:)); % 求出初始化种群对应的目标函数值
end
%%%%%%%%%%%%%初始化全局最优位置和最优值%%%%%%%%%%%%
g = ones(1,D); % 创建一个数组和变量用于保存最优变量和目标函数 
gbest = inf;   %inf 无穷大
for i = 1:N   % 这一步当中找到种群最优目标函数值
    if(pbest(i) < gbest)
        g = p(i,:);
        gbest = pbest(i);
    end
end
gb = ones(1,T); % 建立此项用于保存种群中每一代中的的最优值
%%%%%%%%%按照公式依次迭代直到满足精度或者迭代次数%%%%%%%%
for i = 1:T
    for j = 1:N
        %%%%%%%%%更新个体最优位置和最优值%%%%%%%%%%%%%
        if (func2(x(j,:)) < pbest(j))  % 新的个体是否小于原来的个体,如果小于则保存新的个体
            p(j,:) = x(j,:);
            pbest(j) = func2(x(j,:));
        end
        %%%%%%%%%%更新全局最优位置和最优值%%%%%%%%%%%%
        if(pbest(j) < gbest)
            g = p(j,:);
            gbest = pbest(j);
        end
        %%%%%%%%%%%计算动态惯性权重值%%%%%%%%%%%%%%%
        w = Wmax-(Wmax-Wmin)*i/T;
        %%%%%%%%%%%%更新位置和速度值%%%%%%%%%%%%%%%
        v(j,:) = w*v(j,:)+c1*rand*(p(j,:)-x(j,:))...
            +c2*rand*(g-x(j,:)); %计算对应的速度公式
        x(j,:) = x(j,:)+v(j,:);  %更新粒子群当中对应的基因
        %%%%%%%%%%%%%%边界条件处理%%%%%%%%%%%%%%%
        % 检查单个粒子的速度和位置信息是否超过当前最大限制
        for ii = 1:D  % 如果超过的话就在原来的范围内重新生成个体
            if (v(j,ii) > Vmax) || (v(j,ii) < Vmin)
                v(j,ii) = rand * (Vmax-Vmin)+Vmin;
            end  
            if (x(j,ii) > Xmax(ii)) || (x(j,ii) < Xmin(ii))
                x(j,ii) = rand * (Xmax(ii)-Xmin(ii))+Xmin(ii);
            end
        end
    end
    %%%%%%%%%%%%%%记录历代全局最优值%%%%%%%%%%%%%%
    gb(i) = gbest;
end
g;       %最优个体
gb(end); %最优值
figure(1)
plot(gb)
hold on 
grid on
xlabel('迭代次数');
ylabel('适应度值');
title('适应度进化曲线')
hold on 
end
%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%

function value = func2(x)
value = (3*cos(x(1)*x(2))+x(1)+x(2)^2);

end      %这里是适应度函数,也可以在同一文件夹下独立建立函数,也可以直接写在后面。




最终仿真结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

0013Java安卓程序设计-ssm酒品移动电商平台app

文章目录 **摘要**目录系统实现5.1 APP端5.2管理员功能模块开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析…

PHP基础 - 循环与条件语句

循环语句 1)for循环: 重复执行一个代码块指定的次数。 for ($i = 0; $i < 5; $i++) { // 初始化 $i 为 0,每次循环后将 $i 值增加 1,当 $i 小于 5 时执行循环echo "The number is: $i \n"; // 输出当前 $i 的值并换行 }// 循环输出结果为: // The number …

美颜技术讲解:视频美颜SDK的开发与集成

如今&#xff0c;美颜技术的应用愈发成为吸引用户的一项重要功能。本文将深入探讨视频美颜SDK的开发与集成&#xff0c;揭示其背后的技术原理和实现步骤。 一、美颜技术的背后 美颜技术并非仅仅是简单的滤镜效果&#xff0c;而是一项涉及复杂图像处理和算法的技术。在视频美颜…

Android VpnService 使用(一)

Android VpnService 使用(一) 本篇算是VpnService 使用的第一篇文章,主要讲述service创建,intent调用. 1: 申请权限 <service android:name".MyVpnService" android:permission"android.permission.BIND_VPN_SERVICE"><intent-filter><ac…

【android开发-22】android中音频和视频用法详解

1&#xff0c;播放音频 MediaPlayer是Android中用于播放音频和视频的类。它提供了许多方法来控制播放&#xff0c;例如播放、暂停、停止、释放等。下面是一个简单的MediaPlayer用法详解和参考代码例子。 首先&#xff0c;确保在布局文件中添加了一个MediaPlayer控件&#xff…

nginx配置自动压缩-gzip压缩

1.nginx配置文件 server里添加gzip配置信息。 重启nginx服务 对比效果&#xff1a;上图是没有开启gzip自动压缩&#xff0c;总共资源是1.3M&#xff0c;传输1.3MB&#xff0c;下图是开启gzip压缩&#xff0c;总共资源是1.3M&#xff0c;传输了973KB。

全网快递批量查询的得力助手

在当今社会&#xff0c;网络购物已经成为人们日常生活的重要组成部分。随着网购的普及&#xff0c;快递行业也迅速发展壮大。然而&#xff0c;这也带来了一系列问题&#xff1a;如何快速、准确地查询快递信息&#xff1f;如何批量查询多个快递&#xff1f;今天&#xff0c;我们…

Axure的安装以及简单使用

目录 Axure简介 是什么 有什么用 Axure的优缺点 优点&#xff1a; 缺点&#xff1a; 安装 汉化 Axure的使用 工具栏 页面 ​编辑 添加子页面 ​编辑 Axure简介 是什么 Axure是一款著名的原型设计工具。它允许用户创建交互式线框图、流程图、原型和其他设计文档&…

性能测试基础

性能测试分类 客户端性能&#xff1a;测试APP自身的性能&#xff0c;例如CPU、内存消耗&#xff1b;web页面元素渲染速度 服务端性能&#xff1a;测试服务端项目程序的支持的并发、处理能力、响应时间等&#xff0c;主要通过接口来做性能测试 性能测试指标 并发 同时向服务…

UART设备

UART简介 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;通用异步收发传输器&#xff0c;UART作为异步串口通信协议的一种&#xff0c;工作原理是将传输数据的每个字符一位接一位地传输。 是在应用程序开发过程中使用频率最高的数据总线。 UART串…

CV计算机视觉每日开源代码Paper with code速览-2023.12.6

点击计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构&#xff1a;Transformer】Rejuvenating image-GPT as Strong Visual Representation Learners 论文地址&#xff1a;https://a…

动能资讯 | 智慧城市:城市转型升级

随着科技的迅猛发展&#xff0c;智慧城市正成为城市发展的新方向和热门话题。智慧城市以其前瞻性的规划、科技的融合和可持续的发展&#xff0c;为人们提供更高品质的生活和工作环境&#xff0c;正逐渐引领着新时代的发展。 智慧城市不仅仅是城市的现代化&#xff0c;更是城…

k8s一键部署uniswap

1、拉取uniswap源码 github地址 2、编写Dockerfile并打镜像 # Set the base image FROM node:18.10.0# WORKDIR /usr/src/app/ WORKDIR /home/gateway# Copy files COPY ./ /home/gateway/# Dockerfile author / maintainer LABEL maintainer"Michael Feng <mikehummi…

界面控件Kendo UI for jQuery中文教程 - 如何集成全新的DockManager组件

R3 2023版本在Kendo UI for jQuery套件中引入了许多改进&#xff0c;其中包括多个主题上的新组件、特性和改进。其中一个重要的新增功能是DockManager组件&#xff0c;本文将话一些时间与大家讨论一下它的功能&#xff01; P.S&#xff1a;Kendo UI for jQuery提供了在短时间内…

【数据结构】面试OJ题——链表

目录 1.移除链表元素 思路&#xff1a; 2.反转链表 思路&#xff1a; 3.链表的中间结点 思路&#xff1a; 4.链表中的倒数第K个结点 思路&#xff1a; 5.合并两个有序链表 思路&#xff1a; 6.链表分割 思路&#xff1a; 7.链表的回文结构 思路&#xff1a; 8.随机链表…

区块链扩容问题研究【06】

1.Plasma&#xff1a;Plasma 是一种基于以太坊区块链的 Layer2 扩容方案&#xff0c;它通过建立一个分层结构的区块链网络&#xff0c;将大量的交易放到子链上进行处理&#xff0c;从而提高了以太坊的吞吐量。Plasma 还可以通过智能合约实现跨链交易&#xff0c;使得不同的区块…

【基础篇】一,认识STM32

一&#xff0c;什么是STM32&#xff1f; STM32是一款由意法半导体公司开发的32位微控制器&#xff1b;其中ST指意法半导体&#xff1b;M指MCU或MPU&#xff0c;32指32 位。 STM32覆盖了Cortex-M的多种系列&#xff0c;包括M0、M0、M3、M7等。在分类上&#xff0c;STM32有很多…

数据在内存中的存储(整型篇)

1.辨析原码反码补码&#xff1a; 1.原码&#xff1a;有32位&#xff08;int类四个字节&#xff0c;一个字节八个比特位&#xff09;&#xff0c;第一位是符号位&#xff0c;0正1负&#xff0c;其余为二进制位。 2.计算一般是对原码进行计算&#xff0c;但在负数计算使用原码会导…

视频中自监督学习:「我的世界」下指令理解与跟随

本文介绍了北京大学人工智能研究院梁一韬助理教授所带领的 CraftJarvis 团队在「我的世界」环境下探索通用智能体设计的新进展&#xff0c;题为“GROOT: Learning to Follow Instructions by Watching Gameplay Videos”。 ​ GROOT 该研究的核心目标是探索能否摆脱文本数据的标…

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

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