梅樱落 2021-05-21 21:53 采纳率: 50%
浏览 109
已采纳

人工鱼群算法求大神讲解

求,人工鱼群算法优化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 
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥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地图和异步函数使用