✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。
🍎个人主页:Matlab科研工作室
🍊个人信条:格物致知。
更多Matlab仿真内容点击👇
⛄ 内容介绍
一种基于人工鱼群的无人机路径规划方法.
一、 人工鱼的结构模型
人工鱼是真实鱼抽象化、虚拟化的一个实体,其中封装了自身数据和一系列行为,可以接受环境的刺激信息,做出相应的活动。其所在的环境由问题的解空间和其他人工鱼的状态,它在下一时刻的行为取决于自身的状态和环境的状态,并且它还通过自身的活动来影响环境,进而影响其他人工鱼的活动。
二、 人工鱼群算法的寻优原理
人工鱼群算法在寻优的过程中,可能会集结在几个局部最优解的周围,使人工鱼跳出局部最优解,实现全局寻优的因素主要有:
- 觅食行为中重复次数较少时,为人工鱼提供了随机移动的机会,从而可能跳出局部最优解;
- 随机步长使得人工鱼在前往局部最优解的途中,有可能转向全局最优解;
- 拥挤度因子 δδ 限制了聚群的规模,使得人工鱼能够更广泛的寻优;
- 聚群行为能够促使少出陷于局部最优解的人工鱼趋向全局最优解的人工鱼方向聚集,从而逃出局部最优解;
- 追尾行为加快了人工鱼向更优状态游动。
三、 人工鱼群算法实现的步骤
- 初始化设置,包括种群规模N、每条人工鱼的初始位置、人工鱼的视野Visual、步长step、拥挤度因子δ、重复次数Trynumber;
- 计算初始鱼群各个体的适应值,取最优人工鱼状态及其值赋予给公告牌;
- 对每个个体进行评价,对其要执行的行为进行选择,包括觅食Pray、聚群Swarm、追尾Follow和评价行为bulletin;
- 执行人工鱼的行为,更新自己,生成新鱼群;
- 评价所有个体。若某个体优于公告牌,则将公告牌更新为该个体;
- 当公告牌上最优解达到满意误差界内或者达到迭代次数上限时算法结束,否则转步骤3。
四、人工鱼群算法实现流程图
⛄ 部分代码
pointNum,visual,startPos,goalPos,try_number,delta,step,X,Y,Z)
N = length(fishs);
% 确定视野范围内的伙伴数目与中心位置
for i = 1:pointNum
% 初始化感知范围内的位置变量和鱼数量
pos_sum = [0 0 0];
n_swarm = 0;
% 依次遍历
for j = 1:N
% 计算第j只鱼与本鱼的距离
dx = fish.pos.x(i) - fishs(j).pos.x(i);
dy = fish.pos.y(i) - fishs(j).pos.y(i);
dz = fish.pos.z(i) - fishs(j).pos.z(i);
dist = sqrt(dx^2 + dy^2 + dz^2);
% 判断是否位于感知范围内
if dist < visual
n_swarm = n_swarm+1; % 统计在感知范围内的鱼数量
pos_sum = pos_sum + ...
[fishs(j).pos.x(i), fishs(j).pos.y(i), fishs(j).pos.z(i)];
end
end
% 计算其他伙伴的中心位置,并减掉自身的位置
pos_sum = pos_sum -[fish.pos.x(i),fish.pos.y(i),fish.pos.z(i)];
n_swarm = n_swarm - 1;
centerPos = pos_sum / n_swarm;
% 对于第i个维度的控制点,赋值
pos_c.x(i) = centerPos(1);
pos_c.y(i) = centerPos(2);
pos_c.z(i) = centerPos(3);
end
% 判断中心位置是否拥挤
[fitness_c,~] = calFitness(startPos, goalPos, pos_c);
if fitness_c/n_swarm < delta*fish.fitness && fitness_c < fish.fitness
% 群聚行为:伙伴中心位置状态较优,向此方向群聚
for i = 1:pointNum
direction = [pos_c.x(i)-fish.pos.x(i), pos_c.y(i)-fish.pos.y(i), ...
pos_c.z(i)-fish.pos.z(i)];
centerPos = [fish.pos.x(i),fish.pos.y(i),fish.pos.z(i)] + ...
rand*step*direction/norm(direction);
pos_swarm.x(i) = centerPos(1);
pos_swarm.y(i) = centerPos(2);
pos_swarm.z(i) = centerPos(3);
end
% 计算适应度
[fitness_swarm,path_swarm] = calFitness(startPos, goalPos,pos_swarm);
% 碰撞检测判断
flag = judgeObs(path_swarm,X,Y,Z);
if flag == 1
% 若flag=1,表明此路径将与障碍物相交,则增大适应度值
fitness_swarm = 1000*fitness_swarm;
end
else
% 觅食行为
label_prey = 0; % 用于判断觅食行为是否找到优于当前的状态
for i = 1:try_number
% 随机搜索一个状态
pos_rand.x = fish.pos.x + visual*(-1 + rand*2);
pos_rand.y = fish.pos.y + visual*(-1 + rand*2);
pos_rand.z = fish.pos.z + visual*(-1 + rand*2);
[fitness_rand,~] = calFitness(startPos, goalPos, pos_rand);
% 判断搜索到的状态是否比原来的好
if fitness_rand < fish.fitness
for j = 1:pointNum
direction = [pos_rand.x(j) - fish.pos.x(j), pos_rand.y(j)-fish.pos.y(j), ...
pos_rand.z(j) - fish.pos.z(j)];
centerPos = [fish.pos.x(j),fish.pos.y(j),fish.pos.z(j)] + ...
rand*step*direction/norm(direction);
pos_swarm.x(j) = centerPos(1);
pos_swarm.y(j) = centerPos(2);
pos_swarm.z(j) = centerPos(3);
end
% 计算适应度
[fitness_swarm,path_swarm] = calFitness(startPos, goalPos,pos_swarm);
% 碰撞检测判断
flag = judgeObs(path_swarm,X,Y,Z);
if flag == 1
% 若flag=1,表明此路径将与障碍物相交,则增大适应度值
fitness_swarm = 1000*fitness_swarm;
end
label_prey = 1;
break
end
end
% 随机行为
if label_prey == 0
% 随机搜索一个状态
pos_swarm.x = fish.pos.x + step *(-1 + rand*2);
pos_swarm.y = fish.pos.y + step *(-1 + rand*2);
pos_swarm.z = fish.pos.z + step *(-1 + rand*2);
[fitness_swarm,path_swarm] = calFitness(startPos, goalPos,pos_swarm);
% 碰撞检测判断
flag = judgeObs(path_swarm,X,Y,Z);
if flag == 1
% 若flag=1,表明此路径将与障碍物相交,则增大适应度值
fitness_swarm = 1000*fitness_swarm;
end
end
end
⛄ 运行结果
⛄ 参考文献
[1]许江波, 刘琳岚. 基于改进人工鱼群算法的无人机三维航迹规划[J]. 计算机工程与设计, 2019, 40(2):5.
[2]曹学玉, 邱毅, 王会芳. 一种基于人工鱼群的无人机路径规划方法:, CN112650287A[P]. 2021.