人工鱼群算法求大神讲解

求,人工鱼群算法优化PID参数(我有传递函数),要有代码,simulink图,有偿!!!

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 

 

请问楼主怎么解决的呀,算法怎么和simulink仿真模型联合呢