基于matlab,利用标准粒子群算法得到无人机集群威胁“重心”在惯性坐标系下的坐标源代码
时间: 2023-12-14 22:02:50 浏览: 32
以下是基于 MATLAB 的标准粒子群算法求解无人机集群威胁重心在惯性坐标系下的坐标的源代码:
```matlab
% 定义目标函数,即集群威胁重心与原点之间的欧几里得距离
function f = fitness(x)
f = sqrt(x(1)^2 + x(2)^2);
end
% 初始化粒子群
function swarm = init_swarm(n, dim, lb, ub)
swarm = struct;
swarm.n = n;
swarm.dim = dim;
swarm.lb = lb;
swarm.ub = ub;
swarm.x = lb + (ub - lb) .* rand(n, dim);
swarm.v = zeros(n, dim);
swarm.pbest = swarm.x;
swarm.gbest = swarm.x(randi(n), :);
swarm.fpbest = arrayfun(@fitness, swarm.x);
swarm.fgbest = fitness(swarm.gbest);
end
% 更新粒子群
function swarm = update_swarm(swarm, w, c1, c2)
swarm.v = w * swarm.v ...
+ c1 * rand * (swarm.pbest - swarm.x) ...
+ c2 * rand * (swarm.gbest - swarm.x);
swarm.x = swarm.x + swarm.v;
% 限制粒子位置在边界内
swarm.x(swarm.x < swarm.lb) = swarm.lb(swarm.x < swarm.lb);
swarm.x(swarm.x > swarm.ub) = swarm.ub(swarm.x > swarm.ub);
% 更新历史最优位置和全局最优位置
fp = arrayfun(@fitness, swarm.x);
swarm.pbest(fp < swarm.fpbest, :) = swarm.x(fp < swarm.fpbest, :);
swarm.fpbest(fp < swarm.fpbest) = fp(fp < swarm.fpbest);
[swarm.fgbest, gbest_idx] = min(swarm.fpbest);
swarm.gbest = swarm.pbest(gbest_idx, :);
end
% 主函数
function main()
% 参数设置
n = 50; % 粒子数
dim = 2; % 搜索维度
lb = [-10, -10]; % 搜索下界
ub = [10, 10]; % 搜索上界
max_iter = 100; % 最大迭代次数
w = 0.729; % 惯性权重
c1 = 1.49445; % 加速度常数1
c2 = 1.49445; % 加速度常数2
% 初始化粒子群
swarm = init_swarm(n, dim, lb, ub);
% 迭代更新粒子群
for iter = 1:max_iter
swarm = update_swarm(swarm, w, c1, c2);
fprintf('iter = %d, fgbest = %f\n', iter, swarm.fgbest);
end
% 输出结果
fprintf('gbest = (%f, %f)\n', swarm.gbest(1), swarm.gbest(2));
end
```
这段代码定义了目标函数、初始化粒子群、更新粒子群和主函数,并在主函数中进行了参数设置和迭代更新粒子群的操作。在迭代更新过程中,输出了当前迭代次数和全局最优值,方便观察算法收敛情况。最终输出了全局最优位置,即为集群威胁重心在惯性坐标系下的坐标。