基于鱼群算法的函数寻优算法(matlab实现)

2023-10-28 07:10

本文主要是介绍基于鱼群算法的函数寻优算法(matlab实现),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 理论基础

 

1.1 人工鱼群算法概述

        人工鱼群算法是李晓磊等人于2002年提出的一类基于动物行为的群体智能优化算法。该算法是通过模拟鱼类的觅食、聚群、追尾、随机等行为在搜索域中进行寻优,是集群体智能思想的一个具体应用。生物的视觉是极其复杂的,它能快速感知大量的空间事物,这是任何仪器和程序都难以比拟的,为了实施的简便和有效,在鱼群模式中应用了如下方法实现虚拟人工鱼的视觉:

图1 人工鱼的视野和移动步长 

如图1所示,一条虚拟人工鱼实体的当前位置为X,它的视野范围为Visual,位置Xv为其在某时刻的视点所在的位置,如果该位置的食物浓度高于当前位置,则考虑向该位置方向前进一步,即到
达位置Xnext;如果位置Xv不比当前位置食物浓度更高,则继续巡视视野内的其他位置。巡视的次数
越多,则对视野内的状态了解越全面,从而对周围的环境有一个全方面立体的认知,这有助于做出相应的判断和决策。当然,对于状态多或无限状态的环境也不必全部遍历,允许一定的不确定性对于摆脱局部最优,从而寻找全局最优是有帮助的。

1.2 人工鱼群算法的主要行为

        鱼类通常具有如下行为:
        觅食行为:这是生物的一种最基本的行为,也就是趋向食物的一种活动;一般可以认为这种行为是通过视觉或味觉感知水中的食物量或浓度来选择趋向的。因此,以上所述的视觉概念可以应用于该行为。
        聚群行为:这是鱼类较常见的一种现象,大量或少量的鱼都能聚集成群,这是它们在进化过程中形成的一种生存方式,可以进行集体觅食和躲避敌害。
        追尾行为:当某一条鱼或几条鱼发现食物时,它们附近的鱼会尾随其后快速游过来,进而导致更远处的鱼也尾随过来。
        随机行为:鱼在水中悠闲地自由游动,基本上是随机的,其实它们也是为了更大范围地寻觅食物或同伴。
        以上是鱼的几个典型行为,这些行为在不同时刻会相互转换,而这种转换通常是鱼通过对环境的感知来自主实现的,这些行为与鱼的觅食和生存都有着密切的关系,并且与优化问题的解决也有着密切的关系。
        行为评价是用来模拟鱼能够自主行为的一种方式。在解决优化问题中,可以选用两种简单的评价方式:一种是选择最优行为执行,也就是在当前状态下,哪一种行为向优的方向前进最大,就选择哪种行为;另一种是选择较优行为前进,也就是任选一种行为,只要能向优的方向前进即可。

1.3 问题的解决

        问题的解决是通过自治体在自主的活动过程中以某种形式表现出来的。在寻优过程中,通常会有两种方式表现出来:一种形式是通过人工鱼最终的分布情况来确定最优解的分布,通常随着寻优过程的进展,人工鱼往往会聚集在极值点的周围,而且全局最优的极值点周围通常能聚集较多的人工鱼;另一种形式是在人工鱼的个体状态之中表现出来的,即在寻优的过程中,跟踪记录最优个体的状态,就类似于遗传算法采用的方式。
        鱼群模式不同于传统的问题解决方法,它提出了一种新的优化模式——人工鱼群算法,这一模式具备分布处理、参数和初值的鲁棒性强等能力。

2 案例背景

2.1 问题描述

        案例1:
        一元函数的优化实例:

 

        案例2:
        二元函数的优化实例:

        这两个函数的图像如图2和图3所示:

2.2 解题思路及步骤

        1.变量及函数定义
        人工鱼群算法中用到的变量参数如表1所列。
表1 变量参数

         人工鱼群算法中用到的函数如表2所列。

表2 主要函数

        2.算法流程
        人工鱼群算法流程图如图4所示。

图4 人工鱼群算法流程图

        3.人工鱼群算法实现
        人工鱼群算法是一种高效的智能优化算法,主要的鱼群行为有鱼群初始化、觅食行为、聚群行为、追尾行为和随机行为。
        (1)鱼群初始化
        鱼群中的每条人工鱼均为一组实数,是在给定范围内产生的随机数组。例如,鱼群大小为N,有两个待优化的参数x,y,范围分别为[x1,x2]和[y1,y2],则要产生一个2行N列的初始鱼群,每列表示一条人工鱼的两个参数。
        (2)觅食行为
        设人工鱼当前状态为Xi,在其感知范围内随机选择一个状态Xj,如果在求极大问题中,Yi<Yj(或在求极小问题中,Yi>Yj,因极大和极小问题可以互相转换,所以以下均讨论极大问题),则向该方向前进一步;反之,再重新随机选择状态X;,判断是否满足前进条件。这样反复尝试try_number次后,如果仍不满足前进条件,则随机移动一步。觅食过程如图5所示。

