利用鱼群算法求解最值问题(一元或多元)MATLAB编程实现
学习内容:
利用鱼群算法实现最值问题的求解(一元或多元均可解决)
学习产出:
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编程实现相关推荐
- 如何用计算机求特征值特征向量,利用QR算法求解矩阵的特征值和特征向量
利用QR算法求解矩阵的特征值和特征向量 为了求解一般矩阵(不是那种幼稚到shi的2 x 2矩阵)的特征值. 根据定义的话,很可能需要求解高阶方程... 这明显是个坑...高阶方程你肿么破... 折腾了 ...
- 利用 L-BFGS 算法求解基追踪问题_matlab
实例:利用 L-BFGS 算法求解基追踪问题_matlab 构建基追踪问题 L-BFGS 求解x 正则化系数 α\alphaα 为 555 正则化系数 α\alphaα 为 101010 结果可视化 ...
- 利用QR算法求解矩阵的特征值和特征向量
利用QR算法求解矩阵的特征值和特征向量 为了求解一般矩阵(不是那种幼稚到shi的2 x 2矩阵)的特征值. 根据定义的话,很可能需要求解高阶方程... 这明显是个坑...高阶方程你肿么破... 折腾了 ...
- matlab实战系列之人工鱼群算法求解TSP问题原理解析(下篇源码解析)
从算法的名字中可以看出该算法是群体智能优化算法中的一种,人工鱼群算法通过模拟鱼群的觅食.聚群.追尾.随机等行为在搜索域中进行寻优. 人工鱼群算法有三个比较重要的概念:视野范围.k-距离邻域.多条鱼的中 ...
- ML之PLiR之LARS:利用LARS算法求解ElasticNet回归类型(包括类别编码+属性重要程度排序)问题(实数值年龄预测)
ML之PLiR之LARS:利用LARS算法求解ElasticNet回归类型(包括类别编码+属性重要程度排序)问题(实数值年龄预测) 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 x ...
- ML之PLiR之Glmnet:利用Glmnet算法求解ElasticNet回归类型问题(实数值评分预测)
ML之PLiR之Glmnet算法:利用Glmnet算法求解ElasticNet回归类型问题(实数值评分预测) 目录 输出结果 1.Glmnet算法 实现代码 输出结果 0 2 1 2 2 2 3 3 ...
- ML之PLiR之LARS:利用LARS算法求解ElasticNet回归类型问题(实数值评分预测)
ML之PLiR之LARS:利用LARS算法求解ElasticNet回归类型问题(实数值评分预测) 目录 设计思路 输出结果 1.LARS 2.10-fold cross validation 实现代码 ...
- 【AFSA TSP】基于matlab人工鱼群算法求解旅行商问题【含Matlab源码 422期】
一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[TSP]基于matlab人工鱼群算法求解旅行商问题[含Matlab源码 422期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...
- 【优化布局】基于matlab免疫算法求解充电站最优布局【含Matlab源码 2539期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[生产调度]基于matlab免疫算法求解生产调度零等待问题[含Matlab源码 1178期] 点击上面蓝色字体,直接付费下载,即可. 获取 ...
- 【单目标优化求解】基于matlab增强型黑猩猩优化器算法求解单目标优化问题【含Matlab源码 2013期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[单目标优化求解]基于matlab增强型黑猩猩优化器算法求解单目标优化问题[含Matlab源码 2013期] 点击上面蓝色字体,直接付费下 ...
最新文章
- SES机箱管理知识回顾(二) 之SAF-TE简介
- 拖拖拽拽画JAVA报表?
- Ceph分布式存储高性能设计
- /dev/null 21
- linux gone kde 图形程序 兼容,Oracle8i HowTo
- activiti dmn_新的DMN编辑器预览
- 在html5中能使用dom么,html5 – 如何在TypeScript中使用DOMStringMap?
- bzoj1041 [HAOI2008]圆上的整点 gcd
- (04)System Verilog 常用数据类型示例
- oracle dba 命令行,Oracle DBA常用命令
- matlab2c使用c++实现matlab函数系列教程-conj函数
- 受限玻尔兹曼机(RBM)学习笔记
- python游戏编程讲解之凯撒密码
- php com adodb,php COM 连接ADODB.Connection数据库
- JAVA 进制转换工具
- 【日常】解决问题:SSR1080端口被占用的问题
- ftw, nftw - file tree walk
- 【Task02】Pandas之基础
- C语言从入门到精通 【精读C Prime Plus】【C语言笔记1-4章节】【更新中~】
- Android客户端与服务器端socket通讯