数学建模——粒子群算法步骤及程序详解
文章目录
- 前言
- 一、粒子群是什么?
- 二、粒子群算法的核心公式
- 1.速度
- 2.位置
- 3.核心参数的设置
- 惯性权重
- 学习因子
- 自动退出迭代循环
- 三.代码详解
- 总结
前言
优化算法一直都是数学建模比赛的热门题型,很多问题都可以简化为规划问题,利用启发式算法算法进行解答,所以学习优化问题的优先级和性价比还是很高的,基本都是掌握两三种启发式算法就可以解决大部分问题,启发式算法包括模拟退火算法、遗传算法、粒子群算法、蚁群算法等等,之前已经讲过模拟退火和遗传算法,这里再讲粒子群算法就结束了,后面的启发式算法就不再出了。
模拟退火:
遗传算法:
一、粒子群是什么?
1995年,美国学者Kennedy和Eberhart共同提出了粒子群算法,其基本思想源于对鸟类群体行为进行建模与仿真的研究结果的启发。它的核心思想是利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得问题的可行解。
直观一点的解释其实就是模拟鸟群觅食,利用鸟类觅食的群体行为和个人习惯搜索离食物更近的地方。
粒子群算法有一些假设
鸟类觅食受到群体行为和个人习惯两个东西的影响:
(1)离食物近的鸟类会给其他的同类传递信息,我这里离食物比较近,大家都快过来,那么所有鸟类都会有一个被吸引过去的趋势。
(2)鸟类有自己本身的经验,他自己之前也寻找过食物,所以会有一个倾向,根据经验走出下一步。
(3)鸟类飞行会有一个惯性,所以走下一步的时候会延惯性飞行。
以上三个就是鸟类飞行的重点,根据以上的鸟群觅食行为,开发了粒子群算法。
根据以上思想引入基本概念:
符号 | 粒子群含义 | 实际问题 含义 |
---|---|---|
xxx | 粒子 | 优化问题的解 |
f(x)f(x)f(x) | 适应度 | 评价解的优劣,规划问题中的目标函数 |
pdbestidpdbest^d_ipdbestid | 第d次迭代第i个最佳位置 | 单个粒子目前为止找到的最佳位置 |
gdbestdgdbest^dgdbestd | 第d次迭代群体最佳位置 | 粒子群目前为止找到的最佳位置 |
vidv_i^dvid | 第d次迭代,第i个粒子的速度 | 离下一个解的距离 |
nnn | 粒子个数 | 解的个数 |
www | 粒子的惯性权重 | 无 |
c1c_1c1 | 粒子的个体学习因子 | 无 |
c2c_2c2 | 粒子的社会学习因子 | 无 |
xxx | 位置 | 粒子(解)所在的坐标 |
注:x可以表示粒子同时也表示粒子的位置,两者是不矛盾的
二、粒子群算法的核心公式
1.速度
当个鸟(粒子)第d步的速度 =自我认知部分 +社会认知部分+上一步自身的速度惯性
v(d)=w∗vid‐1+c1∗r1∗(pbestid‐xid)+c2∗r2∗(gbestd‐xid)v(d) = w*v_i^{d‐1} + c_1*r_1*(pbest^d_i‐x^d_i) + c_2*r_2*(gbest^d‐x^d_i) v(d)=w∗vid‐1+c1∗r1∗(pbestid‐xid)+c2∗r2∗(gbestd‐xid)
其中r1r_1r1,r2r_2r2是[0,1]上的随机数,由公式表达式可以知道,鸟的速度可以由三个部分的矢量和组成,符合鸟群的习惯和认知。
2.位置
这只鸟第d+1步所在的位置 = 第d步所在的位置 + 第d步的速度 * 运动的时间
xid+1+xid+vidx_i^{d+1}+x_i^d+v_i^dxid+1+xid+vid
3.核心参数的设置
核心参数的设置一般都是参考其他论文的参数设置,一般大家都会有一个默认的参数设置,这是不断实验出来的结果。
惯性权重
惯性权重一般取0.9,也有其他情况取0.9‐1.2的,没有具体的限制,也有的学者提出将惯性权重设置为自适应惯性权重、随机惯性权重。
学习因子
学习因子分为个体学习因子和社会学习因子,一般情况都取2比较合适。学习因子也有改进的地方,但是一般都不会改进得太复杂,新手只要学到这里就可以了,后续改进可以自己去了解。
自动退出迭代循环
当鸟类已经找到食物后,再继续寻找食物只会浪费计算时间,那么我们就需要设定一个特定的条件,使得计算时,在达到条件后能够自动退出迭代。
(1)达到最大迭代次数退出循环
(2)达到鸟群达到的最优值长时间保持不变退出循环
那么退出循环就会有以上两种方式,最优值的长时间不变编程的思路可以如下
1.初始化计数器、最优值迭代忍受值。
2.定义适应度的容忍度
3.比较适应度的变化值和适应度的容忍度大小,如果前者小,则计数器加1;否则计数器清0。
4.判断计数器有没有超过“最优值迭代忍受值”,计数器的值超过了最优值迭代忍受值,那么我们
就跳出迭代循环,循环结束,鸟类停止觅食。
三.代码详解
Matlab代码如下(示例):
题目我们以
y=11sinx+7cos5xy=11sin\ x+7cos\ 5x y=11sin x+7cos 5x
作为例题,区间定义在[-10,10]
clc,clear
%% 粒子群算法中的预设参数(参数的设置不是固定的,可以适当修改)
D = 500; % 迭代的次数
n = 10; % 粒子数量
factor = 1; % 变量个数
c1 = 2; % 个体学习因子
c2 = 2; % 社会学习因子
w = 0.9; % 惯性权重
D = 50; % 迭代的次数
vmax = 1.2; % 粒子的最大速度
x_lb = -10; % x的下界
x_ub = 10; % x的上界
x = zeros(n,factor);
for i = 1: factor % 将粒子群随机在定义域内x(:,i) = x_lb(i) + (x_ub(i)-x_lb(i))*rand(n,1);
end
v = -vmax + 2*vmax .* rand(n,factor); % 随机初始化粒子的速度(这里我们设置为[-vmax,vmax])
f = zeros(n,1);
for i = 1:n % 循环整个粒子群,计算每一个粒子的适应度f(i) = fun1(x(i,:)); % fun1为计算适应度的函数,
end
pbest = x; % 单个粒子迄今为止找到的最佳位置
gbest = pbest(find(f == min(f))); % 定义所有粒子迄今为止找到的最佳位置
fmean = zeros(1,D); %粒子群迭代平均适应度
fbest = zeros(1,D); %粒子群迭代的最优适应度
js = 0;
r = 20;
g = fun1(gbest); %当前最优值
%% 开始迭代()
for i = 1:Dx1 = x + v; %更新位置v1 = w.*v + c1*rand()*(pbest-x) + c1*rand()*(gbest-x); %更新速度for j=1:n %判断位置有没有超过取值区间,超过了取值区间就修改为区间最值if x1(j,1) < x_lbx(j,1) = x_lb;elseif x1(j,1) > x_ubx(j,1) = x_ub;elsex(j,1) = x1(j,1);end%判断速度有没有超过最大值,超过了就修改为最大值if v1(j,1) > vmaxv(j,1) = vmax;elsev(j,1) = v1(j,1);endf(j,1) = fun1(x(j,1));if f(j,1) < fun1(pbest(j,1))pbest(j,1) = x(j,1);if f(j,1) < fun1(gbest)gbest = x(j,1);endendendf = fun1(x);fmean(1,i) = mean(fun1(x)); %记录每次迭代平均适应度fbest(1,i) = fun1(gbest); %记录每次迭代的最优适应度%自动退出迭代循环if fun1(gbest) - g < 0.0000001 js = js + 1;endg = fun1(gbest); %更新最优值的退出值if js > rbreakend
end
xd=1:i;
plot(xd,fmean(1,1:i))
hold on
plot(xd,fbest(1,1:i))
xlabel('迭代次数')
legend('粒子群平均适应度','粒子群最优适应度')
disp('最佳的位置是:');
disp(gbest)
disp('此时最优值是:');
disp(-fun1(gbest)) %加负号是因为有设定适应度的时候就是设定为越小越好
function y = fun1(x)y = 11*sin(x) + 7*cos(5*x);% y = -(11*sin(x) + 7*cos(5*x)); % 如果调用fmincon函数,则需要添加负号改为求最小值
end
总结
以上就是今天要讲的内容,本文仅仅简单介绍了粒子群的使用,而粒子群的方法还有更多的,包括多元函数的求最值,各自寻优算法都是可以应用的,不同之处在于解的产生,这也是大部分寻优算法的不同之处(有些算法的产生新解可以共通,大家以后题做多了就会遇到),寻优算法的相同之处在于都是基于继承之前的信息,通过多次迭代寻找最优值,本质并没有很大区别,学会两三种即可。
数学建模——粒子群算法步骤及程序详解相关推荐
- 粒子群算法(PSO)详解
1 粒子群PSO算法简介 1.1 维基百科的解释 粒子群算法(Particle Swarm Optimization,简称PSO),或称粒子群优化,是属于人工智能算法,公元1995年由肯尼迪(Kenn ...
- 【学习笔记】MATLAB与数学建模——粒子群算法(未完成)
⭐️ 前言--盲目搜索和启发式搜索
- 数学建模——遗传算法步骤及程序详解
数学建模--遗传算法步骤及程序详解 文章目录 数学建模--遗传算法步骤及程序详解 前言 一.遗传算法的基础 1.编码和解码 2.适应度函数 3.交叉 4.变异 5.选择 二.遗传算法原理步骤 1.初始 ...
- 数学建模——一维、二维插值模型详解Python代码
数学建模--一维.二维插值模型详解Python代码 一.一维插值 # -*-coding:utf-8 -*- import numpy as np from scipy import interpol ...
- 数学建模--蚁群算法
数学建模常用的优化算法有蚁群算法. 首先学习资料: 网站:慕课数学建模在线课程 课件:链接:https://pan.baidu.com/s/1-bhmFZl7yM4-5JL__fzkLw 提取码:4s ...
- RRT与RRT*算法具体步骤与程序详解(python)
提示:前面写了A*.Dijkstra算法 文章目录 前言 一.RRT的原理与步骤 二.RRT算法编写的步骤 1.算法步骤 2.算法的实现 三.RRT*算法编写的步骤 1.算法的步骤 2.算法的实现 三 ...
- 限时9.9元 | 快速领取数学建模竞赛备战必备技巧与论文详解!
全世界只有3.14 % 的人关注了 青少年数学之旅 大家晚上好,随着美赛时间的公布以及大大小小的数学建模竞赛的进行,小天经常可以收到来自很多小伙伴们提出的问题,"竞赛中如何去考虑选题?&qu ...
- 清风数学建模学习笔记——系统(层次)聚类原理详解及案例分析
系统聚类 系统聚类的合并算法通过计算两类数据点间的距离,对最为接近的两类数据点进行组合,并反复迭代这一过程,直到将所有数据点合成一类,并生成聚类谱系图.此外,系统聚类可以解决簇数 K 的取值问题, ...
- 2015美国数学建模a代码c语言,美国数学建模比赛2020 MCM C题代码详解
# #!-*- coding:utf-8 -*- import pandas as pd import numpy as np import xlrd import vaderSentiment fr ...
最新文章
- 比尔.盖茨11点忠告
- Linux环境安装、卸载Docker
- QT使用html改变字体颜色,QT中设置字体和更改字体颜色
- Springboot(2.0.0.RELEASE)+spark(2.1.0)框架整合到jar包成功发布(原创)!!!
- Java2017面试宝典--XML部分、 流行的框架与新技术、软件工程与设计模式、 j2ee部分、EBJ部分、 webservice部分...
- java webtable_java winform开发:JTable详解
- wps是用python语言开发的吗_wps是用什么语言开发的
- Android App应用市场功能的框架图
- 中国软件公司排名(北京)(杭州)
- 总结下几个有漏洞第三方插件
- 【BZOJ】3993: [SDOI2015]星际战争
- java reactjs_从Java的角度理解前端框架,nodejs,reactjs,angularjs,requirejs,seajs
- 理财入门:思维转变和资产理解以及财务自由说明。
- 大数据可视化大屏展示
- qsnctf 骑士CMS01 wp
- matlab中circle函数_MATLAB如何用自带函数画圆
- 6-7 快速排序 (15 分)
- png图片查重小工具
- Photoshop之旅游名片制作(保姆级教程)
- 武汉理工大学2021计算机考研经验分享
热门文章
- 苹果宣布iPhone 4S上市三天销量突破400万部
- 电信版iPhone 4上市
- 中国草酸市场需求前景及竞争趋势预测报告(新版)2022~2027年
- web调用windows桌面程序
- python 取列表(数组)偶数和奇数位置的值
- Cannot connect to “localhost“. The server time zone value ‘�й���ʱ��‘ is unrecognized or representsC
- C++:指针:什么是野指针
- 华为发布下一代产品战略123456及+AI系列新品
- line-height: 1; line-height: 100%;是什么意思
- paddle mnist