|

Хореографический интеллект в исполнении роя частиц. С аккомпанементом на Python

Метод оптимизации роя частиц (Pasrticle Swarm Optimization) возник из попыток объяснить синхронное перемещение птичьих или рыбьих стай. Был предложен психологом Джеймом Кеннеди и инженером Расселом Эберхартом, которые в 1995 году выпустили книгу «Swarm Intelligence». В основе их метода лежит эволюционный алгоритм, имитирующий социальное поведение особей стаи.

В поведение группы в целом вносит вклад каждая особь в занимаемом ею пространстве. Их взаимодействие не носит антагонистического характера, поэтому складывается своего рода кооперация, где за счет небольших неудобств для каждого вся популяция в целом выигрывает.

В методе роя частиц имитируютcя элементы живой природы, например, такие, как рой насекомых, косяки рыб, стаи птиц или группы животных, которые перемещаются в пространстве и при этом целенаправленно изменяют свою скорость таким образом, чтобы приблизиться к привлекательным для них местам, например, тем, где расположена пища. Математически это выразится в достижении целевой функцией экстремального (например, минимального) значения.

Про общие принципы методов оптимизации см. здесь ==>>

Базовые принципы оптимизации роя частиц

Метод оптимизации роя частиц работает с совокупностью возможных решений, известных как частицы. У каждой частицы есть положение и скорость в пространстве поиска, и она перемещается, основываясь на своем собственном опыте и опыте своих соседей. К основным компонентам, управляющим движением частиц, относятся:

  • Личная лучшая позиция (p_best): Лучшее решение, найденное отдельной частицей.
  • Глобальная лучшая позиция (g_best): Лучшее решение, найденное как среднее по всем частицам роя.

Для каждого положения частицы вычисляется значение целевой функции, в соответствии с которым в следующий момент времени частица меняет свое положение и скорость в пространстве поиска ресурсов по определенным правилам.

Наблюдения за реальными стаями птиц дали, например, следующие очень простые правила:

  • Один курс: Двигаться в том же направлении, что и соседи
  • Не отрываться: Держаться близко к группе (никаких одиночек!)
  • Не сталкиваться: Держимся вместе, но локтями не толкаемся!

Общая схема решения задач с помощью алгоритма роя частиц

Расчет новых положений и скоростей частиц

В этом алгоритме положения частиц рассчитываются исходя из текущего положения и скоростей изменения свойств частиц.

В начале частицы либо жестко зафиксированы, либо разбросаны случайным образом по всей области поиска.

Каждая частица имеет случайный вектор скорости. В каждой точке, где побывала частица, рассчитывается значение целевой функции. При этом запоминается персональное лучшее значение целевой функции (с соответствующими параметрами) частицы.

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

Обновление положения частиц

В движении частиц от итерации к итерации принимаются во внимание 3 компонента.

p_new = inertia + cognitive + social

Где

p_new – новое положение частицы
inertia – Инерциальная составляющая
cognitive – Когнитивная составляющая
social – Социальная составляющая

Компоненты:

Инерционный

Инерция — сопротивление движению или изменению направления движения конкретной частицы. Складывается из величины инерции и текущей скорости частицы. Итоговое значение инерции выражается в диапазоне от 0 до 1.

inertia = inertia_koef * v_cur

Где

inertia – Инерциальная составляющая
inertia_koef – Коэффициент инерции
v_cur – Текущая скорость

Коэффициент инерции, близкий к 0, приводит к медленному поиску лучшего решения (больше итераций). Увеличение значения в сторону 1 приводит к более быстрому результату, с меньшим числом итераций. В последнем случае увеличивается риск ненахождения глобального минимума (для сложных функций, имеющий несколько как глобальных, так и локальных минимумов). Также увеличивается риск ненахождения решения вообще.

Когнитивный

Отражает степень принятия во внимание собственной лучшей позиции частицы.

cognitive = cognitive_acceleration * (g_best - p_best)

Когнитивное ускорение:

cognitive_acceleration = cognitive_const * cognitive_rnd 

Где

cognitive_const – Когнитивная константа. Число большее 0 и меньшее 2. Чем значение больше, тем выше весомость собственных данных частицы.
cognitive_rnd – Когнитивное случайное число от 0 до 1.

Социальный

Отражает степень принятия во внимание лучшей позиции всех частиц роя.

social = social_acceleration * (g_best - p_best)

Социальное ускорение:

social_acceleration = social_const * social_rnd 

Где

