学习内容:

利用鱼群算法实现最值问题的求解(一元或多元均可解决)


学习产出:

MATLAB代码如下,有详细注释,可以自己动手试一试

鱼群算法主函数

clc;clear all;close all;
%鱼群算法主函数
%利用该算法求最值%画出求解方程的图像
figure(1)
[x1,x2] = meshgrid(-5:0.1:5);
f = x1.*exp(-x1.^2 - x2.^2);
surf(x1,x2,f)
hold onfishnum = 50;                              %鱼群的数量
MAXGEN = 50;                               %最大迭代次数
try_number = 100;                          %最多觅食次数
visual = 2.5;                                %视野范围
delta = 0.618;                             %拥挤度
step = 0.3;                                %移动步长
lb_ub = [-10,10,2];                          %限制范参数的范围以及个数
X = AF_init(fishnum,lb_ub);                %初始化鱼群
LBUB = [];
for i = 1:size(lb_ub,1)LBUB = [LBUB;repmat(lb_ub(i,1:2),lb_ub(i,3),1)];
end
gen = 1;
k = lb_ub(3);
BestY = -1*ones(1,MAXGEN);
BestX = -1*ones(k,MAXGEN);
besty = -100;
Y = AF_foodconsistence(X);                %计算食物浓度
%初始化结束
%% 开始迭代
while gen <= MAXGEN%对每一条鱼开始觅食、追尾for i = 1:fishnum[Xi1,Yi1] = AF_swarm(X,i,visual,step,delta,try_number,LBUB,Y);[Xi2,Yi2] = AF_follow(X,i,visual,step,delta,try_number,LBUB,Y);if Yi1 > Yi2X(:,i) = Xi1;Y(1,i) = Yi1;elseX(:,i) = Xi2;Y(1,i) = Yi1;endend[Ymax,index] = max(Y);                   %找到最优的一条人工鱼%画出过程中选择的点以及对应的值figure(1)plot3(X(1,index),X(2,index),Ymax,'.','color',[gen/MAXGEN,0,0]);  if Ymax > besty                          %进行更新操作besty = Ymax;bestx = X(:,index);BestY(gen) = Ymax;[BestX(:,gen)] = X(:,index);elseBestY(gen) = BestY(gen - 1);[BestX(:,gen)] = BestX(:,gen - 1);endgen = gen + 1;                          %迭代计数
end
%% 绘图
plot3(bestx(1),bestx(2),besty,'ro','MarkerSize',50);
xlabel('x')
ylabel('y')
title('鱼群算法中最优坐标移动示意图')
%迭代过程优化值的变化
figure
plot(1:MAXGEN,BestY)
xlabel('迭代次数')
ylabel('优化值')
title('鱼群算法迭代过程')
%命令创空输出结果
disp(['最优解X:',num2str(bestx')])
disp(['最优解Y:',num2str(besty)])

鱼群初始化函数

function X = AF_init(Nfish,lb_ub)
%%本函数用于初始化鱼群
%输入:
%Nfish       鱼群的数量
%lb_ub       输入的范围以及个数
%输出:
%X           初始化的鱼群
row = size(lb_ub,1);
X = [];
for i = 1:rowlb = lb_ub(i,1);    %下限ub = lb_ub(i,2);    %上限nr = lb_ub(i,3);    %参数的个数for j = 1:nrX(end + 1,:) = lb + (ub - lb)*rand(1,Nfish);end
end
end

鱼群聚群函数

function [Xnext,Ynext] = AF_swarm(X,i,visual,step,delta,try_number,LBUB,lastY)
%聚群行为函数
%输入:
%X      所有人工鱼的位置
%i      当前人工鱼的序号
%visual 感知的范围
%step   最大移动步长
%delta  拥挤度
%try_number  最大尝试次数
%LBUB   各个数的上下限
%lastY  上次各个人工鱼的位置食物浓度
%输出:
%Xnext  下一个位置
%Ynext  下一个位置食物的浓度
Xi = X(:,i);                         %选择第i个人工鱼
D = AF_dist(Xi,X);                   %求解这个人工鱼与其他鱼群的距离
index = find(D > 0 & D < visual);    %找到视野之内的鱼群
%% 开始循环
nf = length(index);
if nf > 0for j = 1:size(X,1)Xc(j,1) = mean(X(j,index));  %求得视野范围距离为平局值的点endYc = AF_foodconsistence(Xc);Yi = lastY(i);if Yc/nf > delta*YiXnext = Xi + rand*step*(Xc - Xi)/norm(Xc - Xi);for i = 1:length(Xnext)     %将得到的值限定在范围内if Xnext(i) > LBUB(i,2)Xnext(i) = LBUB(i,2);endif Xnext(i) < LBUB(i,1)Xnext(i) = LBUB(i,1);endendYnext = AF_foodconsistence(Xnext);  %更新食物浓度else[Xnext,Ynext] = AF_prey(Xi,i,visual,step,try_number,LBUB,lastY); %觅食end
else[Xnext,Ynext] = AF_prey(Xi,i,visual,step,try_number,LBUB,lastY);     %觅食
end
end

鱼群追尾函数

function [Xnext,Ynext] = AF_follow(X,i,visual,step,delta,try_number,LBUB,lastY)
%追尾行为函数
%输入:
%X    当前所有人工鱼的位置
%i    当前人工鱼的序号
%visual 感知范围
%step   最大移动步长
%delta  拥挤度
%try_number  最多尝试次数
%LBUB   各个鱼移动限制范围
%lastY  上次各个人工鱼群位置的食物浓度
%输出:
%Xnext  人工鱼下个位置
%Ynext  人工鱼下个位置的食物浓度
Xi = X(:,i);                      %选择第i个人工鱼
D = AF_dist(Xi,X);                %算出第i个人工鱼距离其他鱼群的距离
index = find(D > 0 & D < visual); %找到符合视野范围内的鱼群
nf = length(index);
if nf > 0XX = X(:,index);YY = lastY(index);[Ymax,Max_index] = max(YY);   %找到在视野范围内拥有最大食物浓度的人工鱼  Xmax = XX(:,Max_index);Yi = lastY(i);                %第i条鱼上次的食物浓度if Ymax/nf > delta*Yi;Xnext = Xi + rand*step*(Xmax - Xi)/norm(Xmax - Xi);for i = 1:length(Xnext)   %将鱼位置限定在规定的范围内if Xnext(i) > LBUB(i,2)Xnext(i) = LBUB(i,2);endif Xnext(i) < LBUB(i,1)Xnext(i) = LBUB(i,1);endendYnext = AF_foodconsistence(Xnext); %计算移动后的食物浓度else[Xnext,Ynext] = AF_prey(X(:,i),i,visual,step,try_number,LBUB,lastY); %觅食end
else[Xnext,Ynext] = AF_prey(X(:,i),i,visual,step,try_number,LBUB,lastY);     %觅食
end
end

计算食物浓度函数

function Y = AF_foodconsistence(X)
%计算人工鱼当前位置的食物浓度
%输入:
%X       所有的人工鱼
%Y       每条人工鱼当时未知的额食物浓度
%% 单变量参数输入
% fishnum = size(X,2);
% for i = 1:fishnum
%     Y(1,i) = X(i)*sin(10*pi*X(i)) + 2;
% end%% 多变量输入
fishnum = size(X,2);
for i = 1:fishnumY(1,i) = X(1,i).*exp(-X(1,i).^2 - X(2,i).^2);
end

觅食函数

function [Xnext,Ynext] = AF_prey(Xi,ii,visual,step,try_number,LBUB,lastY)
%%该函数用于觅食行为
%输入:
%Xi      当前鱼的位置
%ii      当前鱼的序号
%visual  感知范围
%step    最大移动步长
%try_number  最大尝试次数
%LBUB    各个数的范围
%lastY   上次人工鱼的食物浓度
%输出:
%Xnext   人工鱼的下一个位置
%Ynext   人工鱼下一个位置的食物浓度
Xnext = [];
Yi = lastY(ii);
for i = 1:try_numberXj = Xi + (2*rand(length(Xi),1) - 1)*visual;Yj = AF_foodconsistence(Xj);if Yi < YjXnext = Xi + rand*step*(Xj - Xi)/norm(Xj - Xi);for i = 1:length(Xnext)           %限定下个点取值在规定范围内if Xnext(i) > LBUB(i,2)Xnext(i) = LBUB(i,2);endif Xnext(i) < LBUB(i,1)Xnext(i) = LBUB(i,1);endendXi = Xnext;                      %更新位置break;end
end
%如果Xnext为空,便采取随机行为
if isempty(Xnext)Xj = Xi + (2*rand(length(Xi),1) - 1) *visual;Xnext = Xj;for i = 1:length(Xnext)            %限定取值在范围内if Xnext(i) > LBUB(i,2)Xnext(i) = LBUB(i,2);endif Xnext(i) < LBUB(i,1)Xnext(i) = LBUB(i,1);endend
end
%计算出该点的的食物浓度
Ynext = AF_foodconsistence(Xnext);
end

需要注意的是,在主函数中,如果改为一元函数,并对其进行画图,应该使用plot,将plot3等用于三维画图的函数进行合理修改,同时也要更改绘图函数输入参数。

利用鱼群算法求解最值问题(一元或多元)MATLAB编程实现相关推荐

  1. 如何用计算机求特征值特征向量,利用QR算法求解矩阵的特征值和特征向量

    利用QR算法求解矩阵的特征值和特征向量 为了求解一般矩阵(不是那种幼稚到shi的2 x 2矩阵)的特征值. 根据定义的话,很可能需要求解高阶方程... 这明显是个坑...高阶方程你肿么破... 折腾了 ...

  2. 利用 L-BFGS 算法求解基追踪问题_matlab

    实例:利用 L-BFGS 算法求解基追踪问题_matlab 构建基追踪问题 L-BFGS 求解x 正则化系数 α\alphaα 为 555 正则化系数 α\alphaα 为 101010 结果可视化 ...

  3. 利用QR算法求解矩阵的特征值和特征向量

    利用QR算法求解矩阵的特征值和特征向量 为了求解一般矩阵(不是那种幼稚到shi的2 x 2矩阵)的特征值. 根据定义的话,很可能需要求解高阶方程... 这明显是个坑...高阶方程你肿么破... 折腾了 ...

  4. matlab实战系列之人工鱼群算法求解TSP问题原理解析(下篇源码解析)

    从算法的名字中可以看出该算法是群体智能优化算法中的一种,人工鱼群算法通过模拟鱼群的觅食.聚群.追尾.随机等行为在搜索域中进行寻优. 人工鱼群算法有三个比较重要的概念:视野范围.k-距离邻域.多条鱼的中 ...

  5. ML之PLiR之LARS:利用LARS算法求解ElasticNet回归类型(包括类别编码+属性重要程度排序)问题(实数值年龄预测)

    ML之PLiR之LARS:利用LARS算法求解ElasticNet回归类型(包括类别编码+属性重要程度排序)问题(实数值年龄预测) 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 x ...

  6. ML之PLiR之Glmnet:利用Glmnet算法求解ElasticNet回归类型问题(实数值评分预测)

    ML之PLiR之Glmnet算法:利用Glmnet算法求解ElasticNet回归类型问题(实数值评分预测) 目录 输出结果 1.Glmnet算法 实现代码 输出结果 0 2 1 2 2 2 3 3 ...

  7. ML之PLiR之LARS:利用LARS算法求解ElasticNet回归类型问题(实数值评分预测)

    ML之PLiR之LARS:利用LARS算法求解ElasticNet回归类型问题(实数值评分预测) 目录 设计思路 输出结果 1.LARS 2.10-fold cross validation 实现代码 ...

  8. 【AFSA TSP】基于matlab人工鱼群算法求解旅行商问题【含Matlab源码 422期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[TSP]基于matlab人工鱼群算法求解旅行商问题[含Matlab源码 422期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  9. 【优化布局】基于matlab免疫算法求解充电站最优布局【含Matlab源码 2539期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[生产调度]基于matlab免疫算法求解生产调度零等待问题[含Matlab源码 1178期] 点击上面蓝色字体,直接付费下载,即可. 获取 ...

  10. 【单目标优化求解】基于matlab增强型黑猩猩优化器算法求解单目标优化问题【含Matlab源码 2013期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[单目标优化求解]基于matlab增强型黑猩猩优化器算法求解单目标优化问题[含Matlab源码 2013期] 点击上面蓝色字体,直接付费下 ...

最新文章

  1. SES机箱管理知识回顾(二) 之SAF-TE简介
  2. 拖拖拽拽画JAVA报表?
  3. Ceph分布式存储高性能设计
  4. /dev/null 21
  5. linux gone kde 图形程序 兼容,Oracle8i HowTo
  6. activiti dmn_新的DMN编辑器预览
  7. 在html5中能使用dom么,html5 – 如何在TypeScript中使用DOMStringMap?
  8. bzoj1041 [HAOI2008]圆上的整点 gcd
  9. (04)System Verilog 常用数据类型示例
  10. oracle dba 命令行,Oracle DBA常用命令
  11. matlab2c使用c++实现matlab函数系列教程-conj函数
  12. 受限玻尔兹曼机(RBM)学习笔记
  13. python游戏编程讲解之凯撒密码
  14. php com adodb,php COM 连接ADODB.Connection数据库
  15. JAVA 进制转换工具
  16. 【日常】解决问题:SSR1080端口被占用的问题
  17. ftw, nftw - file tree walk
  18. 【Task02】Pandas之基础
  19. C语言从入门到精通 【精读C Prime Plus】【C语言笔记1-4章节】【更新中~】
  20. Android客户端与服务器端socket通讯

热门文章

  1. bat脚本中添加注释
  2. 关于学计算机的职业理想700字,计算机专业职业规划范文
  3. PowerShell、CMD 和 Windows Terminal 的美化配置方法
  4. eclipse汉化版与背景更换更换jdk及项目jre以及环境变量的配置
  5. 考研-高等数学(数学一)目录整理
  6. Python反编译apk,获取各类信息
  7. linux scsi程序,Linux scsi设备读写流程
  8. 战地4无限加入服务器,战地1怎么加入服务器
  9. ASP.NET Core 多线程 异步编程
  10. 热带鱼屏保(Marine Aquarium 3),如何才能绕过它的Key Code?