人工鱼群算法源代码
- 格式:docx
- 大小:16.39 KB
- 文档页数:7
基于遗传算法(粒子群算法、人工鱼群算法等)的投影寻踪模型MATLAB源代码投影寻踪是一种处理多因素复杂问题的统计方法,其基本思路是将高维数据向低维空间进行投影,通过低维投影数据的散布结构来研究高维数据特征,可用于聚类、分类、综合评价、预测等。
投影寻踪模型最终可归结为一个非线性连续函数优化模型,可以采用遗传算法、粒子群算法、人工鱼群算法或人工免疫克隆优化算法等进行求解,得到最优的投影向量。
%% 第一步:仿真参数设置clcclearclose allload data1.txtD=data1。
%导入D矩阵[n,p]=size(D)。
K=300。
%迭代次数N=100。
%种群规模Pm=0.3。
%变异概率LB=-ones(1,p)。
%决策变量的下界UB=ones(1,p)。
%决策变量的上界Alpha=0.1。
%窗口半径系数,典型取值0.1b%% 调用遗传算法[BESTX,BESTY,ALLX,ALL Y]=GAUCP(K,N,Pm,LB,UB,D,Alpha)。
% GreenSim团队——专业级算法设计&代写程序% 欢迎访问GreenSim团队主页→%% 整理输出结果Best_a=(BESTX{K})'。
%方向向量d=zeros(n,p)。
Djmax=max(D)。
Djmin=min(D)。
for i=1:nd(i,:)=(D(i,:)-Djmin)./(Djmax-Djmin)。
endZ=zeros(n,1)。
for i=1:nZ(i)=abs(sum(Best_a.*d(i,:)))。
endZ=abs(Z)。
figure%投影散布图plot(abs(Z),'bd','LineWidth',1,'MarkerEdgeColor','k','MarkerFaceColor','b','MarkerSize',5)。
广西民族大学硕士学位论文人工鱼群算法及其应用姓名:聂黎明申请学位级别:硕士专业:计算机应用技术指导教师:周永权200904012人工鱼群算法及改进方法2.1引言人工鱼群算法(ArtificialFishSwarmAlgorithm,AFSA)‘22。
251是李晓磊等人于2002年在对动物群体智能行为研究的基础上提出的一种新型仿生优化算法,该算法根据“水域中鱼生存数目最多的地方一般就是本水域中富含营养物质最多的地方"这一特点来模仿鱼群的觅食行为而实现寻优。
人工鱼群算法主要利用鱼的三大基本行为:觅食、聚群和追尾行为,采用自上而下的寻优模式从构造个体的底层行为开始,通过鱼群中各个体的局部寻优,达到全局最优值在群体中突现出来的目的。
2.2人工鱼群算法2.2.1算法起源经过漫长的自然界的优胜劣汰,动物在进化过程中,形成了形形色色的觅食和生存方式,这些方式为人类解决问题带来了不少鼓舞和启发。
动物个体的智能一般不具备人类所具有的综合判断能力和复杂逻辑推理能力,是通过个体或群体的简单行为而突现出来的。
动物行为具有以下几个特点嘶1:(1)盲目性:不像传统的基于知识的智能系统,有着明确的目标,人工鱼群算法中单个个体的行为是独立的,与总目标之间往往没有直接的关系;(2)自治性:动物有其特有的某些行为,在不同的时刻和不同的环境中能够自主的选取某种行为,而无需外界的控制或指导;(3)突现性:总目标的完成是在个体行为的运动过程中突现出来的;(4)并行性:各个体的行为是实时的、并行进行的;(5)适应性:动物通过感觉器官来感知外界环境,并应激性的做出各种反应,从而影响环境,表现出与环境交互的能力。
2.2.2算法原理人工鱼群算法就是一种基于动物行为的自治体寻优模式,它是基于鱼类的活动特点构建起来的新型智能仿生算法。
通常人们可以观察到如下的鱼类行为:a)觅食行为:这是鱼趋向食物的一种活动,一般认为它是通过视觉或味觉来感知水中的食物量或食物浓度来选择行动方向的。
基本人工鱼群算法摘要人工鱼群算法(Artificial Fish-Swarm Algorithm,AFSA)是由李晓磊等在2002年提出的,源于对鱼群运动行为的研究,是一种新型的智能仿生优化算法。
它具有较强的鲁棒性、优良的分布式计算机制易于和其他方法结合等优点。
目前对该算法的研究、应用已经渗透到多个应用领域,并由解决一维静态优化问题发展到解决多维动态组合优化问题。
人工鱼群算法已经成为交叉学科中一个非常活跃的前沿性学科。
本文主要对鱼群算法进行了概述,引入鱼群模式的概念,然后给出了人工鱼的结构,接下来总结出了人工鱼的寻优原理,并对人工鱼群算法的寻优过程进行仿真,通过四个标准函数选取不同的拥挤度因子进行仿真实验,证实了利用人工鱼群算法进行全局寻优确实是有效的。
关键词:人工鱼群算法;拥挤度因子;寻优0 引言动物在进化过程中,经过漫长的优胜劣汰,形成了形形色色的觅食和生存方式,这些方式为人类解决生产生活中的问题带来了不少启发和灵感。
动物不具备复杂逻辑推理能力和综合判断等高级智能,但他们通过个体的简单行为和相互影响,实现了群体的生存和进化。
动物行为具有以下几个特点。
(1)适应性:动物通过感觉器官来感知外界环境,并应激性的做出各种反应,从而影响环境,表现出与环境交互的能力。
(2)自治性:在不同的时刻和不同的环境中能够自主的选取某种行为,而无需外界的控制或指导。
(3)盲目性:单个个体的行为是独立的,与总目标之间没有直接的关系。
(4)突现性:总目标的完成是在个体行为的运动过程中突现出来的。
(5)并行性:各个个体的行为是并行进行的。
人工鱼群算法是根据鱼类的活动特点提出的一种基于动物行为的自治体寻优模式。
1 鱼群模式描述1.1 鱼群模式的提出20世纪90年代以来,群智能(swarm intelligence,SI)的研究引起了众多学者的极大关注,并出现了蚁群优化、粒子群优化等一些著名的群智能方法。
集群是生物界中常见的一种现象,如昆虫、鸟类、鱼类、微生物乃至人类等等。
无约束连续函数优化的人工鱼群算法通用MATLAB源码此源码是对人工鱼群算法的一种实现,用于无约束连续函数的优化求解,对于含有约束的情况,可以先使用罚函数等方法,把问题处理成无约束的模型,再使用本源码进行求解。
function [BESTX,BESTY,ALLX,ALLY]=FSOUCP(K,N,V,Delta,L,LB,UB)%% Fish Swarm Optimization for Unconstrained Continuous Problem%% FSOUCP.m%% 无约束连续函数的人工鱼群优化算法%% 此函数实现人工鱼群算法,用于求解无约束连续函数最小化问题%% 对于最大化问题,请先将其加负号转化为最小化问题%% 输入参数列表% K 迭代次数% N 鱼群规模% V 人工鱼的感知范围% Delta 拥挤程度的判决门限,取值0~1之间% L 觅食行为的试探次数% LB 决策变量的下界,M×1的向量% UB 决策变量的上界,M×1的向量%% 输出参数列表% BESTX K×1细胞结构,每一个元素是M×1向量,记录每一代的最优人工鱼的状态% BESTY K×1矩阵,记录每一代的最优人工鱼的评价函数值% ALLX K×1细胞结构,每一个元素是M×N矩阵,记录每一代人工鱼的位置% ALLY K×N矩阵,记录每一代人工鱼的评价函数值%% 测试函数设置% 测试函数用单独的子函数编写好,在子函数FIT.m中修改要调用的测试函数名即可% 注意:决策变量的下界LB和上界UB,要与测试函数保持一致%% 参考设置%[BESTX,BESTY,ALLX,ALLY]=FSOUCP(50,30,0.5,0.3,20,LB,UB)%% 第一步:M=length(LB);%决策变量的个数%蚁群位置初始化X=zeros(M,N);for i=1:Mx=unifrnd(LB(i),UB(i),1,N);X(i,:)=x;end%输出变量初始化ALLX=cell(K,1);%细胞结构,每一个元素是M×N矩阵,记录每一代的个体ALLY=zeros(K,N);%K×N矩阵,记录每一代评价函数值BESTX=cell(K,1);%细胞结构,每一个元素是M×1向量,记录每一代的最优个体BESTY=zeros(K,1);%K×1矩阵,记录每一代的最优个体的评价函数值k=1;%迭代计数器初始化%% 第二步:迭代过程while k<=KNewX=zeros(M,N);NewY=zeros(1,N);for n=1:Nx=X(:,n);Xnb=AFneighbour(n,X,V);NN=size(Xnb,2);if NN==0xx=AFprey(x,V,L,LB,UB);elseif NN>=3xx=AFswarm(x,Xnb,N,Delta,V,L,LB,UB);elsexx=AFprey(x,V,L,LB,UB);endNewX(:,n)=xx;endfor n=1:NNewY(n)=FIT(NewX(:,n));endX=NewX;Y=NewY;ALLX{k}=X;ALLY(k,:)=Y;minY=min(Y);pos=find(Y==minY);BESTX{k}=X(:,pos(1));BESTY(k)=minY;disp(k);k=k+1;end%% 绘图BESTY2=BESTY;BESTX2=BESTX;for k=1:KTempY=BESTY(1:k);minTempY=min(TempY);posY=find(TempY==minTempY);BESTY2(k)=minTempY;BESTX2{k}=BESTX{posY(1)};endBESTY=BESTY2;BESTX=BESTX2;plot(BESTY,'-ko','MarkerEdgeColor','k','MarkerFaceColor','k','MarkerS ize',2)ylabel('函数值')xlabel('迭代次数')grid onfunction Xnb=AFneighbour(s,X,V)%% 找出人工鱼感知范围内的邻居%% 输入参数列表% s 当前人工鱼的编号% X M×N矩阵,人工鱼群% V 人工鱼的感知范围%% 输出参数列表% Xnb 第s个人工鱼的邻居%%[M,N]=size(X);xs=X(:,s);Xnb=zeros(M,0);for n=1:Nif n~=sxn=X(:,n);dx=xn-xs;maxdx=max(dx);mindx=min(dx);if (maxdx<V)&&(mindx>V)Xnb=[Xnb,xn];endendendfunction xx=AFprey(x,V,L,LB,UB)%% 人工鱼觅食行为的子函数%% 输入参数列表% x 觅食行为之前的状态% V 人工鱼的感知范围% L 觅食行为的试探次数% LB 决策变量的下界,M×1的向量% UB 决策变量的上界,M×1的向量%% 输出参数列表% xx 觅食行为之后的状态%%M=length(x);xx=zeros(M,1);counter=0;while 1for m=1:Mq=x(m)+unifrnd(-V,V,1,1);if q<LB(m)q=LB(m);endif q>UB(m)q=UB(m);endxx(m)=q;endcounter=counter+1;Fx=FIT(x);Fxx=FIT(xx);if Fxx<Fxreturnendif counter>=Lreturnendend。
人工鱼群算法源代码%人工鱼群算法;formatlong;Visual=2。
5;;Step=0。
3;;N=50;;Try_nu mber=50;;a1=—10;;b1=10;;a2=—10;;b2=10;;d=[];;h=1e-1;;Fri end_number=50;;k=0;;m=50;;X1=rand(N,1)*(b1—a1)+a1;;X2=rand (N,1)*(b2-a2)%人工鱼群算法format longVisual=2.5;Step=0.3;N=50;Try_number=50;a1=-10;b1=10;a2=—10;b2=10;d=[];h=1e—1;Friend_number=50;k=0;m=50;X1=rand(N,1)*(b1—a1)+a1;X2=rand(N,1)*(b2—a2)+a2;X=[X1 X2];%人工鱼数量for i=1:Nwwww=[X(i,1),X(i,2)];d(i)=maxf(wwww);end[w,i]=max(d);maxX=[X(i,1),X(i,2)];%初始公告板记录maxY=w;%初始公告板记录figurex=[];figurey=[];figurez=[];figurex(numel(figurex)+1)=maxX(1);figurey(numel(figurey)+1)=maxX(2);figurez(numel(figurez)+1)=maxY;kkk=0;while(k<m)for i=1:NXX=[X(i,1),X(i,2)];%人工鱼当前状态Xinf=0;Xc=0;for j=1:N %聚群行为开始XXX=[X(j,1),X(j,2)];if(norm(XXX—XX)<Visual)nf=nf+1;Xc=Xc+XXX;endendXc=Xc/nf;if((maxf(Xc))〉maxf(XX))XXnext1=XX+rand*Step*(Xc-XX)/norm(Xc—XX); if(XXnext1(1)〉b1)XXnext1(1)=b1;endif(XXnext1(1)〈a1)XXnext1(1)=a1;endif(XXnext1(2)>b2)XXnext1(2)=b2;endif(XXnext1(2)〈a2)XXnext1(2)=a2;endelseXXnext1=gmjprey(XX,Try_number,Visual,Step); if(XXnext1(1)〉b1) XXnext1(1)=b1;endif(XXnext1(1)〈a1)XXnext1(1)=a1;endif(XXnext1(2)〉b2)XXnext1(2)=b2;endif(XXnext1(2)<a2)XXnext1(2)=a2;endend%聚群行为结束%maxX=XX;%追尾行为开始%maxY=maxf(XX);for j=1:Friend_numberXXX=[X(j,1),X(j,2)];if(norm(XXX—XX)〈Visual & maxf(XXX)〉maxY) maxX=XXX;maxY=maxf(XXX);endendif((maxY)〉maxf(XX))XXnext2=XX+rand*Step*(maxX—XX)/norm(maxX-XX); if(XXnext2(1)> b1)XXnext2(1)=b1;endif(XXnext2(1)〈a1)XXnext2(1)=a1;endif(XXnext2(2)>b2)XXnext2(2)=b2;endif(XXnext2(2)〈a2)XXnext2(2)=a2;endelseXXnext2 =gmjprey(XX,Try_number,Visual,Step); if(XXnext2(1)>b1)XXnext2(1)=b1;endif(XXnext2(1)〈a1)XXnext2(1)=a1;endif(XXnext2(2)>b2)XXnext2(2)=b2;endif(XXnext2(2)<a2)XXnext2(2)=a2;endend%追尾行为结束if(maxf(XXnext1)>maxf(XXnext2))X(i,1)=XXnext1(1);X(i,2)=XXnext1(2);elseX(i,1)=XXnext2(1);X(i,2)=XXnext2(2);endend %一次迭代结束for i=1:NXXXX=[X(i,1),X(i,2)];if maxf(XXXX)>maxYmaxY=maxf(XXXX);maxX=XXXX;figurex(numel(figurex)+1)=maxX(1); figurey(numel(figurey)+1) =maxX(2); figurez(numel(figurez)+1)=maxY;endendk=k+1; %进入下一次迭代endmaxXmaxYplot3(figurex,figurey,figurez)function [XXnext] = gmjprey(XX,Try_number,Visual,Step) pp=0;for j=1:Try_numberXXj=XX+rand*Step*Visual;if(maxf(XX)〈maxf(XXj))XXnext=XX+rand*Step*(XXj-XX)/norm(XXj-XX); pp=1;breakendendif(~pp)XXnext=XX+rand*Step;endfunction y = maxf(QQ)y=(sin(QQ(1))/QQ(1))*(sin(QQ(2))/QQ(2));人工鱼群算法的仿真程序—matlab23tic;figure(1);holdon;ezplot('x*sin(10*pi*;%%参数设置;fis hnum=50;%生成50只人工鱼;MAXGEN=50;%最多迭代次数;try_number=100;%最多试探次数;visual=1;%感知距离;delta=0.618;%拥挤度因子;step=0。
人工鱼群算法代码以下是一个基于人工鱼群算法的Python代码示例:```pythonimport randomimport numpy as npclass ArtificialFishSwarm:def __init__(self, num_fish, num_iter, num_dim, num_try, visual_range, step_size, prey_fitness_func):self.num_fish = num_fish # 鱼群数量self.num_iter = num_iter # 迭代次数self.num_dim = num_dim # 解的维度self.num_try = num_try # 试探次数self.visual_range = visual_range # 可视范围self.step_size = step_size # 步长self.prey_fitness_func = prey_fitness_func # 适应度函数self.swarm = np.random.rand(num_fish, num_dim) # 初始化鱼群位置self.best_position = self.swarm[0] # 最佳位置self.best_fitness = self.prey_fitness_func(self.best_position) # 最佳适应度def search(self):for _ in range(self.num_iter):new_swarm = np.zeros_like(self.swarm)for i in range(self.num_fish):fish = self.swarm[i]new_fish = self.move(fish)new_swarm[i] = new_fishself.swarm = new_swarmdef move(self, fish):for _ in range(self.num_try):new_fish = np.zeros_like(fish)fitness = self.prey_fitness_func(fish)for i in range(self.num_dim):lower_bound = max(fish[i] - self.visual_range, 0) upper_bound = min(fish[i] + self.visual_range, 1) new_fish[i] = random.uniform(lower_bound, upper_bound)new_fitness = self.prey_fitness_func(new_fish)if new_fitness > fitness:fish = new_fishif new_fitness > self.best_fitness:self.best_fitness = new_fitnessself.best_position = new_fishreturn fish```上述代码定义了一个ArtificialFishSwarm类,其中search()方法用于执行人工鱼群算法搜索最优解,并通过move()方法进行单个鱼的移动。
人工鱼群算法源代码%人工鱼群算法;formatlong;Visual=2.5;;Step=0.3;;N=50;;Try_numb er=50;;a1=-10;;b1=10;;a2=-10;;b2=10;;d=[];;h=1e-1;;Friend_numb er=50;;k=0;;m=50;;X1=rand(N,1)*(b1-a1)+a1;;X2=rand(N,1)*(b2-a2)%人工鱼群算法format longVisual=2.5;Step=0.3;N=50;Try_number=50;a1=-10;b1=10;a2=-10;b2=10;d=[];h=1e-1;Friend_number=50;k=0;m=50;X1=rand(N,1)*(b1-a1)+a1;X2=rand(N,1)*(b2-a2)+a2;X=[X1 X2];%人工鱼数量for i=1:Nwwww=[X(i,1),X(i,2)];d(i)=maxf(wwww);end[w,i]=max(d);maxX=[X(i,1),X(i,2)];%初始公告板记录maxY=w;%初始公告板记录figurex=[];figurey=[];figurez=[];figurex(numel(figurex)+1)=maxX(1);figurey(numel(figurey)+1)=maxX(2);figurez(numel(figurez)+1)=maxY;kkk=0;while(k<m)for i=1:NXX=[X(i,1),X(i,2)];%人工鱼当前状态Xinf=0;Xc=0;for j=1:N %聚群行为开始XXX=[X(j,1),X(j,2)];if(norm(XXX-XX)<Visual)nf=nf+1;Xc=Xc+XXX;endendXc=Xc/nf;if((maxf(Xc))>maxf(XX))XXnext1=XX+rand*Step*(Xc-XX)/norm(Xc-XX); if(XXnext1(1)>b1) XXnext1(1)=b1;endif(XXnext1(1)<a1)XXnext1(1)=a1;endif(XXnext1(2)>b2)XXnext1(2)=b2;endif(XXnext1(2)<a2)XXnext1(2)=a2;elseXXnext1=gmjprey(XX,Try_number,Visual,Step); if(XXnext1(1)>b1) XXnext1(1)=b1;endif(XXnext1(1)<a1)XXnext1(1)=a1;endif(XXnext1(2)>b2)XXnext1(2)=b2;endif(XXnext1(2)<a2)XXnext1(2)=a2;endend%聚群行为结束%maxX=XX;%追尾行为开始%maxY=maxf(XX);for j=1:Friend_numberXXX=[X(j,1),X(j,2)];if(norm(XXX-XX)<Visual & maxf(XXX)>maxY) maxX=XXX;maxY=maxf(XXX);endendif((maxY)>maxf(XX))XXnext2=XX+rand*Step*(maxX-XX)/norm(maxX-XX); if(XXnext2(1)>b1) XXnext2(1)=b1;endif(XXnext2(1)<a1)XXnext2(1)=a1;endif(XXnext2(2)>b2)XXnext2(2)=b2;if(XXnext2(2)<a2)XXnext2(2)=a2;endelseXXnext2 =gmjprey(XX,Try_number,Visual,Step); if(XXnext2(1)>b1) XXnext2(1)=b1;endif(XXnext2(1)<a1)XXnext2(1)=a1;endif(XXnext2(2)>b2)XXnext2(2)=b2;endif(XXnext2(2)<a2)XXnext2(2)=a2;endend%追尾行为结束if(maxf(XXnext1)>maxf(XXnext2))X(i,1)=XXnext1(1);X(i,2)=XXnext1(2);elseX(i,1)=XXnext2(1);X(i,2)=XXnext2(2);endend %一次迭代结束for i=1:NXXXX=[X(i,1),X(i,2)];if maxf(XXXX)>maxYmaxY=maxf(XXXX);maxX=XXXX;figurex(numel(figurex)+1)=maxX(1); figurey(numel(figurey)+1)=maxX (2); figurez(numel(figurez)+1)=maxY;endendk=k+1; %进入下一次迭代endmaxXmaxYplot3(figurex,figurey,figurez)function [XXnext] = gmjprey(XX,Try_number,Visual,Step) pp=0;for j=1:Try_numberXXj=XX+rand*Step*Visual;if(maxf(XX)<maxf(XXj))XXnext=XX+rand*Step*(XXj-XX)/norm(XXj-XX); pp=1;breakendendif(~pp)XXnext=XX+rand*Step;endfunction y = maxf(QQ)y=(sin(QQ(1))/QQ(1))*(sin(QQ(2))/QQ(2));人工鱼群算法的仿真程序-matlab23tic;figure(1);holdon;ezplot('x*sin(10*pi*;%%参数设置;fishnum=5 0;%生成50只人工鱼;MAXGEN=50;%最多迭代次数;try_number=100;%最多试探次数;visual=1;%感知距离;delta=0.618;%拥挤度因子;step=0.1;%步长;%%初始化鱼群;lb_ub=[-1,ticfigure(1);hold onezplot('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=[];fori=1:size(lb_ub,1)LBUB=[LBUB;repmat(lb_ub(i,1:2),lb_ub(i,3),1)];endgen=1;BestY=-1*ones(1,MAXGEN); %每步中最优的函数值BestX=-1*ones(1,MAXGEN); %每步中最优的自变量besty=-100; %最优函数值Y=AF_foodconsistence(X);while gen<=MAXGENfprintf(1,'%d\n',gen)fori=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])ifYmax>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;endplot(bestx(1),besty,'ro','MarkerSize',100) xlabel('x')ylabel('y')title('鱼群算法迭代过程中最优坐标移动')%% 优化过程图figureplot(1:MAXGEN,BestY)xlabel('迭代次数')ylabel('优化值')title('鱼群算法迭代过程')disp(['最优解X:',num2str(bestx,'%1.5f')]) disp(['最优解Y:',num2 str(besty,'%1.5f')]) toc。