莱维飞行轨迹分布图,你真的画对了吗?MATLAB代码

最近有小伙伴后台留言,要求出一个莱维飞行轨迹分布图。

小淘寻思,这莱维飞行轨迹分布图网上不是一抓一大把吗,然后就去查了一下。发现还真是有猫腻!

网上很多博主分享的莱维飞行图大概是长这个样子的:

19a1c22a7c9be7b21d68bf9ae5c7af61.png

但莱维飞行图真的是这个样子吗?小淘仔细观察了一下这种绘图的代码:大致如下:

clear
clc
% Mantegna方法模拟萊维飞行
x = [0,0];
y = [0,0];
beta = 1.5;
sigma_u = (gamma(1+beta)*sin(pi*beta/2)/(gamma((1+beta)/2)*beta*2^((beta-1)/2)))^(1/beta);
sigma_v = 1;
for i=1:1000
    u = normrnd(0,sigma_u);
    v = normrnd(0,sigma_v);
    s = u/(abs(v))^(1/beta);
    x(:,1) = x(:,2);
    x(:,2) = x(:,1)+1*s;
    u = normrnd(0,sigma_u);
    v = normrnd(0,sigma_v);
    s = u/(abs(v))^(1/beta);
    y(:,1) = y(:,2);
    y(:,2) = y(:,1)+1*s;
    plot(x,y);
    hold on;
end
xlabel('X');
ylabel('Y');
title('Levy Flight Random Walk');

但是但是!重点来了!上述代码中,并没有真实的模拟出莱维飞行每次随机的飞行方向,而只是模拟出了随机的步长!

实际的莱维飞行中,不仅步长是随机的,其实方向也应该是随机的。

小淘也去查了一下莱维飞行的百度百科,链接放这里了:https://baike.baidu.com/item/%E8%8E%B1%E7%BB%B4%E9%A3%9E%E8%A1%8C/50067105

以下这个图是从百度百科复制过来的:

6b9c21e11354b6b95973de2f5267c310.png

咱们仔细对比一下这张图与上面的代码绘制的图,可以发现,真正的莱维飞行图,其实在大多数飞行的过程中,方向都是斜着的,并非是平行于X轴或者Y轴的!

因此小淘在这里对这个代码进行一下修改,直接代码怼脸,复制到MATLAB即可使用。

%公众号:淘个代码
clear
close all
clc
% 设置参数
num_steps = 1000; % 游走步数
beta = 3/2; % 莱维指数,控制步长分布的形状


% 初始化位置数组
x = zeros(num_steps, 1);
y = zeros(num_steps, 1);


% 生成莱维分布的步长
step_lengths = levy(beta, num_steps);


% 生成随机[方向]
angles = 2 * pi * rand(num_steps, 1);


% 计算每一步的位置
for i = 2:num_steps
    x(i) = x(i-1) + step_lengths(i) * cos(angles(i));
    y(i) = y(i-1) + step_lengths(i) * sin(angles(i));
end


% 绘制游走图
figure
for i=1:num_steps-1
    plot(x(i:i+1), y(i:i+1));
    hold on
end
xlabel('X');
ylabel('Y');
title('Levy Flight Random Walk');


% 莱维分布[函数]
function step = levy(beta, num_steps)
    sigma_u = (gamma(1+beta)*sin(pi*beta/2) / (beta*gamma((1+beta)/2)*2^((beta-1)/2)))^(1/beta) ;
    sigma_v = 1;
    u = normrnd(0,sigma_u,num_steps,1) ;
    v = normrnd(0,sigma_v,num_steps,1) ;
    step = u./(abs(v).^(1/beta)) ;
end

运行结果如下:

71f4733b2ce4394b1e5b1593a266f5ac.png

艾?我再运行一次~就是玩~

6abeeea1f1e3462ff666771300380382.png

可以看到,小淘写的这段代码对应的莱维飞行图,在方向上有了更强的随机性,再也不是那种“横平竖直”的莱维飞行了!

声明:

以上莱维飞行轨迹图的绘制,受限于个人学术能力,仅供参考,如有疑义请后台留言交流。

b4c46cafc49d59fb843345f9b64cc8dc.gif

点个“在看”不失联

### 离散莱维飞行MATLAB中的实现 #### 莱维飞行简介 莱维飞行为一种随机行走模式,其步长服从莱维分布。这种特性使其成为优化算法中探索全局最优的有效工具之一。 #### MATLAB实现离散莱维飞行 为了实现在MATLAB环境中执行离散莱维飞行,可以采用如下方法: 定义一个函数来生成满足莱维稳定分布特性的随机数序列作为移动距离向量。这里提供了一个简单的例子用于说明如何创建这样的函数[^1]: ```matlab function s = levyFlight(beta, N) % beta 是指数参数;N 表示粒子数量 u = randn(N, 1); v = randn(N, 1); step = zeros(N, 1); for i = 1:N if abs(v(i)) >= eps step(i) = (u(i)/abs(v(i))^((1/beta)-0.5)); end end s = step; end ``` 接着,在主程序里调用上述辅助函数完成一次完整的迭代过程并更新位置信息。下面是一个简化版框架供参考[^2]: ```matlab % 参数设置 beta = 1.5; % 飞行指数 numParticles = 30; % 种群规模 maxIter = 100; % 迭代次数上限 dim = 2; % 维度设定为二维平面 % 初始化种群的位置矩阵 X 和速度 V X = rand(numParticles,dim)*(ub-lb)+lb; V = zeros(size(X)); for iter = 1:maxIter % 计算适应度值... % 更新最佳解... % 执行莱维飞行 L = levyFlight(beta,numParticles)*stepSize; % 更新粒子的速度和位置 V = w*V + c1*r1*(pbest-X) + c2*r2*(gbest-X); X = X + V .* L'; % 边界处理... end ``` 此代码片段展示了基本思路,实际应用时还需要考虑边界条件控制、适应度评估以及局部/全局极值保存等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淘个代码_

不想刀我的可以选择爱我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值