首页 文章

matlab中的粒子群优化算法

提问于
浏览
1

我是matlab的新手,我需要一些关于matlab代码的帮助 . 我想制作粒子群优化,我想用鼠标点击来定义一个窗口大小为[min1,max1]和[min2,max2]的空间点 . 然后,初始化由n = 10个粒子组成的聚类,并搜索用户最初的点集 .

我的代码是这样的:

clear all;

numofdims = 30;

numofparticles = 50;

c1 = 2;

c2 = 2;

numofiterations = 1000;

V = zeros(50, 30);

initialpop = V;

Vmin = zeros(30, 1);

Vmax = Vmin;

Xmax = ones(30, 1) * 100;

Xmin = -Xmax;

pbestfits = zeros(50, 1);

worsts = zeros(50, 1);

bests = zeros(50, 1);

meanfits = zeros(50, 1);

pbests = zeros(50, 30);

initialpop = Xmin + (Xmax - Xmin) .* rand(numofparticles, numofdims);

X = initialpop;

fitnesses = testfunc1(X);

[minfit, minfitidx] = min(fitnesses);

gbestfit = minfit;

gbest = X(minfitidx, :);

for i = 1:numofdims

    Vmax(i) = 0.2 * (Xmax(i) - Xmin(i));

    Vmin(i) = -Vmax(i);

end


for t = 1:1000

    w = 0.9 - 0.7 * (t / numofiterations);


    for i = 1:numofparticles

        if(fitnesses(i) < pbestfits(i))

            pbestfits(i) = fitnesses(i);

            pbests(i, :) =  X(i, :);

        end

    end

    for i = 1:numofparticles

        for j = 1:numofdims

            V(i, j) = min(max((w * V(i, j) + rand * c1 * (pbests(i, j) - X(i, j))...

                + rand * c2 * (gbest(j) - X(i, j))), Vmin(j)), Vmax(j));

            X(i, j) = min(max((X(i, j) + V(i, j)), Xmin(j)), Xmax(j));

        end

    end


    fitnesses = testfunc1(X);

    [minfit, minfitidx] = min(fitnesses);

    if(minfit < gbestfit)

        gbestfit = minfit;

        gbest = X(minfitidx, :);

    end


    worsts(t) = max(fitnesses);

    bests(t) = gbestfit;

    meanfits(t) = mean(fitnesses);

end

2 回答

  • 0

    我做了以前的代码非常感谢你 .

    我找到了一个关于PSO的新代码,我想用鼠标点击来定义一个窗口大小为[min1,max1]和[min2,max2]的空间点 .

    然后,初始化由n = 10个粒子组成的聚类,并搜索用户最初的点集 .

    代码是这样的:

    %% Initialization
    clear
    clc
    n = 50;          % Size of the swarm " no of birds "
    bird_setp  = 50; % Maximum number of "birds steps"
    dim = 2;          % Dimension of the problem
    
    c2 =1.1;          % PSO parameter C1 
    c1 = 0.12;        % PSO parameter C2 
    w =0.9;           % pso momentum or inertia  
    fitness=0*ones(n,bird_setp);
                                           %-----------------------------%
                                           %    initialize the parameter %
                                           %-----------------------------%
    
    R1 = rand(dim, n);
    R2 = rand(dim, n);
    current_fitness =0*ones(n,1);
    
                                     %------------------------------------------------%
                                     % Initializing swarm and velocities and position %
                                     %------------------------------------------------%
    
    current_position = 10*(rand(dim, n)-.5);
    velocity = .3*randn(dim, n) ;
    local_best_position  = current_position ;
    
    
                                     %-------------------------------------------%
                                     %     Evaluate initial population           %           
                                     %-------------------------------------------%
    
    for i = 1:n
        current_fitness(i) = Live_fn(current_position(:,i));    
    
    end
    
    
    local_best_fitness  = current_fitness ;
    [global_best_fitness,g] = min(local_best_fitness) ;
    
    for i=1:n
        globl_best_position(:,i) = local_best_position(:,g) ;
    
    end
                                                   %-------------------%
                                                   %  VELOCITY UPDATE  %
                                                   %-------------------%
    
    velocity = w *velocity + c1*(R1.*(local_best_position-current_position)) + c2*(R2.*(globl_best_position-current_position));
    
                                                   %------------------%
                                                   %   SWARMUPDATE    %
                                                   %------------------%
    
    
    current_position = current_position + velocity ;
    
                                                   %------------------------%
                                                   %  evaluate anew swarm   %
                                                   %------------------------%
    
    
    %% Main Loop
    iter = 0 ;        % Iterations’counter
    while  ( iter < bird_setp )
    iter = iter + 1;
    
    for i = 1:n,
    current_fitness(i) = Live_fn(current_position(:,i)) ;    
    
    end
    
    
    for i = 1 : n
            if current_fitness(i) < local_best_fitness(i)
               local_best_fitness(i)  = current_fitness(i);  
               local_best_position(:,i) = current_position(:,i)   ;
            end   
     end
    
    
     [current_global_best_fitness,g] = min(local_best_fitness);
    
    
    if current_global_best_fitness < global_best_fitness
       global_best_fitness = current_global_best_fitness;
    
        for i=1:n
            globl_best_position(:,i) = local_best_position(:,g);
        end
    
    end
    
    
     velocity = w *velocity + c1*(R1.*(local_best_position-current_position)) + c2*(R2.*(globl_best_position-current_position));
     current_position = current_position + velocity; 
    
    
    
    
    x=current_position(1,:);
    y=current_position(2,:);
    
    clf    
        plot(x, y , 'h')   
        axis([-5 5 -5 5]);
    
    pause(.2)
    
    
    end % end of while loop its mean the end of all step that the birds move it 
    
    
                  [Jbest_min,I] = min(current_fitness) % minimum fitness
                   current_position(:,I) % best solution
    
    
    
    
    
    
    %
    
  • 0

    您可以使用 ginput 获取鼠标单击的坐标:

    [x,y] = ginput;
    

    然后相应地定义您的窗口 .

相关问题