MATLAB 数学建模: 人工鱼群算法

1. 基本原理

人工鱼群算法是一种受鱼群聚集规律而启发的优化算法. 在人工鱼群算法中, 我们假定鱼群的活动行为分为: 觅食行为, 群聚行为, 追随行为和随机行为.

觅食行为, 基于 “鱼倾向于游向食物最多的水域” 这一假设, 等价于在寻找最优解的过程中, 向相对较优的方向行进的迭代原则.

群聚行为, 借鉴了真实鱼群中, 落单的个体总倾向于回到群体的特性. 这一行为受三条子规则所限定:

分隔规则: 避免和临近伙伴之间过于拥挤

对准规则: 确保和临近伙伴的方向一致.

内聚规则: 尽量向临近伙伴的中心移动.

追尾行为, 确保了每一个人工鱼个体均会追逐临近的最活跃个体. 它等价于在优化过程中, 向位于当前点附近的, 极优化点前进的过程.

随机行为, 保证了人工鱼在 “目力所及范围内” 随机移动. 这样有助于在寻找最优解过程中跳出局部最优.

2. 程序设计

我们规定以下变量和符号:

n 目标空间维度

N 人工鱼数量

X 每条人工鱼状态 X = ( x 1 , x 2 , ⋯   , x n ) X = (x_1, x_2, \cdots, x_n)X=(x1​,x2​,⋯,xn​), 各分量为需要寻找最优的变量

Y Y = f ( X ) Y = f(X)Y=f(X), 人工鱼所在位置的食物浓度, 即寻优过程中的适应度.

d 人工鱼个体间距离, d = ∣ ∣ x i − x j ∣ ∣ d = ||x_i - x_j||d=∣∣xi​−xj​∣∣

v 人工鱼感知范围

s 人工鱼移动步长

δ 拥挤度因子, 反映拥挤程度

t 人工鱼每次觅食最大尝试次数

2.1 觅食行为

觅食行为, 指人工鱼总是倾向于沿食物较多的方向游动的行为. 逻辑如下:

对于每一条人工鱼 X i X_iXi​, 它按照规则

X j = X i + r a n d ( ) ⋅ v X_j = X_i + rand()\cdot vXj​=Xi​+rand()⋅v

随机选定一个新状态 X j X_jXj​, 并比照新旧两个状态的适应度.

若 X j X_jXj​ 适应度高于 X i X_iXi​, 则该鱼按照规则

X i ′ = X i + r a n d ( ) ⋅ s ⋅ X j − X i ∣ ∣ X j − X i ∣ ∣ X_i' = X_i + rand()\cdot s\cdot \frac{X_j - X_i}{||X_j - X_i||}Xi′​=Xi​+rand()⋅s⋅∣∣Xj​−Xi​∣∣Xj​−Xi​​

向 X j X_jXj​ 方向前进一个步长.

若反复判断 t tt 次后仍然无法在附近找到优于现有状态 X i X_iXi​ 的新状态, 人工鱼将依据规则

X i ′ = X i + r a n d ( ) ⋅ s X_i' = X_i + rand()\cdot sXi′​=Xi​+rand()⋅s

随机移动一个步长.

2.2 群聚行为

真实世界中的鱼群在游弋过程中为了躲避敌害会自然地群聚. 逻辑如下:

对于每一条人工鱼 X i X_iXi​, 搜索其视野内

d i j ⩽ v d_{ij}\leqslant vdij​⩽v

的伙伴并统计其数量, 记为 n f n_fnf​, 并且确定其周边伙伴的中间位置 X c X_cXc​.

判断伙伴所处的中心位置状态 Y c n f \frac{Y_c}{n_f}nf​Yc​​. 若状态较优且不太拥挤,即

Y c n f < δ Y i \frac{Y_c}{n_f}nf​Yc​​

则向该中心位置移动一个步长, 否则将执行觅食行为.

function [x_swarm, x_swarm_fitness] = swarm(x,i,N,v,f,delta,t,d,ub,lb,s)

%% Compute fitness rate under the circunstance of SWARMING

nf_swarm = 0;

Xc = 0;

label_swarm = 0; % The sign of swarming happened or not

% Fix the Position of the center, compute the number of companions

for j = 1:N

if norm(x(j,:) - x(i,:)) < v

nf_swarm = nf_swarm + 1; % COunt the number of companions

Xc = Xc + x(j,:); % Add up the number of Sakanas

end

end

Xc = Xc - x(i,:); % Delete myself

nf_swarm = nf_swarm - 1;

Xc = Xc / nf_swarm;

% Judge the center is narrow or not

if (f(Xc)/nf_swarm < delta*f(x(i,:))) && (f(Xc) < f(x(i,:)))