social_const – Социальная константа. Число большее 0 и меньшее 2. Чем выше это значение, тем весомее групповые данные всех частиц роя.
social_rnd – Социальное случайное число от 0 до 1.

Значение социальной константы также меняется от 0 до 2. Чем выше это значение, тем весомее групповые данные всех частиц роя.

Обновление скоростей частиц

Новые скорости рассчитываются аналогично расчету новых положений.

v_new = inertia + cognitive + social

Реализация алгоритма роя частиц на Python

Для реализации алгоритма была выбрана не просто самая простая n-мерная сферическая функция для оптимизации. А более того – ее простейший вариант, 2-мерная круговая плоская функция, описывающая позиции как координаты в измерениях X и Y и имеющая решение X = 0, Y = 0.

При создании роя начальная точка, которая является центром случайного распределения частиц смещена относительно решения: X = 6, Y = -3.

Код был написан на языке Python 3.11. Выполнялся во фреймворке Google Colaboratory.

Код Python скрипта

# Целевая функция
def sphere(x, bias):
    total=0
    for i in range(len(x)):
        total+=(x[i])**2
    return total
#--- IMPORT DEPENDENCIES ------------------------------------------------------+

from random import random
from random import uniform

#--- MAIN ---------------------------------------------------------------------+
# КЛАСС
class Particle:
    def __init__(self, x0, bias):
        self.position_i=[]          # Положение частиц
        self.velocity_i=[]          # Скорость частиц
        self.pos_best_i=[]          # Лучшие положения частиц
        self.err_best_i=-1          # Лучшая ошибка частицы
        self.err_i=-1               # Ошибка частицы

        for i in range(0,num_dimensions):
            self.velocity_i.append(uniform(-1,1))
            self.position_i.append(uniform(-1,1))

    # Расчет текущего значения целевой функции
    def evaluate(self,costFunc, bias):
        self.err_i=costFunc(self.position_i, bias)

        # check to see if the current position is an individual best
        if self.err_i<self.err_best_i or self.err_best_i==-1:
            self.pos_best_i=self.position_i.copy()
            self.err_best_i=self.err_i

    # Расчет нового значения скорости частицы
    def update_velocity(self,pos_best_g):
        w=0.5       # Константа инерции относительно предыдущей скорости
        c1=1        # Когнитивная константа
        c2=2        # Социальная константа

        for i in range(0,num_dimensions):
            r1=random()
            r2=random()

            vel_cognitive=c1*r1*(self.pos_best_i[i]-self.position_i[i])
            vel_social=c2*r2*(pos_best_g[i]-self.position_i[i])
            self.velocity_i[i]=w*self.velocity_i[i]+vel_cognitive+vel_social

    # Расчет нового положения частицы по новой скорости
    def update_position(self,bounds):
        for i in range(0,num_dimensions):
            self.position_i[i]=self.position_i[i]+self.velocity_i[i]

            # Коррекция выхода за пределы максимального значения позиции
            if self.position_i[i]>bounds[i][1]:
                self.position_i[i]=bounds[i][1]

            # Коррекция выхода за пределы минимального значения позиции
            if self.position_i[i]<bounds[i][0]:
                self.position_i[i]=bounds[i][0]


# Главная функция с циклом обработки
def PSO(costFunc, x0, bounds, num_particles, maxiter, verbose=False, error_limit = 0.01):
    global num_dimensions

    num_dimensions=len(x0)
    err_best_g=-1                   # Лучшая ошибка роя
    pos_best_g=[]                   # Лучшая позиция роя

    # Создание роя
    bias = [6.0, -3.0]
    swarm=[]
    for i in range(num_particles):
        pos = Particle(x0, bias)
        xx = pos.position_i
        print(i, xx)
        swarm.append(pos)

    # Начало цикла оптимизации
    i=0
    while i<maxiter:

        # Цикл по частицам роя, с расчетом целевой функции
        for j in range(0,num_particles):
            swarm[j].evaluate(costFunc, bias)

            # Выбор текущей частицы как лучшей (глобальной) для роя
            if swarm[j].err_i<err_best_g or err_best_g==-1:
                pos_best_g=list(swarm[j].position_i)
                err_best_g=float(swarm[j].err_i)

        # Цикл обновления позиций и скоростей частиц роя
        for j in range(0,num_particles):
            swarm[j].update_velocity(pos_best_g)
            swarm[j].update_position(bounds)
        i+=1

        if verbose:
          print(f'Итерация: {i:>4d}, Ошибка: {err_best_g:10.6f} Координаты  X, Y: {pos_best_g}')

        if err_best_g < error_limit:
          break

    # Печать окончательного результата
    if verbose:
        print(f'\nРешение с ошибкой < {error_limit} найдено за {i-1} итераций')
        print(f'   >  Ошибка: {err_best_g}  Координаты  X, Y: {pos_best_g}')

    return err_best_g, pos_best_g

