AFA人工鱼群算法函数优化求解实例C++(2020.11.4)
AF人工鱼群算法C++
- 人工鱼群算法Artificial Fish
- 1 基本思想
- 2 算法介绍
- 2.1 一些定义
- 2.2 行为描述
- 2.2.1 觅食行为
- 2.2.2 聚群行为
- 2.2.3 追尾行为
- 2.2.4 随机行为
- 2.3 行为选择
- 2.4 公告板
- 2.5 终止条件
- 3 算法步骤
- 4 函数优化实例
- 4.1 目标函数
- 4.2 C++源代码(AFA)
- 4.3 运行结果
- 5 算法特点
人工鱼群算法Artificial Fish
1 基本思想
鱼群算法的基本思想是设想一片水域,如果某个地方的鱼类数目最多,那么这个地方一般来说就是水域内富含营养物质最多的地方,依据这一特点来模仿鱼群的觅食等行为,以实现全局寻优的目的。
鱼群模式中,鱼类的活动主要分为四种:觅食行为、聚群行为、追尾行为和随机行为。
2 算法介绍
这样,在类中将人工鱼的自身信息和一些行为进行封装,并且它的状态可以被同伴感知到。
2.1 一些定义
向量X=(x1,x2,...,xn)X=(x_1,x_2,...,x_n)X=(x1,x2,...,xn) 表示人工鱼个体的状态,其中xi(i=1,2,...,n)x_i(i=1,2,...,n)xi(i=1,2,...,n)为欲寻优的变量;
Y=f(X)Y=f(X)Y=f(X) 表示人工鱼当前所在位置的食物浓度,其中YYY为目标函数值;
di,j=∣∣Xi−Xj∣∣d_{i,j}=||X_i -X_j||di,j=∣∣Xi−Xj∣∣ 表示人工鱼个体之间的距离;
VisualVisualVisual 表示人工鱼的感知距离;
stepstepstep 表示人工鱼移动的最大步长;δδδ为拥挤度因子。
2.2 行为描述
人工鱼(artificial fish,AF)的主要行为如下:
2.2.1 觅食行为
觅食行为指鱼循着事物多的方向游动的一种行为,人工鱼XiX_iXi在其视野内随机选择一个状态XjX_jXj,分别计算它们的目标函数值进行比较,如果发现YjY_jYj比YiY_iYi优,则XiX_iXi向XjX_jXj的方向移动一步;否则,XiX_iXi继续在其视野内随机选择状态XjX_jXj,判断是否满足前进条件;这样反复尝试try−numbertry_{-}numbertry−number次后,如果仍不满足前进条件,则随机移动一步。
伪代码描述如下:
floatArtificial−fish::AF−prey()float Artificial_{-}fish::AF_{-}prey()floatArtificial−fish::AF−prey()
{
for(i=0;i<try−number;i++)for(i=0;i<try_{-}number;i++)for(i=0;i<try−number;i++)
{
Xj=Xi+Rand()⋅Visual;X_j = X_i+Rand()\cdot Visual;Xj=Xi+Rand()⋅Visual;
if(Yi<Yj)if (Y_i <Y_j)if(Yi<Yj)
Xi∣next=Xi+Rand()⋅Step⋅Xj−Xi∣∣Xj−Xi∣∣;X_{i|next}=X_i+Rand()\cdot Step \cdot \frac {X_j -X_i}{||X_j-X_i||};Xi∣next=Xi+Rand()⋅Step⋅∣∣Xj−Xi∣∣Xj−Xi;
elseelseelse
Xi∣next=Xi+Rand()⋅StepX_{i|next}=X_i+Rand()\cdot StepXi∣next=Xi+Rand()⋅Step
}
returnAF−foodconsistence(Xi∣next)return AF_{-}foodconsistence(X_{i|next})returnAF−foodconsistence(Xi∣next)
}
2.2.2 聚群行为
鱼在游动过程中为了保证自身的生存和躲避危害会自然地聚集成群。鱼群聚集时所遵守的规则有三条:①分割规则,尽量避免与邻近伙伴过于拥挤; ②对准规则,尽量与邻接伙伴的平均方向一致; ③内聚规则,尽量朝邻近伙伴的重心移动。人工鱼XiX_iXi搜索其视野内(即 di,j<Visuald_{i,j}<Visualdi,j<Visual)的伙伴数目nfn_fnf及中心位置XCX_CXC,若YC/nf>δYiY_C/n_f >δY_iYC/nf>δYi,表明伙伴中心有较多的食物(位置状态较优)且不太拥挤,则XiX_iXi朝伙伴的中心位置移动一步,否则执行觅食行为。
伪代码描述如下:
floatArtificial−fish::AF−swarm()float Artificial_{-}fish::AF_{-}swarm()floatArtificial−fish::AF−swarm()
{
nf=0;XC=0;n_f=0;X_C=0;nf=0;XC=0;
for(j=0;j<friend−number;j++)for(j=0;j<friend_{-}number;j++)for(j=0;j<friend−number;j++)
if(di,j<Visual)if (d_{i,j} <Visual)if(di,j<Visual) nf++;XC+=Xj;{ n_f ++;X_C +=X_j; }nf++;XC+=Xj;
XC=XCnf;X_C = \frac{X_C}{n_f};XC=nfXC;
if(YCnf>δYi)if(\frac{Y_C}{n_f} >δY_i)if(nfYC>δYi)
Xi∣next=Xi+Rand()⋅Step⋅XC−Xi∣∣XC−Xi∣∣;X_{i|next}=X_i+Rand()\cdot Step \cdot \frac {X_C -X_i}{||X_C-X_i||};Xi∣next=Xi+Rand()⋅Step⋅∣∣XC−Xi∣∣XC−Xi;
elseelseelse
AF−prey();AF_{-}prey();AF−prey();
returnAF−foodconsistence(Xi∣next)return AF_{-}foodconsistence(X_{i|next})returnAF−foodconsistence(Xi∣next)
}
2.2.3 追尾行为
鱼向其可视区域内的最优方向移动的一种行为。人工鱼XiX_iXi搜索其视野内所有伙伴中的函数最优伙伴XjX_jXj。如果YC/nf>δYiY_C/n_f >δY_iYC/nf>δYi,表明最优伙伴XjX_jXj具有较高的食物浓度并且其周围不太拥挤,则XiX_iXi朝伙伴XjX_jXj的方向前进异步;否则执行觅食行为。
伪代码描述如下:
floatArtificial−fish::AF−follow()float Artificial_{-}fish::AF_{-}follow()floatArtificial−fish::AF−follow()
{
Ymax=−∞;Y_max =- \infty;Ymax=−∞;
for(j=0;j<friend−number;j++)for(j=0;j<friend_{-}number;j++)for(j=0;j<friend−number;j++)
if(di,j<Visualif(d_{i,j}<Visualif(di,j<Visual && Yj>Ymax)Y_j >Y_{max})Yj>Ymax)
Ymax=Yj;Xmax=Xj;{Y_{max}=Y_j;X_{max}=X_j;}Ymax=Yj;Xmax=Xj;
nf=0;n_f=0;nf=0;
for(j=0;j<friend−number;j++)for(j=0;j<friend_{-}number;j++)for(j=0;j<friend−number;j++)
if(dmax,j<Visual)if(d_{max,j}<Visual)if(dmax,j<Visual) nf++;{n_f++;}nf++;
if(Ymaxnf>δYi)if(\frac{Y_max}{n_f}>δY_i)if(nfYmax>δYi)
Xi∣next=Xi+Rand()⋅Step⋅Xmax−Xi∣∣Xmax−Xi∣∣X_{i|next}=X_i+Rand()\cdot Step\cdot \frac{X_{max}-X_i}{||X_{max}-X_i||}Xi∣next=Xi+Rand()⋅Step⋅∣∣Xmax−Xi∣∣Xmax−Xi
elseelseelse
AF−prey();AF_{-}prey();AF−prey();
returnAF−foodconsistence(Xi∣next);return AF_{-}foodconsistence(X_{i|next});returnAF−foodconsistence(Xi∣next);
}
2.2.4 随机行为
随机行为指人工鱼在视野内随机移动,当发现食物时,会向食物逐渐增多的方向快速移动。随机行为的实现较为简单,就是向视野中随机选择一个状态的方向移动,本质上讲它是觅食行为的一个缺省行为。
2.3 行为选择
根据所要解决的问题性质,需要对人工鱼当前环境进行评价后来选择一种行为。而较常用的评价方法及时选择各行为中使得向最优方向前进最大的行为,也就是个性为中使得人工鱼的下一个状态最优的行为,如果没有能使下一状态优于当前状态的行为,则采取随机行为。
2.4 公告板
公告板是记录最优人工鱼个体状态的地方。每条人工鱼在执行完一次迭代后将自身当前状态与公告板中记录的状态进行比较,若优于公告板中的状态则用自身状态更新,否则公告板的状态不变。当整个算法的迭代结束后,输出公告板的值,就是所求的最优值。
2.5 终止条件
①判断连续多次所得的均方差小于允许的误差;
②判断一些区域的人工鱼群的数量达到某个比率;
③连续多次所获取的值均不得超过以寻找的极值;
④迭代次数到达设定的最大次数。
3 算法步骤
步骤1:初始化,确定种群规模N,在变量可行域内随机生成NNN个个体,设定人工鱼的可视域 VisualVisualVisual,步长stepstepstep,拥挤度因子δδδ,尝试次数try−numbertry_{-}numbertry−number;
步骤2:计算初始鱼群各个体的适应值,取最优人工鱼状态及其值赋给公告板;
步骤3:个体通过觅食行为、聚群行为、追尾行为更新自己,生成新鱼群;
步骤4:评价所有个体,若某个体优于公告板,则将公告板更新为该个体;
步骤5:当公告板上最优解达到满意误差界内,算法结束;否则转到步骤3.
4 函数优化实例
4.1 目标函数
f(x,y)=sin(x)xsin(y)yf(x,y) = \frac{sin(x)}{x} \frac{sin(y)}{y}f(x,y)=xsin(x)ysin(y)
其中, $s.t. $ x∈[−10,10]x∈[-10,10]x∈[−10,10] y∈[−10,10]y∈[-10,10]y∈[−10,10]
Matlab绘制函数图像代码如下:
X=-10:0.1:10;
Y=-10:0.1:10;
[XX,YY]=meshgrid(X,Y);
Z=sin(XX).*sin(YY)./(XX.*YY);
figure
subplot(1,2,1)
mesh(XX,YY,Z);title('Meshplot');
subplot(1,2,2)
contour(XX,YY,Z);title('Meshplot');
函数图像如上图所示,该函数的极点位于(0,0)(0,0)(0,0)处,极值为1,可以看出,该非线性函数在全局极大值的周围密布着许多局部极值,通常的寻优算法极易陷入局部极值在各局部极值间振荡,比较适用于验证算法的性能。
4.2 C++源代码(AFA)
main.cpp
#include <iostream>
#include <random>
#include<time.h>
#include <math.h>
using namespace std;
double Xmax = 10, Xmin = -10;//变量的可行域
std::default_random_engine random((unsigned int)time(NULL));
std::uniform_real_distribution<double> u(Xmin, Xmax); //随机数分布对象
std::uniform_real_distribution<double> r(-1, 1); //随机数分布对象
struct AF
{public:int dimension;//个体变量维数double *X;void Init(int Dim)//初始化函数{dimension = Dim;X = new double[dimension];for (int j = 0; j < dimension; j++)*(X+j) = u(random);}double fitfunctionvalue()//个体适应值计算函数{double f = sin(*X)*sin(*(X + 1)) / ((*X) * (*(X + 1)));return f;}
};
struct YUQUN
{public:int N;//种群规模int Dimension;//维数double step = 0;double visual = 0;double try_number = 0;double delta = 0;AF *af;AF Bestfish;//公告板最优解void Init(int num, int Dim, double Step, double Visual, double Try_number, double Delta)//初始化函数{N = num;Dimension = Dim;step = Step;visual = Visual;try_number = Try_number;delta = Delta;af = new AF[num];for (int i = 0; i < N; i++)(af + i)->Init(Dimension);Bestfish.Init(Dimension);/*double bestfitvalue = Bestfish.fitfunctionvalue();for(int i=0;i<N;i++)if ((af + i)->fitfunctionvalue() > bestfitvalue){for (int j = 0; j < Dimension; j++)Bestfish.X[j] = (af + i)->X[j];}*/}double Distance(AF af1, AF af2)//计算两条鱼距离的函数{double dist = 0;for (int i = 0; i < Dimension; i++)dist += pow(af1.X[i] - af2.X[i], 2.0);dist = sqrt(dist / float(Dimension));return dist;}void prey(int id)//觅食行为{AF AFNew;AFNew.Init(Dimension);for (int i = 0; i < try_number; i++){for (int j = 0; j < Dimension; j++)AFNew.X[j] = (af+id)->X[j] + r(random) * visual;double Yi = 0, Yj = 0;Yi = (af + id)->fitfunctionvalue();Yj = AFNew.fitfunctionvalue();if (Yi < Yj){for (int j = 0; j < Dimension; j++)(af + id)->X[j] = (af + id)->X[j] + r(random)*step*(AFNew.X[j] - (af + id)->X[j]) / Distance(AFNew, *(af+id));}else{for (int j = 0; j < Dimension; j++)(af + id)->X[j] = (af + id)->X[j] + r(random)*step;}}}void swarm(int id)//聚群行为{AF AFXc;AFXc.Init(Dimension);for (int j = 0; j < Dimension; j++) AFXc.X[j] = 0;double nf = 0;for (int i = 0; i < N; i++)if ((Distance(*(af + id), *(af + i)) < visual) && (Distance(*(af+id), *(af + i)) != 0)){nf++;for (int j = 0; j < Dimension; j++) AFXc.X[j] += (af + i)->X[j];}for (int j = 0; j < Dimension; j++)AFXc.X[j] = AFXc.X[j] / nf;//计算邻域伙伴的中心位置double Yc= AFXc.fitfunctionvalue(), Yi=(af+id)->fitfunctionvalue();if (Yc / nf > delta*Yi){for (int j = 0; j < Dimension; j++)(af + id)->X[j] = (af + id)->X[j] + r(random)*step*(AFXc.X[j] - (af + id)->X[j]) / Distance(AFXc, *(af + id));}elseprey(id);}void follow(int id)//追尾行为{double Ymax = -INFINITY;AF AFXmax;AFXmax.Init(Dimension);for (int j = 0; j < Dimension; j++) AFXmax.X[j] = 0;for (int i = 0; i < N; i++){double dij = Distance(*(af+id), *(af+i)), Yj = (af+i)->fitfunctionvalue();if (dij != 0 && dij<visual && Yj >Ymax){Ymax = Yj;for (int j = 0; j < Dimension; j++)AFXmax.X[j] = (af+i)->X[j];}}double nf = 0;for (int i = 0; i < N; i++){double dmaxj = Distance(AFXmax,*(af+i));if (dmaxj != 0 && dmaxj < visual) nf++;}double Yi = (af + id)->fitfunctionvalue();if (Ymax / nf > delta *Yi){for (int j = 0; j < Dimension; j++)(af+id)->X[j] = (af + id)->X[j] + r(random)*step*(AFXmax.X[j] - (af+id)->X[j]) / Distance(AFXmax, *(af+id));}elseprey(id);}void evaluate(int id){if ((af + id)->fitfunctionvalue() > Bestfish.fitfunctionvalue()){for (int j = 0; j < Dimension; j++)Bestfish.X[j] = (af + id)->X[j];}}void run(int itetime)//运行函数{for (int k = 0; k < itetime; k++){for (int i = 0; i < N; i++){prey(i);swarm(i);follow(i);evaluate(i);}std::cout << "第" << k + 1 << "次迭代最优位置为Bestfish:";for (int j = 0; j<Dimension; j++){if (j == Dimension - 1) std::cout << Bestfish.X[j] <<" "<<Bestfish.fitfunctionvalue()<< endl;else std::cout << Bestfish.X[j] << ",";}}std::cout << "迭代结束后最优位置为Bestfish:";for (int j = 0; j<Dimension; j++){if (j == Dimension - 1) std::cout << Bestfish.X[j] << " " << Bestfish.fitfunctionvalue() << endl;else std::cout << Bestfish.X[j] << ",";}}void shuchu(){for (int i = 0; i < N; i++){for (int j = 0; j < Dimension; j++)std::cout << (af + i)->X[j] << " ";std::cout << endl;}}void doAFAS(int num, int Dim, double Step, double Visual, double Try_number, double Delta,int Itetime){Init(num, Dim, Step, Visual, Try_number, Delta);shuchu();run(Itetime);}
};
int main()
{YUQUN yq;while (true){int num=0;std::cout << "请输入迭代的次数:";cin >> num;if (num == 0)break;else yq.doAFAS(10, 2, 0.3, 2.5, 5, 0.618, num);}system("pause");return 0;
}
4.3 运行结果
迭代20次结果:
迭代50次结果:
迭代100次结果:
5 算法特点
人工鱼群算法有良好的克服局部极值取得全局极值的能力,并且算法中只使用目标函数的函数值,无需目标函数的梯度值等特殊信息,对搜索空间具有一定的自适应能力。算法对初值无要求,对各参数的选择也不是很敏感。但该算法获取的仅仅是系统的满意解域,对于精确解的获取还需要进行适当的改进,一些改进的算法也被相继提出。
用人工鱼群算法解决离散优化问题时,该算法具有保持探索与开发平衡的能力较差和算法运行后期搜索的盲目性较大等缺点,从而影响了该算法搜索的质量和效率。
AFA人工鱼群算法函数优化求解实例C++(2020.11.4)相关推荐
- 【预测模型】基于人工鱼群算法优化BP神经网络实现数据预测matlab源码
1 算法介绍 1.1 BP神经网络 1. 反向传播算法应用领域 反向传播算法应用较为广泛,从字面意思理解,与前向传播相互对应.在简单的神经网络中,反向传播算法,可以理解为最优化损失函数过程,求解每个参 ...
- matlab球落点的数学建模,MATLAB数学建模:智能优化算法-人工鱼群算法
MATLAB 数学建模: 人工鱼群算法 1. 基本原理 人工鱼群算法是一种受鱼群聚集规律而启发的优化算法. 在人工鱼群算法中, 我们假定鱼群的活动行为分为: 觅食行为, 群聚行为, 追随行为和随机行为 ...
- matlab实战系列之人工鱼群算法求解TSP问题原理解析(下篇源码解析)
从算法的名字中可以看出该算法是群体智能优化算法中的一种,人工鱼群算法通过模拟鱼群的觅食.聚群.追尾.随机等行为在搜索域中进行寻优. 人工鱼群算法有三个比较重要的概念:视野范围.k-距离邻域.多条鱼的中 ...
- 基于人工鱼群算法的路径优化,鱼群算法的原理
目录 摘要 参数优化的方法 鱼群算法的原理 基于人工鱼群算法的参数优化 基本参数 代码 效果图 结果分析 展望 摘要 详细介绍了人工鱼群算法的原理,并MATLAB编程实现基于人工鱼群算法的参数优化,对 ...
- 【BP数据预测】基于matlab人工鱼群算法优化BP神经网络数据预测【含Matlab源码 523期】
一.人工鱼群算法简介 1 觅食行为 指鱼循着食物多的方向游动的一种行为,人工鱼X i X_iXi在其视野内随机选择一个状态X j X_jXj,分别计算它们的目标函数值进行比较,如果发现Y j ...
- 【AFSA TSP】基于matlab改进的人工鱼群算法求解旅行商问题【含Matlab源码 1479期】
⛄一. TSP简介 旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须 ...
- 【机器学习】基于人工鱼群算法的多元非线性函数寻优
基于人工鱼群算法的多元非线性函数寻优
- 【机器学习】基于人工鱼群算法的非线性函数寻优
本微信图文介绍了人工鱼群算法的基本原理并对一元非线性函数进行极值寻优.
- 【AFSA TSP】基于matlab人工鱼群算法求解旅行商问题【含Matlab源码 422期】
一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[TSP]基于matlab人工鱼群算法求解旅行商问题[含Matlab源码 422期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...
- Matlab基于人工鱼群算法求解TSP问题
一. 人工鱼的结构模型 人工鱼是真实鱼抽象化.虚拟化的一个实体,其中封装了自身数据和一系列行为,可以接受环境的刺激信息,做出相应的活动.其所在的环境由问题的解空间和其他人工鱼的状态,它在下一时刻的行为 ...
最新文章
- win10安装dorcker笔记
- Android之PowerManagerBatteryManager
- ES6数组新增的几个方法
- CPU缓存和内存屏障
- BAP存储属性的思想
- 思科五个高危漏洞 CDPwn 影响数千万台企业设备
- 核心金融场景分布式事务
- 《Java编程思想》学习笔记(一)——再度理解OOP
- IDENTITY_INSERT 设置为 OFF
- LoadRunner测试139邮箱的脚本
- 网页文字提取插件-网页文字提取器
- 跨境erp系统功能分析
- vue多次引用组件,减少每个页面import的方法
- Nginx的常用配置
- 火狐资产2.6浏览器 下载_通过浏览器体验资产商店!
- Delphi 编写数字签名验证并获取签名信息
- mysql根据学号或是姓名查询_SQL学习之MySQL SQL查询作业答案
- 【linux】循序渐进学运维-基础篇-netstat命令详解
- PyTorch 图像分类识别(一)定义及加载自己的数据集并可视化
- 中国工程院新增选54名院士