基于鱼群算法的函数寻优算法
文章目录
- 一,人工鱼群算法概述
- 二,解题思路及步骤
- 三,MATLAB程序实现
- 四,运行结果
- 五,人工鱼群算法优点
- 六,算法改进的几个方向
- 七,参考文献
一,人工鱼群算法概述
人工鱼群算法(artificial fish swarm algorithm,AFSA)是李晓磊等人于2002年提出的一类基于动物(鱼类)行为的群体智能优化算法。该算法是通过模拟鱼类的觅食、聚群、追尾、随机等行为在搜索域中进行寻优,是集群智能思想的一个具体应用。
如图1所示,一条虚拟人工鱼实体的当前位置为X,它的视野范围为Visual,位置Xv为其在某时刻的视点所在的位置,如果该位置的食物浓度高于当前位置,则考虑向该位置方向前进一步,即到达位置Xnext;如果位置Xv不比当前位置食物浓度更高,则继续巡视视野内的其他位置。巡视的次数越多,则对视野内的状态了解越全面,从而对周围的环境有一个全方面立体的认知,这有助于做出相应的判断和决策。
图1 人工鱼的视野和移动步长
图1中,位置X=(x1,x2,⋯,xn)X = (x_1, x_2, \dotsm, x_n)X=(x1,x2,⋯,xn),位置Xv=(x1v,x2v,⋯,xnv)X_v = (x_1^v, x_2^v, \dotsm, x_n^v)Xv=(x1v,x2v,⋯,xnv),则该过程可以表示如下:
xiv=xi+visual⋅r,i=1,2,...,nx_i^v=x_i+visual·r,i = 1,2,...,nxiv=xi+visual⋅r,i=1,2,...,nXnext=Xv−X∣∣Xv−X∣∣⋅Step⋅rX_{next}=\frac {X_v-X} {||X_v-X||}·Step·rXnext=∣∣Xv−X∣∣Xv−X⋅Step⋅r其中,r是[-1,1]区间的随机数;Step为移动步长。
二,解题思路及步骤
- 变量及函数定义
人工鱼群算法中用到的变量参数如表1所列。表1 变量参数
人工鱼群算法用到的函数如表2所示。
表2 主要函数
- 算法流程
图2 人工鱼群算法流程图
- 人工鱼群算法实现
(1)鱼群初始化
鱼群中的每条人工鱼均为一组实数,是在给定范围内产生的随机数组。
(2)觅食行为
设人工鱼当前状态为XiX_iXi,在其感知范围内随机选择一个状态XjX_jXj,如果在求极大问题中,Yi<YjY_i<Y_jYi<Yj(极小问题时Yi>YjY_i>Y_jYi>Yj),则向该方向前进一步;反之,再重新随机选择状态XjX_jXj,判断是否满足前进条件。这样反复尝试try_number次后,如果仍不满足前进条件,则随机移动一步。
(3)聚群行为
设人工鱼当前状态为XiX_iXi,探索当前领域内(即di,j<Visuald_{i,j}<Visualdi,j<Visual)的伙伴数目nfn_fnf及中心位置XcX_cXc,如果Ycnf>δYi\frac {Y_c}{n_f}>δY_infYc>δYi(δδδ为拥挤度),表明伙伴中心有较多的食物并且不太拥挤,则朝伙伴的中心位置方向前进一步;否则执行觅食行为。
(4)追尾行为
设人工鱼当前状态为XiX_iXi,探索当前领域内(即di,j<Visuald_{i,j}<Visualdi,j<Visual)的伙伴数目nfn_fnf及伙伴中YjY_jYj为最大的伙伴XjX_jXj,如果Yjnf>δYi\frac {Y_j}{n_f}>δY_infYj>δYi(δδδ为拥挤度),表明伙伴中心有较多的食物并且不太拥挤,则朝伙伴的中心位置方向前进一步;否则执行觅食行为。
(5)随机行为
随机行为的实现较简单,就是在视野中随机选择一个状态,然后向该方向移动,其实,它是觅食行为的一个缺省行为,即XiX_iXi的下一个位置Xi∣nextX_{i|next}Xi∣next为Xi∣next=Xi+r⋅VisualX_{i|next}=X_i+r·VisualXi∣next=Xi+r⋅Visual其中,r是区间[-1,1]的随机数;Visual为感知距离。
三,MATLAB程序实现
待求问题:目标函数(即食物浓度函数)是用来求人工鱼当前位置的食物浓度,其实就是求给定变量值的函数值,例如计算以下函数的最大值(极大值):f(x)=xsin(10πx)+2,−1≤x≤2f(x)=xsin(10\pi x)+2,-1≤x≤2f(x)=xsin(10πx)+2,−1≤x≤2
- 鱼群初始化函数
创建初始人工鱼群,函数名为AF_init:
function X=AF_init(Nfish,lb_ub)
% 输入:
% Nfish 鱼群大小
% lb_ub 鱼的活动范围% 输出:
% X 产生的初始人工鱼群% example:
% Nfish=3;
% lb_ub=[-3.0,12.1,1;4.1,5.8,1];
%%这里的lb_ub是2行3列的矩阵,每行中前两个数是范围的上下限,第3个数是在该范围内的数的个数
% X=Inital(Nfish,lb_ub)
%%就是产生[-3.0,12.1]内的数1个,[4.1,5.8]内的数1个
%%两个数一组,这样的数一共Nfish个
row=size(lb_ub,1);
X=[];
for i=1:rowlb=lb_ub(i,1);ub=lb_ub(i,2);nr=lb_ub(i,3);for j=1:nrX(end+1,:)=lb+(ub-lb)*rand(1,Nfish);end
end
- 觅食行为
觅食行为函数AF_prey的代码:
function [Xnext,Ynext]=AF_prey(Xi,ii,visual,step,try_number,LBUB,lastY)
%觅食行为
%输入:
%Xi 当前人工鱼的位置
%ii 当前人工鱼的序号
%visual 感知范围
%step 最大移动步长
%try_number 最大尝试次数
%LBUB 各个数的上下限
%lastY 上次的各人工鱼位置的食物浓度%输出:
%Xnext Xi人工鱼的下一个位置
%Ynext Xi人工鱼的下一个位置的食物浓度Xnext=[];
Yi=lastY(ii);
for i=1:try_numberXj=Xi+(2*rand(length(Xi),1)-1)*visual;Yj=AF_foodconsistence(Xj);if Yi<YjXnext=Xi+rand*step*(Xj-Xi)/norm(Xj-Xi);for i=1:length(Xnext)if Xnext(i)>LBUB(i,2)Xnext(i)=LBUB(i,2);endif Xnext(i)<LBUB(i,1)Xnext(i)=LBUB(i,1);endendXi=Xnext;break;end
end%随机行为
if isempty(Xnext)Xj=Xi+(2*rand(length(Xi),1)-1)*visual;Xnext=Xj;for i=1:length(Xnext)if Xnext(i)>LBUB(i,2)Xnext(i)=LBUB(i,2);endif Xnext(i)<LBUB(i,1)Xnext(i)=LBUB(i,1);endend
end
Ynext=AF_foodconsistence(Xnext);
- 聚群行为
聚群行为函数AF_swarm的代码:
function [Xnext,Ynext]=AF_swarm(X,i,visual,step,deta,try_number,LBUB,lastY)
% 聚群行为
%输入:
%X 所有人工鱼的位置
%i 当前人工鱼的序号
%visual 感知范围
%step 最大移动步长
%deta 拥挤度
%try_number 最大尝试次数
%LBUB 各个数的上下限
%lastY 上次的各人工鱼位置的食物浓度%输出:
%Xnext Xi人工鱼的下一个位置
%Ynext Xi人工鱼的下一个位置的食物浓度
Xi=X(:,i);
D=dist(Xi,X);
index=find(D>0 & D<visual);
nf=length(index);
if nf>0for j=1:size(X,1)Xc(j,1)=mean(X(j,index));endYc=AF_foodconsistence(Xc);Yi=lastY(i);if Yc/nf>deta*YiXnext=Xi+rand*step*(Xc-Xi)/norm(Xc-Xi);for i=1:length(Xnext)if Xnext(i)>LBUB(i,2)Xnext(i)=LBUB(i,2);endif Xnext(i)<LBUB(i,1)Xnext(i)=LBUB(i,1);endendYnext=AF_foodconsistence(Xnext);else[Xnext,Ynext]=AF_prey(Xi,i,visual,step,try_number,LBUB,lastY);end
else[Xnext,Ynext]=AF_prey(Xi,i,visual,step,try_number,LBUB,lastY);
end
- 其中,函数AF_dist为:
%计算第i条鱼与所有鱼的位置,包括本身。
function D=dist(Xi,X)
col=size(X,2);
D=zeros(1,col);
for j=1:colD(j)=norm(Xi-X(:,j));
end
- 追尾行为
追尾行为函数AF_follow的代码:
function [Xnext,Ynext]=AF_follow(X,i,visual,step,deta,try_number,LBUB,lastY)
% 追尾行为
%输入:
%X 所有人工鱼的位置
%i 当前人工鱼的序号
%visual 感知范围
%step 最大移动步长
%deta 拥挤度
%try_number 最大尝试次数
%LBUB 各个数的上下限
%lastY 上次的各人工鱼位置的食物浓度%输出:
%Xnext Xi人工鱼的下一个位置
%Ynext Xi人工鱼的下一个位置的食物浓度
Xi=X(:,i);
D=dist(Xi,X);
index=find(D>0 & D<visual);
nf=length(index);
if nf>0XX=X(:,index);YY=lastY(index);[Ymax,Max_index]=max(YY);Xmax=XX(:,Max_index);Yi=lastY(i);if Ymax/nf>deta*YiXnext=Xi+rand*step*(Xmax-Xi)/norm(Xmax-Xi);for i=1:length(Xnext)if Xnext(i)>LBUB(i,2)Xnext(i)=LBUB(i,2);endif Xnext(i)<LBUB(i,1)Xnext(i)=LBUB(i,1);endendYnext=AF_foodconsistence(Xnext);else[Xnext,Ynext]=AF_prey(X(:,i),i,visual,step,try_number,LBUB,lastY);end
else[Xnext,Ynext]=AF_prey(X(:,i),i,visual,step,try_number,LBUB,lastY);
end
- 目标函数
食物浓度函数AF_foodconsistence如下:
function [Y] = AF_foodconsistence(X)
% 计算人工鱼的当前位置的食物浓度
% 输入:
% X 待求的人工鱼,每列为一条人工鱼% 输出:
% Y 输出各条人工鱼当前位置的食物浓度(即函数值)
fishnum = size(X, 2);
for i = 1:fishnumY(1, i) = X(i) * sin(10*pi*X(i)) + 2;
end
- 参数选择如表3所列。表3 一元函数优化参数选择
鱼群算法的主函数程序代码如下:
clc
clear all
close all
tic
figure(1);hold on
ezplot('x*sin(10*pi*x)+2',[-1,2]);
%% 参数设置
fishnum=50; % 生成50条人工鱼
MAXGEN=50; % 最多迭代次数
try_number=100; % 最多试探次数
visual=1; % 感知距离
delta=0.618; % 拥挤度因子
step=0.1; % 步长
%% 初始化鱼群
lb_ub=[-1,2,1];
X=AF_init(fishnum,lb_ub);
LBUB=[];
for i=1:size(lb_ub,1)LBUB=[LBUB;repmat(lb_ub(i,1:2),lb_ub(i,3),1)];
end
gen=1;
BestY=-1*ones(1,MAXGEN); %每步中最优的函数值
BestX=-1*ones(1,MAXGEN); %每步中最优的自变量
besty=-100; %最优函数值
Y=AF_foodconsistence(X);
while gen<=MAXGENfprintf(1,'%d\n',gen)for i=1:fishnum[Xi1,Yi1]=AF_swarm(X,i,visual,step,delta,try_number,LBUB,Y); %聚群行为[Xi2,Yi2]=AF_follow(X,i,visual,step,delta,try_number,LBUB,Y); %追尾行为if Yi1>Yi2X(:,i)=Xi1;Y(1,i)=Yi1;elseX(:,i)=Xi2;Y(1,i)=Yi2;endend[Ymax,index]=max(Y);figure(1);plot(X(1,index),Ymax,'.','color',[gen/MAXGEN,0,0])if Ymax>bestybesty=Ymax;bestx=X(:,index);BestY(gen)=Ymax;[BestX(:,gen)]=X(:,index);elseBestY(gen)=BestY(gen-1);[BestX(:,gen)]=BestX(:,gen-1);end gen=gen+1;
end
plot(bestx(1),besty,'ro','MarkerSize',100)
xlabel('x')
ylabel('y')
title('鱼群算法迭代过程中最优坐标移动')
figure
plot(1:MAXGEN,BestY)
xlabel('迭代次数')
ylabel('优化值')
title('鱼群算法迭代过程')
disp(['最优解X:',num2str(bestx,'%1.5f')])
disp(['最优解Y:',num2str(besty,'%1.5f')])
toc
四,运行结果
图3 50次鱼群算法迭代结果
图4 最优解的变化
Command Window中的运行结果:
最优解X:1.85028
最优解Y:3.85021
时间已过 1.188922 秒。
五,人工鱼群算法优点
- 具有克服局部极值、取得全局极值的能力。
- 算法中仅使用目标问题的函数值,对搜索空间有一定的自适应能力。
- 具有对初值与参数选择不敏感、鲁棒性强、简单易实现、收敛速度快和使用灵活等特点。可以解决经典方法不能求解的带有绝对值且不可导二元函数的极值问题。
六,算法改进的几个方向
- 视野的改进
由于视点、移动步长等参数的选择都是随机的,这会使得算法的收敛速度减慢,可以使用自适应步长的方式进行改进。 - 分段优化方法
算法在优化初期虽然具有较快的收敛速度,但在后期往往收敛很慢,或者无法达到要求的精度。因此,与其他算法相结合,实现优势互补,也是一种不错的解决方法。 - 混合优化方法
鱼群模式提供了一种解决问题的架构,其中可以应用传统的、相对成熟的计算方法,而面向对象的方法为其他计算方法与鱼群算法的有机融合提供了良好的基础。
七,参考文献
[1] 李晓磊. 一种新型的智能优化方法——人工鱼群算法[D]. 杭州: 浙江大学, 2003.
[2] 郁磊, 史峰, 王辉, 等. MATLAB智能算法30个案例分析(第2版)[M]. 北京: 北京航空航天大学出版社, 2015.
基于鱼群算法的函数寻优算法相关推荐
- 《MATLAB智能算法30个案例》:第17章 基于PSO工具箱的函数寻优算法
<MATLAB智能算法30个案例>:第17章 基于PSO工具箱的函数寻优算法 1. 前言 2. MATLAB 仿真示例 3. 小结 1. 前言 <MATLAB智能算法30个案例分析& ...
- 《MATLAB智能算法30个案例》:第8章 基于量子遗传算法的函数寻优算法
<MATLAB智能算法30个案例>:第8章 基于量子遗传算法的函数寻优算法 1. 前言 2. MATLAB 仿真示例 3. 小结 1. 前言 <MATLAB智能算法30个案例分析&g ...
- 基于蚁群算法的函数寻优算法
文章目录 一.理论基础 二.案例背景 1.问题描述 2.解题思路及步骤 三.MATLAB程序实现 1.清空环境变量 2.初始化参数 3.构建解空间和目标函数 4.迭代寻优 5.结果显示 6.绘图 四. ...
- 基于PSO工具箱的函数寻优算法
文章目录 一.理论基础 1.工具箱介绍 2.工具箱函数解释 二.案例背景 1.问题描述 2.工具箱设置 三.MATLAB程序实现 1.适应度函数 2.主函数 3.仿真结果 四.延伸阅读 五.参考文献 ...
- 基于量子遗传算法的函数寻优算法—MATLAB实现
文章目录 一.算法概述 二.算法讲解 2.1 量子比特编码 2.2 量子门更新 三.MATLAB实现 3.1 案例描述 3.2 算法实现 3.2.1算法流程: 3.2.2算法实现: 3.2.3MATL ...
- (转载)基于鱼群算法的函数寻优算法(matlab实现)
1 理论基础 1.1 人工鱼群算法概述 人工鱼群算法是李晓磊等人于2002年提出的一类基于动物行为的群体智能优化算法.该算法是通过模拟鱼类的觅食.聚群.追尾.随机等行为在搜索域中进行寻 ...
- 基于沙猫群优化算法的函数寻优算法
文章目录 一.理论基础 1.沙猫群优化算法 (1)初始化种群 (2)搜索猎物(探索) (3)攻击猎物(开发) (4)探索和开发 2.SCSO算法伪代码 二.仿真实验与结果分析 三.参考文献 一.理论基 ...
- 基于改进正弦余弦算法的函数寻优算法
文章目录 一.理论基础 1.基本正弦余弦算法 2.改进正弦余弦算法 (1)基于双曲正弦调节因子和动态余弦波权重的位置更新 (2)基于拉普拉斯分布和高斯分布的动态混合变异 二.算法流程图 三.仿真实验与 ...
- 基于蜉蝣优化算法的函数寻优算法
文章目录 一.理论基础 1.蜉蝣优化算法 (1)雄性蜉蝣的更新 (2)雌性蜉蝣的更新 (3)蜉蝣的交配过程 2.MA算法伪代码 二.仿真实验与结果分析 1.函数测试与数值分析 2.WSN三维覆盖优化 ...
- 基于豹子捕猎的函数寻优算法
引言 基于生物习性的优化算法成为近年来一种热门,如蚁群算法,蝙蝠算法.但是这些算法很难越出局部寻优(如果要越出局部寻优,就要在每一次迭代中采用聚类),但个体捕猎反而更好实现,因此,参考网上的鲸鱼算法, ...
最新文章
- 德鲁克管理31条金句
- js对象数组(JSON) 根据某个共同字段 分组
- 借“样式”巧用Word自带的多级项目符号!
- 解决ImportError: cannot import name ‘imread‘ from ‘scipy.misc‘
- POJ - 2411 Mondriaan's Dream(状压dp)
- (1) redis windows安装
- 计算机系在职研究生 网络班,在职研究生都有网络班吗?
- python Exception(异常处理)
- Linux 下 Oracle 内核参数优化
- 数据结构 【实验 串的基本操作】
- LeetCode 152. 乘积最大子序列(动态规划)
- AS3 JPEG Encoder应用:从Flash中保存图片
- 【车牌识别】基于模板匹配算法实现车牌识别matlab源码
- 【技术贴】删除空白文件夹,提示无法读源文件或磁盘的解决方法
- 【P44】DC-DC隔离模块,解决蓝牙共地干扰问题
- Life feelings--9--Mamba out 科比走了,给我们留下的那些惦念
- html5新年网页做给父母的,给父母的感谢信5篇模板
- python 处理Bus Hound 数据
- 5.3 卷积神经网络整体架构
- NOIP模拟赛套路技巧经验总结
热门文章
- 求助微软商店下载的Ubuntu打开后显示目标路径参数错误,进入路径强制打开显示0x80070005错误。各种方法都试验了
- python姿态识别_基于深度学习的人体姿态识别算法总结
- ASM1117-3.3V稳压芯片的典型电路图及分析
- Friends S01.01 Part A
- k3c最新官改非常稳定了_2020国庆过后玉米价格最新行情走势
- 201903股票投资与实践入门三:资金流向与K线入门
- 为什么需要交叉编译器
- 聚类分析 距离 matlab,matlab聚类分析_matlab
- 将时谐电磁场引入工程电磁场的意义_电磁场思考题
- 汇编语言转c语言的软件,Arm汇编转换器下载