x_swarm = x(i,:) + rand*s.*(Xc - x(i,:)) ./ norm(Xc - x(i,:));

%Bound processing

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

% PREYING

label_prey = 0; % A sign of whether preying will find a better state than current state

for j = 1:t

%Find a state randomly

x_prey_rand = x(i,:) + v .* (-1 + 2 .* rand(1,d));

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;

%judgement: better, or not?

if f(x(i,:)) > f(x_prey_rand)

x_swarm = x(i,:) + rand*s .* (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

% Acting randomly

if label_prey == 0

x_swarm = x(i,:) + s * (-1 + 2*rand(1,d));

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

end

2.3 追尾行为

执行追尾过程时, 人工鱼将向其视野内适应度最高的个体移动. 逻辑如下:

X i X_iXi​ 搜索其视野内适应度最高的个体, 记为 X j X_jXj​, 同时对目标个体 X j X_jXj​ 视野内所有个体的数量计数 n f n_fnf​.

判断目标个体位置状态 Y j n f \frac{Y_j}{n_f}nf​Yj​​. 若该位置状态较优且不太拥挤, 则 X i X_iXi​ 向目标 X j X_jXj​ 移动一个步长, 否则执行觅食行为.

function [x_follow, x_follow_fitness] = follow(x,i,N,v,f,delta,t,d,ub,lb,s)

fitness_follow = inf;

label_follow = 0; % A Sign marking following has happened or not

% Search the *best* individual in sight

for j = 1:N

if (norm(x(j,:) - x(i,:)) < v) && (f(x(j,:)) < fitness_follow)

best_pos = x(j,:);

fitness_follow = f(x(j,:));

end

end

%Search The Number Of Companions In Sight

nf_follow = 0;

for j = 1:N

if norm(x(j,:) - best_pos) < v

nf_follow = nf_follow + 1;

end

end

nf_follow = nf_follow - 1; % Delete myself

% Judge: The Center Is Narrow or not?

if (fitness_follow/nf_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

% PREYING

label_prey = 0; % A sign of whether preying will find a better state than current state

for j = 1:t

%Find a state randomly

x_prey_rand = x(i,:) + v .* (-1 + 2 .* rand(1,d));

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;

%judgement: better, or not?

if f(x(i,:)) > f(x_prey_rand)

x_follow = x(i,:) + rand*s .* (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

%random behaviour

if label_prey == 0

x_follow = x(i,:) + s .* (-1 + 2*rand(1,d));

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

2.4 随机行为

在上文所提到的 “觅食行为” 的最后一种判断情况中, 人工鱼将会执行的行为就是随机行为.

3. 代码实现

附主函数代码如下:

clc; clear all;

%% Define variables

v = 25; %Perception Distance

s = 3; %Maximum Step Size

N = 30; %The Number Of Artificial Sakana

d = 10; %Current Dimension

t = 50; %Maximum Iteration Time

delta = 27; %Factor of Congestion

%% Construct a function for testing

f = @(x) sum(3*x.^4);

ub = 100; %Upper Limit Of Boundrary

lb = -100; %Lower Limit Of Boundrary

df = []; %Store Target Function value of 50 states

Iteration = 1; %Initialize Iteration Rate

Max_iteration = 500; %Maximum Iteration Rate

%% Initialize Artificial Sakana Group

x = lb + rand(N,d).*(ub - lb);

%% Compute fitness rate of 10 initial state

for i = 1:N

fitness_sakana(i) = f(x(i,:));

end

%% Define Best Fitness of Initial State

[best_fitness,I] = min(fitness_sakana);

best_x = x(I); %Best Artificial Sakana At Initial State

while Iteration <= Max_iteration

for i = 1:N

%%Swarm

[x_swarm, x_swarm_fitness] = swarm(x,i,N,v,f,delta,t,d,ub,lb,s);

%%Follow

[x_follow, x_follow_fitness] = follow(x,i,N,v,f,delta,t,d,ub,lb,s);

%%Judgement

if x_follow_fitness < x_swarm_fitness

x(i,:) = x_follow;

else

x(i,:) = x_swarm;

end

end

%% Update Information In Time

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;

%% Display Iteration Time And Current Best Fit Rate

if mod(Iteration, 25) == 0

display(['Iteration times: ',num2str(Iteration),'BestFitRate: ',num2str(best_fitness)]);

display(['BestArtificialSakana: ', num2str(best_x)]);

end

end

%% Print

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) = (3*x(i) .^4) + (3*y(j) .^4);

end

end

surfc(x,y,F,'LineStyle', 'none');

title('Test Function')

xlabel('x_1');

ylabel('y_1');

zlabel(['sum','(x_1,x_2)'])

grid on

subplot(1,2,2);

semilogy(Convergence_curve, 'Color','r')

title('Convergence Curve')

xlabel('Iteration');

ylabel('Best Fitness');

axis tight

grid on

box on

matlab球落点的数学建模,MATLAB数学建模:智能优化算法-人工鱼群算法相关推荐

  1. matlab书籍(数学建模,信号处理,智能优化,统计分析)

    matlab相关的书籍资料,包括基础入门的学习,数学建模,信号处理,智能优化,统计分析等等,部分书籍有matlab源码,需要的朋友可以看看. matlab入门资料分享及学习网站推荐 - 知乎最近由于做 ...

  2. 【AFSA TSP】基于matlab改进的人工鱼群算法求解旅行商问题【含Matlab源码 1479期】

    ⛄一. TSP简介 旅行商问题,即TSP问题(Traveling Salesman Problem)又译为旅行推销员问题.货郎担问题,是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须 ...

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

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

  4. MATLAB实战系列(十二)-如何用人工鱼群算法解决带时间窗车辆路径(CVRP)问题(附MATLAB代码)

    前言: 本文大体的思路是先对人工鱼进行编码,然后采用人工鱼群算法求解TSP问题中的觅食.聚群.追尾和随机行为对人工鱼群进行更新. 但是亟需需要解决的问题是:对于CVRP问题,如何对人工鱼进行编码.如果 ...

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

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

  6. pm模型matlab算法,18基于遗传算法(粒子群算法、人工鱼群算法等)的投影寻踪模型MATLAB源代码...

    基于遗传算法(粒子群算法.人工鱼群算法等)的投影寻踪模型 MATLAB源代码 投影寻踪是一种处理多因素复杂问题的统计方法,其基本思路是将高维数据向低维空间进行投影,通过低维投影数据的散布结构来研究高维 ...

  7. 【BP数据预测】基于matlab人工鱼群算法优化BP神经网络数据预测【含Matlab源码 523期】

    一.人工鱼群算法简介 1 觅食行为   指鱼循着食物多的方向游动的一种行为,人工鱼X i X_iXi​在其视野内随机选择一个状态X j X_jXj​,分别计算它们的目标函数值进行比较,如果发现Y j ...

  8. 【预测模型】基于人工鱼群算法优化BP神经网络实现数据预测matlab源码

    1 算法介绍 1.1 BP神经网络 1. 反向传播算法应用领域 反向传播算法应用较为广泛,从字面意思理解,与前向传播相互对应.在简单的神经网络中,反向传播算法,可以理解为最优化损失函数过程,求解每个参 ...

  9. 数学建模——多目标规划模型(智能优化算法NSGA-II)

    摘要 本篇笔记对数学建模中常见的多目标规划问题提供了解法:在建立传统的多目标规划的常用模型的基础上,使用智能优化算法对多目标规划问题进行求解,通过Pareto Front直观展现非劣解的分布情况,以解 ...

最新文章

  1. LVM逻辑卷轴管理和磁盘配额实验
  2. 8086的两种工作模式_Lora自组网网关的两种工作模式
  3. 趣味编程:C#中Specification模式的实现
  4. go程序的跨平台编译
  5. Codeforces Round #653 (Div. 3)(A, B, C, D, E1详解)
  6. RBAC(基于角色的权限访问控制)
  7. 华为荣耀20和x10比较_荣耀X10和华为畅享20plus,到底哪个更值得入手?
  8. ARP欺骗报文是这个样子的
  9. Page4:线性系统的运动求解以及脉冲响应矩阵与传递函数的关系[Linear System Theory]...
  10. 2021 年电工杯 B 题
  11. latex安装教程以及入门
  12. 背景建模之codebook算法
  13. js调用一次函数,中间增加一个内容
  14. 四级词汇4000快速记忆
  15. 教你免费将手机里的PDF转Word还能同步到电脑
  16. CTFshow击剑杯osint——人家想玩嘛,人有点多超详细解法
  17. 不良资产证券化中信用评级国外发展史
  18. catboost 的实例应用附带特征重要度打印
  19. 年度大戏《“跨界”的诱惑》主演:头部车企、手机巨头
  20. 网络编程基础 - m

热门文章

  1. Cent6.5 64位yum安装mysql5.5
  2. Knockout应用开发指南(完整版) 目录索引
  3. 网站初学笔记3-HTML实用元素3
  4. 是否会回到起点.回忆只能是回忆
  5. 河套酒业集团远程应用K/3系统案例解析
  6. BCH测试网上出现第一个UTXO证明
  7. idea如何打war包?(部署tomcat后具有class文件)
  8. 梭子鱼推出Microsoft Office 365 邮件威胁扫描服务
  9. Android 应用审核乱象:诈骗软件冲上排行榜首
  10. 一个很适合用来套用后台的框架