图5 觅食行为过程 

        (3)聚群行为
        设人工鱼当前状态为Xi,探索当前领域内(即di,j<Visual)的伙伴数目nf及中心位置Xc,如果Yc/nf>δYi(δ为拥挤度)表明伙伴中心有较多的食物并且不太拥挤,则朝伙伴的中心位置方向前进一步;否则执行觅食行为。聚群过程如图6所示。

图6 聚群行为过程

        (4)追尾行为
        设人工鱼当前状态为Xi,探索当前领域内(即di,j<Visual)的伙伴数目nf及伙伴中Yj为最大的伙伴Xj,如果Yj/nf > δYi,表明伙伴Xj的状态具有较高的食物浓度并且其周围不太拥挤,则朝伙伴Xj的方向前进一步;否则执行觅食行为。追尾过程如图7所示。

图7 尾行为过程

        (5)随机行为
        随机行为的实现较简单,就是在视野中随机选择一个状态,然后向该方向移动,其实,它是 觅食行为的一个缺省行为,即Xi的下一个位置Xi|next为

3MATLAB程序实现

3.1 鱼群初始化函数

        创建初始人工鱼群,函数名为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

3.2 觅食行为

        觅食行为函数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);

3.3 聚群行为

        聚群行为函数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=AF_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为
function D=AF_dist(Xi,X)
%计算第i条鱼与所有鱼的位置,包括本身。
%输入:
%Xi   第i条鱼的当前位置  
%X    所有鱼的当前位置
% 输出:
%D    第i条鱼与所有鱼的距离
col=size(X,2);
D=zeros(1,col);
for j=1:colD(j)=norm(Xi-X(:,j));
end

3.4追尾行为

        追尾行为函数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=AF_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*Yi;Xnext=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

3.5 目标函数

        目标函数(即食物浓度函数)是用来求人工鱼当前位置的食物浓度,其实就是求给定变量值的函数值,例如计算以下函数的最大值:

        这时的食物浓度函数如下:

function [Y]=AF_foodconsistence(X)
fishnum=size(X,2);
for i=1:fishnumY(1,i)=X(i)*sin(10*pi*X(i))+2;
end
        其他的问题类似,只要修改对应的函数即可。

3.6 一元函数优化

        参数选择如表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);endgen=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.4f')])
disp(['最优解Y:',num2str(besty,'%1.4f')])
toc
        鱼群算法的运行结果如下,图8为鱼群算法迭代50次的最优人工鱼分布情况,图9为目标值的优化过程。

3.7 二元函数优化

        参数选择如表4所列。
表4 二元函数优化参数选择

        鱼群算法主函数程序代码如下:  

clc
clear all
close all
tic
figure(1);hold on
%% 参数设置
fishnum=100; %生成100只人工鱼
MAXGEN=50; %最多迭代次数
try_number=100;%最多试探次数
visual=1; %感知距离
delta=0.618; %拥挤度因子
step=0.1; %步长
%% 初始化鱼群
lb_ub=[-10,10,2;];
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(2,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),X(2,index),'.','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);endgen=gen+1;
end
plot(bestx(1),bestx(2),'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
        鱼群算法的运行结果如下,图10为鱼群算法迭代50次的最优人工鱼分布情况,图11为目标值的优化过程。

命令行 中的运行结果:

4 延伸阅读

4.1 人工鱼群算法优点

        人工鱼群算法具有以下优点:
        (1)具有克服局部极值、取得全局极值的能力。
        (2)算法中仅使用目标问题的函数值,对搜索空间有一定自适应能力。
        (3)具有对初值与参数选择不敏感、鲁棒性强、简单易实现、收敛速度快和使用灵活等特点。可以解决经典方法不能求解的带有绝对值且不可导二元函数的极值问题。

4.2 算法改进的几个方向

        1.视野的改进
        在鱼群模式所讨论的视野概念中,由于视点的选择是随机的,移动的步长也是随机的,虽然这种做法能在一定程度上扩大寻优的范围,尽可能保证寻优的全局性,但会使得算法的收敛速度减慢,有大量的计算时间浪费在随机的移动之中,可以使用自适应步长的方式进行改进。
        2.分段优化方法
        算法在优化过程初期虽然具有较快的收敛品质,但在后期却往往收敛较慢,或者无法达到要求的精度,因此,与其他算法相结合,在合适的时候与其他算法互相切换,实现各算法之间的优缺点互补,也是一种解决问题的常用方法。
        3.混合优化方法
        鱼群模式提供了一种解决问题的架构,其中可以应用传统的、相对成熟的计算方法,而面向对象的方法为其他计算方法与鱼群算法的有机融合提供了良好的基础。例如,如果问题的模型比较熟知,并且目标函数的非线性程度不是非常严重,则可以在觅食行为中使用单纯行法等传统方法来代替在视野中的随机搜索方法,这样,在提高收敛速度的同时,能适当提高收敛的精度,并且还能在一定程度上克服局部极值的问题。

这篇关于基于鱼群算法的函数寻优算法(matlab实现)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/291555

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time