#--- END ----------------------------------------------------------------------+

Выполнение скрипта

Генерируем случайные положения и скорости 300 частиц, центрированных вокруг X = 0, Y = 0 и разбросом значений от -15 до +15.

#--- RUN ----------------------------------------------------------------------+
# zero - centered initial data
initial=[5,5]               # Начальная стартовая позиция [x1,x2...]
bounds=[(-15,15),(-15,15)]  # Границы решения [(x1_min,x1_max),(x2_min,x2_max)...]


err_lim = 0.000001
PSO(sphere,initial,bounds,num_particles=300, maxiter=300, verbose=True, error_limit=err_lim)

#--- END -

Журнал выполнения скрипта

Итерация:    1, Ошибка:   1.993344 Координаты  X, Y: [1.4008788742607452, -0.17573376313227573]
Итерация:    2, Ошибка:   0.026502 Координаты  X, Y: [0.11284225996849173, -0.11733988617960289]
Итерация:    3, Ошибка:   0.026502 Координаты  X, Y: [0.11284225996849173, -0.11733988617960289]
Итерация:    4, Ошибка:   0.014909 Координаты  X, Y: [0.053319011695837304, -0.1098451562192628]
Итерация:    5, Ошибка:   0.006643 Координаты  X, Y: [-0.04374567027076404, 0.06877351440446589]
Итерация:    6, Ошибка:   0.006643 Координаты  X, Y: [-0.04374567027076404, 0.06877351440446589]
Итерация:    7, Ошибка:   0.002830 Координаты  X, Y: [0.027178932425718783, 0.04573069196137777]
Итерация:    8, Ошибка:   0.002685 Координаты  X, Y: [-0.04987112050741349, -0.014061180193128103]
Итерация:    9, Ошибка:   0.000855 Координаты  X, Y: [0.015649990082417964, 0.02469394088986021]
Итерация:   10, Ошибка:   0.000014 Координаты  X, Y: [0.0023353839592563305, -0.0029006523481716062]
Итерация:   11, Ошибка:   0.000014 Координаты  X, Y: [0.0023353839592563305, -0.0029006523481716062]
Итерация:   12, Ошибка:   0.000014 Координаты  X, Y: [0.0023353839592563305, -0.0029006523481716062]
Итерация:   13, Ошибка:   0.000014 Координаты  X, Y: [0.0023353839592563305, -0.0029006523481716062]
Итерация:   14, Ошибка:   0.000014 Координаты  X, Y: [0.0023353839592563305, -0.0029006523481716062]
Итерация:   15, Ошибка:   0.000014 Координаты  X, Y: [0.0023353839592563305, -0.0029006523481716062]
Итерация:   16, Ошибка:   0.000014 Координаты  X, Y: [0.0023353839592563305, -0.0029006523481716062]
Итерация:   17, Ошибка:   0.000008 Координаты  X, Y: [-0.0012308663100170161, -0.002517738660911684]
Итерация:   18, Ошибка:   0.000001 Координаты  X, Y: [-0.0009478210682037065, 0.0004899019048626684]
Итерация:   19, Ошибка:   0.000001 Координаты  X, Y: [-0.0009478210682037065, 0.0004899019048626684]
Итерация:   20, Ошибка:   0.000000 Координаты  X, Y: [0.0003252710794947244, 2.0358954456239572e-05]

Решение с ошибкой < 1e-06 найдено за 19 итераций
   >  Ошибка: 1.0621576218221456e-07  Координаты  X, Y: [0.0003252710794947244, 2.0358954456239572e-05]
(1.0621576218221456e-07, [0.0003252710794947244, 2.0358954456239572e-05])

Результат выполнения

Алгоритм сходится и выполняется очень быстро.

300 точек изначально разбросанные случайным образом с нормальным распределением вокруг точки X = 6, Y = -3 стянулись к решению за 19 итераций, занявших менее 1 минуты.

Применение алгоритма роя частиц

