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}nfYc. 若状态较优且不太拥挤,即
Y c n f < δ Y i \frac{Y_c}{n_f}nfYc
则向该中心位置移动一个步长, 否则将执行觅食行为.
function [x_swarm, x_swarm_fitness] = swarm(x