循环1000次xopt yopt fopt = PSOShubert np maxiter bounds每次产生三个数三个数存入到矩阵中矩阵中的数需要不满足abs globk1 - xopt eps && absglobk2 - yopt eps && absglobk3 - fopt eps将矩阵进行输出
以下是代码示例:
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,:));
解释一下代码:
- 前三行是设置参数,分别是粒子个数、最大迭代次数、搜索范围。
- 第四行是设置精度,用于判断两个数是否相等。
- 第五行定义了一个矩阵
glob,用于存储搜索到的最优解。初始时矩阵中所有元素都是0,因为还没有搜索到任何解。 - 第六行定义了一个计数器
count,用于记录已经搜索到的最优解的个数,初始值为0。 - 从第7行开始,使用一个循环来进行1000次PSO搜索。
- 在每一次PSO搜索后,判断当前的最优解是否已经在
glob矩阵中存在。如果不存在,就将它存入矩阵中。 - 最后使用
disp函数将glob矩阵输出。
需要注意的是,在判断最优解是否已经存在时,使用了all函数和|运算符,这是一种比较高效的方法,可以避免使用循环来逐个判断
原文地址: https://www.cveoy.top/t/topic/cfxD 著作权归作者所有。请勿转载和采集!