Оптимизация роя частиц (PSO) была успешно реализована в различных реальных приложениях в различных областях. Вот несколько примечательных примеров:

  1. Robotic Control – Роботизированное управление: PSO используется для оптимизации параметров управления роботизированными манипуляторами, повышая их точность и оперативность в таких задачах, как сварка и обработка материалов. Было показано, что нечеткий ПИД-контроллер в сочетании с PSO значительно улучшает управление крутящим моментом в роботизированных приложениях.
  2. Engineering Design – Инженерное проектирование: В инженерном деле PSO применяется для оптимизации конструкций и механических систем, что позволяет эффективно использовать ресурсы и улучшать эксплуатационные характеристики.
  3. Neural Network Training – Обучение нейронных сетей: PSO помогает оптимизировать веса нейронных сетей, повышая эффективность их обучения и точность в таких задачах, как распознавание образов и классификация.
  4. Image Processing Обработка изображений: Алгоритмы PSO используются для сегментации и улучшения изображения, эффективно группируя пиксели на основе их характеристик для улучшения качества изображения.
  5. Financial ForecastingФинансовое прогнозирование: В сфере финансов PSO используется для оптимизации торговых стратегий и управления портфелем путем анализа исторических данных с целью прогнозирования будущих рыночных тенденций.
  6. Data ClusteringКластеризация данных: PSO используется в алгоритмах кластеризации для эффективной группировки больших наборов данных, что упрощает выявление закономерностей и идей в данных.
  7. Renewable Energy OptimizationОптимизация использования возобновляемых источников энергии: PSO оптимизирует размещение и эксплуатацию возобновляемых источников энергии, таких как ветряные турбины и солнечные батареи, для максимизации выработки энергии при минимизации затрат.
  8. TelecommunicationsТелекоммуникации: Применяется для оптимизации сетевых конфигураций и распределения ресурсов в телекоммуникационных системах, повышения эффективности передачи данных.
  9. Healthcare ApplicationsПриложения для здравоохранения: PSO помогает в системах медицинской диагностики, оптимизируя алгоритмы выбора признаков и классификации, что приводит к повышению точности обнаружения заболеваний.
  10. Route OptimizationОптимизация маршрута: PSO используется для решения задач маршрутизации транспортных средств, помогая логистическим компаниям оптимизировать маршруты доставки для снижения затрат и увеличения времени обслуживания.
  11. Supply Chain ManagementУправление цепочками поставок: Компании используют PSO для управления запасами и оптимизации распределения, обеспечивая эффективную работу цепочки поставок.
  12. Manufacturing ProcessesПроизводственные процессы: На производстве PSO оптимизирует производственные графики и работу оборудования, сокращая время простоя и увеличивая производительность.
  13. Environmental MonitoringМониторинг окружающей среды: PSO применяется для оптимизации размещения датчиков в системах мониторинга окружающей среды, обеспечивая эффективный сбор данных при минимизации затрат.
  14. Smart Grid Management – Интеллектуальное управление энергосистемой: Это помогает оптимизировать распределение энергии в интеллектуальных сетях, повышая надежность и эффективность систем электроснабжения.
  15. Agricultural Optimization – Оптимизация сельского хозяйства: PSO используется в точном земледелии для оптимизации стратегий посадки и распределения ресурсов в зависимости от условий окружающей среды и требований к урожаю.
  16. Game DevelopmentРазработка игр: В играх PSO может оптимизировать поведение игрового ИИ, регулируя параметры, которые управляют движениями персонажа или процессами принятия решений.
  17. Structural Health MonitoringМониторинг состояния конструкций: PSO помогает оценить состояние конструкций за счет оптимизации сенсорных сетей, которые отслеживают вибрации и уровни нагрузки в режиме реального времени.
  18. Traffic Flow OptimizationОптимизация транспортных потоков: Города используют PSO для оптимизации сигналов светофора, чтобы улучшить транспортный поток и уменьшить заторы в часы пик.
  19. Robust Control SystemsНадежные системы управления: В инженерии управления PSO используется для разработки надежных контроллеров, которые могут эффективно справляться с неопределенностями в динамических системах.
  20. BioinformaticsБиоинформатика: PSO помогает оптимизировать процессы отбора генов для моделей классификации рака, повышая точность прогнозной аналитики в исследованиях геномики.

Эти примеры иллюстрируют универсальность оптимизации роя частиц в различных областях, демонстрируя ее эффективность при решении сложных задач оптимизации с помощью принципов коллективного разума, вдохновленных природой.

Также может быть интересно: