MATLAB PSO 算法:过滤重复最优解并存储结果
以下代码使用 PSO 算法进行优化,并过滤重复的最优解,并将结果存储到矩阵中。
np = 20;
maxiter = 50;
bounds = [-10, 10; -10, 10];
eps = 1e-6;
glob = zeros(1000, 3);
count = 0;
for i = 1:1000
[xopt, yopt, fopt] = PSO(@Shubert, np, maxiter, bounds);
if all(abs(glob(1:count,1) - xopt) > eps | ...
abs(glob(1:count,2) - yopt) > eps | ...
abs(glob(1:count,3) - fopt) > eps)
count = count + 1;
glob(count,:) = [xopt, yopt, fopt];
end
end
disp(glob(1:count,:));
代码解释如下:
-
设置参数:
np: 粒子数量maxiter: 最大迭代次数bounds: 搜索范围eps: 精度,用于判断两个数是否相等
-
定义矩阵:
glob: 存储搜索到的最优解的矩阵,初始值为全零矩阵count: 记录已经搜索到的最优解的个数,初始值为0
-
循环搜索:
- 使用
for循环进行 1000 次 PSO 搜索 - 每次搜索后,使用
if语句判断当前最优解是否已经存在于glob矩阵中all(abs(glob(1:count,1) - xopt) > eps | ... abs(glob(1:count,2) - yopt) > eps | ... abs(glob(1:count,3) - fopt) > eps)使用all函数和|运算符高效地判断三个数是否都与已有解不同
- 使用
-
存储结果:
- 如果最优解不存在于
glob矩阵中,则将其存入矩阵 count计数器加 1
- 如果最优解不存在于
-
输出结果:
- 使用
disp函数输出glob矩阵,其中包含所有不重复的最优解
- 使用
注意:
- 代码中假设
PSO函数已定义,用于执行粒子群优化算法 @Shubert代表目标函数,需根据具体情况替换- 该代码使用
all函数和|运算符判断最优解是否重复,这是一种高效的方法,可以避免使用循环逐个判断。
该代码可以帮助您在使用 PSO 算法进行优化时,过滤重复的最优解,并存储搜索结果。您可以根据实际情况调整参数和代码,以满足您的需求。
原文地址: https://www.cveoy.top/t/topic/nrLr 著作权归作者所有。请勿转载和采集!