一、简介
二、源代码
%主程序.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