1. 程式人生 > >粒子群演算法的matlab實現(一)

粒子群演算法的matlab實現(一)

clc;clear;close all;
%% 初始化種群
f= @(x)x .* sin(x) .* cos(2 * x) - 2 * x .* sin(3 * x); % 函式表示式
figure(1);ezplot(f,[0,0.01,20]);
N = 50;                         % 初始種群個數
d = 1;                          % 空間維數
ger = 100;                      % 最大迭代次數     
limit = [0, 20];                % 設定位置引數限制
vlimit = [-1, 1];               % 設定速度限制
w = 0.8;                        % 慣性權重
c1 = 0.5;                       % 自我學習因子
c2 = 0.5;                       % 群體學習因子 
for i = 1:d
    x = limit(i, 1) + (limit(i, 2) - limit(i, 1)) * rand(N, d);%初始種群的位置
end
v = rand(N, d);                  % 初始種群的速度
xm = x;                          % 每個個體的歷史最佳位置
ym = zeros(1, d);                % 種群的歷史最佳位置
fxm = zeros(N, 1);               % 每個個體的歷史最佳適應度
fym = -inf;                      % 種群歷史最佳適應度
hold on
plot(xm, f(xm), 'ro');title('初始狀態圖');
figure(2)
%% 群體更新
iter = 1;
record = zeros(ger, 1);          % 記錄器
while iter <= ger
     fx = f(x) ; % 個體當前適應度   
     for i = 1:N      
        if fxm(i) < fx(i)
            fxm(i) = fx(i);     % 更新個體歷史最佳適應度
            xm(i,:) = x(i,:);   % 更新個體歷史最佳位置
        end 
     end
if fym < max(fxm)
        [fym, nmax] = max(fxm);   % 更新群體歷史最佳適應度
        ym = xm(nmax, :);      % 更新群體歷史最佳位置
 end
    v = v * w + c1 * rand * (xm - x) + c2 * rand * (repmat(ym, N, 1) - x);% 速度更新
    % 邊界速度處理
    v(v > vlimit(2)) = vlimit(2);
    v(v < vlimit(1)) = vlimit(1);
    x = x + v;% 位置更新
    % 邊界位置處理
    x(x > limit(2)) = limit(2);
    x(x < limit(1)) = limit(1);
    record(iter) = fym;%最大值記錄
%     x0 = 0 : 0.01 : 20;
%     plot(x0, f(x0), 'b-', x, f(x), 'ro');title('狀態位置變化')
%     pause(0.1)
    iter = iter+1;
end
figure(3);plot(record);title('收斂過程')
x0 = 0 : 0.01 : 20;
figure(4);plot(x0, f(x0), 'b-', x, f(x), 'ro');title('最終狀態位置')
disp(['最大值:',num2str(fym)]);
disp(['變數取值:',num2str(ym)]);
結果如下: