粒子群算法matlab模板
时间: 2023-10-02 14:06:26 浏览: 35
以下是一个简单的粒子群算法的 Matlab 模板:
```matlab
function [x,fval]=PSO(objFun,nvar,lb,ub,options)
% objFun: 目标函数的句柄
% nvar: 变量的个数
% lb: 变量的下界
% ub: 变量的上界
% options: PSO算法的选项
% 设置默认值
defaultOptions = struct('PopulationSize',50,...
'MaxIterations',100,...
'C1',2,...
'C2',2,...
'W',0.9,...
'Display','off');
% 使用传入的选项或默认选项
if exist('options','var')
options = setdefault(options,defaultOptions);
else
options = defaultOptions;
end
% 提取选项中的参数
PopSize = options.PopulationSize;
MaxIter = options.MaxIterations;
C1 = options.C1;
C2 = options.C2;
W = options.W;
Display = options.Display;
% 初始化粒子群
X = repmat(lb,PopSize,nvar) + rand(PopSize,nvar).*(repmat(ub-lb,PopSize,1));
V = zeros(PopSize,nvar);
pbest = X;
pbestfit = feval(objFun,X);
[gbestfit,idx] = min(pbestfit);
gbest = pbest(idx,:);
% PSO 算法主循环
for i=1:MaxIter
% 更新粒子速度和位置
V = W*V + C1*rand(PopSize,nvar).*(pbest-X) + C2*rand(PopSize,nvar).*(repmat(gbest,PopSize,1)-X);
X = X + V;
% 限制粒子位置在边界内
X(X<lb) = lb(X<lb);
X(X>ub) = ub(X>ub);
% 更新粒子的最优位置
fit = feval(objFun,X);
better = fit < pbestfit;
pbestfit(better) = fit(better);
pbest(better,:) = X(better,:);
% 更新全局最优位置
[temp,idx] = min(pbestfit);
if temp < gbestfit
gbestfit = temp;
gbest = pbest(idx,:);
end
% 显示当前迭代的结果
if strcmp(Display,'iter')
fprintf('Iteration %d: Best fitness = %g\n',i,gbestfit);
end
end
% 返回最优解和最优目标函数值
x = gbest;
fval = gbestfit;
end
function s = setdefault(s,defaults)
% 设置默认选项
fnames = fieldnames(defaults);
for i=1:length(fnames)
if ~isfield(s,fnames{i})
s.(fnames{i}) = defaults.(fnames{i});
end
end
end
```
使用示例:
```matlab
% 定义目标函数
objFun = @(x) (x(1)-2)^2 + (x(2)-3)^2;
% 设置变量的下界和上界
lb = [-10,-10];
ub = [10,10];
% 设置 PSO 的选项
options.PopulationSize = 50;
options.MaxIterations = 100;
options.C1 = 2;
options.C2 = 2;
options.W = 0.9;
options.Display = 'iter';
% 运行 PSO 算法
[x,fval] = PSO(objFun,2,lb,ub,options);
% 显示结果
fprintf('Best solution: x1 = %g, x2 = %g\n',x(1),x(2));
fprintf('Best fitness: %g\n',fval);
```