【优化求解】基于matlab改进的人工鱼群算法求解高维优化问题【含Matlab源码 433期】

387 阅读2分钟

一、简介

在这里插入图片描述
在这里插入图片描述

二、源代码

%主程序.m,直接运行主程序就可以得到一次结果,b_value是收敛图线(公告最优值).
%x,y;xa,ya分别代表初始鱼群分布和最终鱼群分布,best_num是当前解域最有人工鱼群数目.
tic;%主程序开始
global afs;%定义人工鱼
global af_total;%初始时的人工鱼总数
global afs_c;%人工鱼的状态
global afs_value;%实际当前最优解
global b_c;%公告牌最优人工鱼的状态
global b_value;%公告牌最优人工鱼处的食物浓度
global iterate_times;%定义公告牌更新次数
global passed_times;%公告牌实际更新次数
global best_af;%
global num;%目标函数调用次数
global N;%根据需求修改N,就可修改寻优函数维数
global fx;%记录最优解
global bafs;%保存每次更新公告牌后的最优人工鱼
num=0;
N=50;
afs=[];
bafs=[];
afs_c={};
af_total=20;
afs_value=0;
b_value=Inf;
passed_times=0;    
iterate_times=100;
tic;
fprintf('人工鱼的初始位置:\n');
for i=1:1:af_total      %将所有人工鱼初始化,并将所有人工鱼的初始位置保存
    fprintf('Number:%d\n',i);
    afs{i}=af();
    afs_c{i}=get(afs{i},'c');
    X=afs_c{i};
    fprintf('x=%f\n',X);
end

for j=1:1:iterate_times
    passed_times=passed_times+1;
    %公告牌初始化
    if passed_times>1
        b_value(passed_times)=b_value(passed_times-1);
    else
        b_c=zeros(1,N);
        b_value(1)=Inf;
    end
    %best_af是当前状态最优人工鱼,由它判断当前解域,best_num是当前解域中鱼的数目
    best_af=af();
    best_c=zeros(1,N);
    best_num=0+eps;
    for i=1:1:af_total   
        afs{i}=evaluate(afs{i});
        if foodconsistence(afs{i})<foodconsistence(best_af)%更新当前最优人工鱼
            best_af=afs{i};
        end
        afs_c{i}=get(afs{i},'c');
        if foodconsistence(afs{i})<b_value(passed_times)%当前有人工鱼优于公告牌人工鱼,公告牌更新
            b_c=get(afs{i},'c');
            b_value(passed_times)=foodconsistence(afs{i});
        end
    end
    
    for i=1:1:af_total  %找到最优解域中的合适点
        if dstc(afs{i},best_af)<0.3%注意!!!!根据不同寻优问题需要改变!!!
            best_c=best_c+get(afs{i},'c');
            best_num=best_num+1;
        end
    end
    best_c=best_c/best_num;
    afs_value(passed_times)=foo(best_c);%解域中合适点处的浓度
    bafs.c{passed_times}=best_c;
    bafs.value(passed_times)=afs_value(passed_times);
    fprintf('\n迭代次数:%f\n',passed_times);
    fprintf('\n当前最优解:\n');
    fprintf('X:%f\n',best_c);
    fprintf('\n此处食物浓度:%f\n',afs_value(passed_times));
    for i=1:1:af_total%保存当前所有人工鱼的状态
        afs_c{i}=get(afs{i},'c');
        xc{i}=afs_c{i};
    end
end
%foo.m欲寻优的函数设置
function [out]=foo(x)
%此处为欲寻优函数的定义,它是一个怎样的函数
global num;
global N;%寻优函数的维数
num=num+1;
N=length(x);

out=0;
sum=0;
%%%%%%%%%%%%%%fitness1%%%%%%%%%%%%可以找到最优解
%for i=1:N
%    sum=sum+x(i)*x(i);
%end
%out=sum;
%%%%%%%%%%%%fitness2%%%%%%%%%%%%可以找到最优解
%f1=0;
%f2=1;
%for i=1:N
%    f1=f1+abs(x(i));
%    f2=f2*abs(x(i));
%end
%out=f1+f2;
%%%%%%%%%%%%fitness3%%%%%%%%%可以找到最优解
%f1=0;
%f2=0;
%for i=1:N
%    for j=1:i
%        f1=f1+x(i);
%    end
%    f2=f2+f1^2;
%end
%out=f2;
%%%%%%%fitness4%%%%%%有误差
%out=max(abs(x));
%%%%%%%%fitness5%%%%%%%%有误差
%for i=1:N-1
%    sum=sum+100*(x(i+1)-x(i)^2)^2+(1-x(i))^2;
%end
%out=sum;
%%%%%%fitness7%%%%%%%%%寻优效果很好,存在一定小的误差
for i=1:N
    sum=sum+i*x(i)^4;
end

三、运行结果

在这里插入图片描述

四、备注

版本:2014a