Particle Swarm Optimization - Алгоритмы - RSDN
  Particle Swarm Optimization в избранное  новое горячее всё    подписка   модер.  /!\ More Sharing Services
От: HunteXСтат.http://troyashka.ru/
Дата: 02.03.11 18:02
Всем привет! Почитал про данный алгоритм
тут http://habrahabr.ru/blogs/algorithm/105639/
и тут http://illumium.org/node/11

Говорится, что вроде алгоритм довольно прост, вот только я никак не могу понять его ((( Может кто ПРОСТЕНЬКИЙ пример алгоритма приведет ну или хотя бы ПОНЯТНЫЙ док с псевдокодом ...

Спасибо!
Re: Particle Swarm Optimization в избранное  новое    модер.  /!\ More Sharing Services
От: Sergey ChadovСтат. 
Дата: 03.03.11 08:57
Оценка:3 (1)
Здравствуйте, HunteX, Вы писали:

HX>Всем привет! Почитал про данный алгоритм

HX>тут http://habrahabr.ru/blogs/algorithm/105639/
HX>и тут http://illumium.org/node/11

HX>Говорится, что вроде алгоритм довольно прост, вот только я никак не могу понять его ((( Может кто ПРОСТЕНЬКИЙ пример алгоритма приведет ну или хотя бы ПОНЯТНЫЙ док с псевдокодом ...


HX>Спасибо!


википедия?

Если кратко и своими словами — есть толпа частиц, обладающих координатами и скоростью. На каждом шаге скорость частиц изменяется с учетом направления на лучшее решение, найденное данной частицей, лучшее решение найденное всеми частицами и пары случайных величин: v = w*v + c_1*r_1*(X — x) + c_2*r_2*(G — x) , где w,c_1,c_2 — некоторые коэффициенты(константы в классическом варианте), r_1, r_2 — случайные величины, X — лучшее решение, найденное текущей частицей до этого шага, G — лучшее решение, найденное всеми частицами до этого шага.
Потом все частицы изменяют свои координаты в соответствии со скоростью и обмениваются G.
И так они летают пока G не будет нас устраивать.

Могу в принципе поискать у себя реализацию, на CUDA в том числе
Re[2]: Particle Swarm Optimization в избранное  новое    модер.  /!\ More Sharing Services
От: HunteXСтат.http://troyashka.ru/
Дата: 03.03.11 09:39
Здравствуйте, Sergey Chadov, Вы писали:

SC>Здравствуйте, HunteX, Вы писали:


HX>>Всем привет! Почитал про данный алгоритм

HX>>тут http://habrahabr.ru/blogs/algorithm/105639/
HX>>и тут http://illumium.org/node/11

HX>>Говорится, что вроде алгоритм довольно прост, вот только я никак не могу понять его ((( Может кто ПРОСТЕНЬКИЙ пример алгоритма приведет ну или хотя бы ПОНЯТНЫЙ док с псевдокодом ...


HX>>Спасибо!


SC> википедия?


SC>Если кратко и своими словами — есть толпа частиц, обладающих координатами и скоростью. На каждом шаге скорость частиц изменяется с учетом направления на лучшее решение, найденное данной частицей, лучшее решение найденное всеми частицами и пары случайных величин: v = w*v + c_1*r_1*(X — x) + c_2*r_2*(G — x) , где w,c_1,c_2 — некоторые коэффициенты(константы в классическом варианте), r_1, r_2 — случайные величины, X — лучшее решение, найденное текущей частицей до этого шага, G — лучшее решение, найденное всеми частицами до этого шага.

SC>Потом все частицы изменяют свои координаты в соответствии со скоростью и обмениваются G.
SC>И так они летают пока G не будет нас устраивать.

SC>Могу в принципе поискать у себя реализацию, на CUDA в том числе


Ого! Спасибо, теперь более-менее ясно ... только что за переменная 'x' ? Хотелось бы реализицию алгоритма попроще, без всяких плюшек и наворотов.
Re[3]: Particle Swarm Optimization в избранное  новое    модер.  /!\ More Sharing Services
От: Sergey ChadovСтат. 
Дата: 03.03.11 09:57
Оценка:3 (1)
Здравствуйте, HunteX, Вы писали:



HX>Ого! Спасибо, теперь более-менее ясно ... только что за переменная 'x' ? Хотелось бы реализицию алгоритма попроще, без всяких плюшек и наворотов.


В данном случае x — координата частицы, v — ее скорость. То есть на самом деле в n-мерном пространстве будет n иксов и n скоростей на частицу
Re[3]: Particle Swarm Optimization в избранное  новое    модер.  /!\ More Sharing Services
От: Sergey ChadovСтат. 
Дата: 03.03.11 10:08
Оценка:3 (1)
Здравствуйте, HunteX, Вы писали:


HX>Ого! Спасибо, теперь более-менее ясно ... только что за переменная 'x' ? Хотелось бы реализицию алгоритма попроще, без всяких плюшек и наворотов.


Кстати, я бы еще советовал посмотреть на метод дифференциальной эволюции (differential evolution), он еще проще и как правило менее капризный, чем pso. Хотя конечно тут от задачи зависит
Re[4]: Particle Swarm Optimization в избранное  новое    модер.  /!\ More Sharing Services
От: HunteXСтат.http://troyashka.ru/
Дата: 03.03.11 10:10
Здравствуйте, Sergey Chadov, Вы писали:

SC>Здравствуйте, HunteX, Вы писали:



HX>>Ого! Спасибо, теперь более-менее ясно ... только что за переменная 'x' ? Хотелось бы реализицию алгоритма попроще, без всяких плюшек и наворотов.


SC>Кстати, я бы еще советовал посмотреть на метод дифференциальной эволюции (differential evolution), он еще проще и как правило менее капризный, чем pso. Хотя конечно тут от задачи зависит


Спасибо за совет, Сергей, но мне небходима реализация именно PSO. Поделитесь ?
Re[5]: Particle Swarm Optimization в избранное  новое    модер.  /!\ More Sharing Services
От: Sergey ChadovСтат. 
Дата: 04.03.11 05:51
Оценка:3 (1)
Здравствуйте, HunteX, Вы писали:


HX>>>Ого! Спасибо, теперь более-менее ясно ... только что за переменная 'x' ? Хотелось бы реализицию алгоритма попроще, без всяких плюшек и наворотов.

SC>>Кстати, я бы еще советовал посмотреть на метод дифференциальной эволюции (differential evolution), он еще проще и как правило менее капризный, чем pso. Хотя конечно тут от задачи зависит
HX>Спасибо за совет, Сергей, но мне небходима реализация именно PSO. Поделитесь ?

Нормальную реализацию я что-то найти не могу
Вот что нашел. Сразу говорю — это не production код, мне просто нужно было быстро сделать(из серии 'завтра конференция — сделай что-нибудь'), поэтому качество так себе, ну да для понимания сойдет


struct particle{
    floattype y;
    domain_t x;
    domain_t v;
    domain_t local_best_x;
    floattype local_best_y; 
};

struct particle_swarm
{
    static const int NParticles = 8192;
    typedef std::vector<particle> particles_cont_t;
    particles_cont_t particles;
    domain_t gbest_x;
    typedef floattype (* pfitness_func_t)(const domain_t&);

    pfitness_func_t pfitness_function;

    void init(const domain_t& iv, float r ,pfitness_func_t pf){
        particles.resize(NParticles);
        for (unsigned int i=0;i<particles.size();++i){
            particle & p = particles[i];
            p.local_best_x.resize(XN);
            p.x.resize(XN);
            p.v.resize(XN);
            std::fill(p.v.begin(),p.v.end(),(floattype)0.0);
            floattype rnd = rand()*r/(floattype)RAND_MAX;
            for(int j=0;j<XN;++j){p.x[j] = iv[j]+(rnd-r/2);}
            //for(int j=0;j<XN;++j){p.x[j] = iv[j]+i*0.1;}
            p.y = pf(p.x);
            p.local_best_x = p.x;
            p.local_best_y = p.y;
            gbest_x.resize(XN);
        }
        pfitness_function = pf;
    //    srand((unsigned int)time(0));
    }

    int optimize()
    {
        static const floattype c1 = 1.1f;
        static const floattype c2 = 2.03f;
        static const  floattype w = (floattype)0.67;
        floattype min_y = (floattype)1e20;

        for (unsigned int i=0;i<particles.size();++i){
            floattype y = pfitness_function(particles[i].x);
            if(y<min_y){
                min_y =  y;
                gbest_x = particles[i].x;
            }
        }
        int cnt = 0;
        omp_lock_t my_lock;
        omp_init_lock(&my_lock);


        int best_i = -1;
#ifdef OMP_ENABLED
#pragma omp parallel num_threads(NTHREADS) shared(min_y) shared(best_i) private(cnt)
        {
#endif        
        cnt = 0;
        while (cnt++<max_iter)
        {
            best_i = -1;
            particle* ppart = &particles[0];
            int nthr = omp_get_thread_num();
            for (unsigned int k=0;k<NParticles/NTHREADS;++k)
            {
                const int i= nthr*(NParticles/NTHREADS)+k;
                particle& part = particles[i];
                for(unsigned int j=0;j<XN;++j)
                {
                    const floattype r1 = (floattype)(rand()+1)/(RAND_MAX+1);
                    const floattype r2 = (floattype)(rand()+1)/(RAND_MAX+1);
                    part.v[j] = w*part.v[j]+
                        c1*r1*(part.local_best_x[j]  - part.x[j])+
                        c2*r2*(gbest_x[j] - part.x[j]);
                    part.x[j] += part.v[j];
                }
                part.y = pfitness_function(part.x);

                if(part.y < part.local_best_y){
                    part.local_best_y = part.y ;
                    part.local_best_x = part.x ;
                }    

                omp_set_lock(&my_lock);
                if(part.y<min_y){
                    
                    min_y = part.y;
                    //gbest_x = part.x;
                    best_i = i;
                }

                omp_unset_lock(&my_lock);
            }

            if(nthr == 0)
            {
                if(best_i!=-1){
                    gbest_x = particles[best_i].x;
                }
            }
#pragma omp barrier
        }
#ifdef OMP_ENABLED
        }
#endif
        return cnt;
    }
Re[6]: Particle Swarm Optimization в избранное  новое    модер.  /!\ More Sharing Services
От: HunteXСтат.http://troyashka.ru/
Дата: 04.03.11 07:49
Отлично! Огромное спасибо за помощь!
Re: Particle Swarm Optimization в избранное  новое    модер.  /!\ More Sharing Services
От: icegoodСтат. 
Дата: 04.03.11 14:14
Здравствуйте, HunteX, Вы писали:

HX>Всем привет! Почитал про данный алгоритм

HX>тут http://habrahabr.ru/blogs/algorithm/105639/
HX>и тут http://illumium.org/node/11

HX>Говорится, что вроде алгоритм довольно прост, вот только я никак не могу понять его ((( Может кто ПРОСТЕНЬКИЙ пример алгоритма приведет ну или хотя бы ПОНЯТНЫЙ док с псевдокодом ...


HX>Спасибо!

Очень интересно... Жаль, не имею на хабре id-шника... А так, интересно, кто-нибудь реализовывал что-нить подобное в Monte Carlo моделях движения частиц на решетке с ограниченным числом вакантных мест?
Re: Particle Swarm Optimization в избранное  новое    модер.  /!\ More Sharing Services
От: minorlogicСтат. 
Дата: 06.03.11 15:35
Недавно искал простой алгоритм оптимизации.

Пробовал PS и (монте карло + градиент + мутации) оказалось что PS в моих задачах работал на порядки медленнее. Для себя описаний , в каких условиях PS работает оптимально, не нашел.

Поделитесь инфой если что то накопаете плс .
... << RSDN@Home 1.2.0 alpha 4 rev. 1237>>
Ищу работу, 3D, SLAM, computer graphics/vision.