求,人工鱼群算法优化PID参数(我有传递函数),要有代码,simulink图,有偿!!!
2条回答 默认 最新
- CSDN专家-Matlab_Fans 2021-05-21 23:01关注
1. 确定自变量即取值范围:PID的三个参数值,并确定取值范围。
2. 目标函数:定义输出跟踪的积分性能指标,如IAE值。
3. 按照下面的人工鱼群算法代码进行优化。
%sum(sin(x)./x) 极小值 clear all; close all; clc; Visual = 25; %人工鱼的感知距离 Step = 3; %人工鱼的移动最大步长 N = 30; %人工鱼的数量 dim=10; %人工鱼维度 Try_number = 50;%迭代的最大次数 delta=27; %拥挤度因子 %测试函数 f=@(x) sum(x.^2); ub=100;%边界上限 lb=-100;%边界下限 d = [];%存储50个状态下的目标函数值; Iteration = 1; % Max_iteration = 500;%迭代次数 %初始化人工鱼种群 x=lb+rand(N,dim).*(ub-lb); %计算10个初始状态下的适应度值; for i = 1:N fitness_fish(i) = f(x(i,:)); end [best_fitness,I] = min(fitness_fish); % 求出初始状态下的最优适应度; best_x = x(I,:); % 最优人工鱼; while Iteration<=Max_iteration for i = 1:N %% 聚群行为 nf_swarm=0; Xc=0; label_swarm =0; %群聚行为发生标志 %确定视野范围内的伙伴数目与中心位置 for j = 1:N if norm(x(j,:)-x(i,:))<Visual nf_swarm = nf_swarm+1; %统计在感知范围内的鱼数量 Xc = Xc+x(j,:); %将感知范围内的鱼进行累加 end end Xc=Xc-x(i,:); %需要去除本身;因为在 一开始计算时,i=j,把中心的鱼也进行了一次计算 nf_swarm=nf_swarm-1; Xc = Xc/nf_swarm; %此时Xc表示视野范围其他伙伴的中心位置; %判断中心位置是否拥挤 if (f(Xc)/nf_swarm < delta*f(x(i,:))) && (f(Xc)<f(x(i,:))) x_swarm=x(i,:)+rand*Step.*(Xc-x(i,:))./norm(Xc-x(i,:)); %边界处理 ub_flag=x_swarm>ub; lb_flag=x_swarm<lb; x_swarm=(x_swarm.*(~(ub_flag+lb_flag)))+ub.*ub_flag+lb.*lb_flag; x_swarm_fitness=f(x_swarm); else %觅食行为 label_prey =0; %判断觅食行为是否找到优于当前的状态 for j = 1:Try_number %随机搜索一个状态 x_prey_rand = x(i,:)+Visual.*(-1+2.*rand(1,dim)); ub_flag2=x_prey_rand>ub; lb_flag2=x_prey_rand<lb; x_prey_rand=(x_prey_rand.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2; %判断搜索到的状态是否比原来的好 if f(x(i,:))>f(x_prey_rand) x_swarm = x(i,:)+rand*Step.*(x_prey_rand-x(i,:))./norm(x_prey_rand-x(i,:)); ub_flag2=x_swarm>ub; lb_flag2=x_swarm<lb; x_swarm=(x_swarm.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2; x_swarm_fitness=f(x_swarm); label_prey =1; break; end end %随机行为 if label_prey==0 x_swarm = x(i,:)+Step*(-1+2*rand(1,dim)); ub_flag2=x_swarm>ub; lb_flag2=x_swarm<lb; x_swarm=(x_swarm.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2; x_swarm_fitness=f(x_swarm); end end %% 追尾行为 fitness_follow = inf; label_follow =0;%追尾行为发生标记 %搜索人工鱼Xi视野范围内的最高适应度个体Xj for j = 1:N if (norm(x(j,:)-x(i,:))<Visual) && (f(x(j,:))<fitness_follow) best_pos = x(j,:); fitness_follow = f(x(j,:)); end end %搜索人工鱼Xj视野范围内的伙伴数量 nf_follow=0; for j = 1:N if norm(x(j,:)-best_pos)<Visual nf_follow=nf_follow+1; end end nf_follow=nf_follow-1;%去掉他本身 %判断人工鱼Xj位置是否拥挤 if (fitness_follow/nf_follow)<delta*f(x(i,:)) && (fitness_follow<f(x(i,:))) x_follow = x(i,:)+rand*Step.*(best_pos-x(i,:))./norm(best_pos-x(i,:)); %边界判定 ub_flag2=x_follow>ub; lb_flag2=x_follow<lb; x_follow=(x_follow.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2; label_follow =1; x_follow_fitness=f(x_follow); else %觅食行为 label_prey =0; %判断觅食行为是否找到优于当前的状态 for j = 1:Try_number %随机搜索一个状态 x_prey_rand = x(i,:)+Visual.*(-1+2.*rand(1,dim)); ub_flag2=x_prey_rand>ub; lb_flag2=x_prey_rand<lb; x_prey_rand=(x_prey_rand.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2; %判断搜索到的状态是否比原来的好 if f(x(i,:))>f(x_prey_rand) x_follow = x(i,:)+rand*Step.*(x_prey_rand-x(i,:))./norm(x_prey_rand-x(i,:)); ub_flag2=x_follow>ub; lb_flag2=x_follow<lb; x_follow=(x_follow.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2; x_follow_fitness=f(x_follow); label_prey =1; break; end end %随机行为 if label_prey==0 x_follow = x(i,:)+Step*(-1+2*rand(1,dim)); ub_flag2=x_follow>ub; lb_flag2=x_follow<lb; x_follow=(x_follow.*(~(ub_flag2+lb_flag2)))+ub.*ub_flag2+lb.*lb_flag2; x_follow_fitness=f(x_follow); end end % 两种行为找最优 if x_follow_fitness<x_swarm_fitness x(i,:)=x_follow; else x(i,:)=x_swarm; end end %% 更新信息 for i = 1:N if (f(x(i,:))<best_fitness) best_fitness = f(x(i,:)); best_x = x(i,:); end end Convergence_curve(Iteration)=best_fitness; Iteration = Iteration+1; if mod(Iteration,50)==0 display(['迭代次数:',num2str(Iteration),'最优适应度:',num2str(best_fitness)]); display(['最优人工鱼:',num2str(best_x)]); end end figure('Position',[284 214 660 290]) subplot(1,2,1); x=-100:1:100; y=x; L=length(x); for i=1:L for j=1:L F(i,j)=x(i).^2+y(j).^2; end end surfc(x,y,F,'LineStyle','none'); title('Test function') xlabel('x_1'); ylabel('x_2'); zlabel(['sum','( x_1 , x_2 )']) grid off subplot(1,2,2); semilogy(Convergence_curve,'Color','b') title('Convergence curve') xlabel('Iteration'); ylabel('Best fitness'); axis tight grid off box on
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 2无用
悬赏问题
- ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
- ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
- ¥15 CSAPPattacklab
- ¥15 一直显示正在等待HID—ISP
- ¥15 Python turtle 画图
- ¥15 关于大棚监测的pcb板设计
- ¥15 stm32开发clion时遇到的编译问题
- ¥15 lna设计 源简并电感型共源放大器
- ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
- ¥15 Vue3地图和异步函数使用