Глава 6: Создание оптимизатора на основе алгоритма оптимизации роем частиц

Мы начнем наше исследование фреймворков оптимизации с одного из самых мощных и простых в использовании оптимизаторов, известного как оптимизация роем частиц (или PSO). Этот оптимизатор получил свое название от биологического явления «роя», например, пчел или скворцов. В таких роях большие группы особей ведут себя кооперативно, больше напоминая один большой организм, чем сумму его частей. Название подходит, потому что оптимизатор имитирует движение роя в попытке решить сложные задачи оптимизации, для которых он разработан. Фактически, многие из других оптимизаторов, которые мы обсудим позже в книге, названы аналогично в честь таких типов природных явлений.

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

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

В этой главе мы рассмотрим внутреннюю работу PSO, а также некоторые из его наиболее важных вариантов, с упором на оптимизатор Светлячков. Мы также покажем, как PSO может быть реализован в Julia. Завершим главу рассмотрением некоторых полезных соображений относительно PSO и резюме ключевых моментов этой главы.

Алгоритм PSO

Логика, лежащая в основе PSO, заключается в наличии набора потенциальных решений (подобных рою частиц), которые постоянно развиваются, становясь все лучше и лучше, основываясь на некоторой функции приспособленности, которую система пытается максимизировать или минимизировать. Частицы «движутся» с varying скоростями по нескольким измерениям (также называемым переменными), под влиянием наиболее эффективной частицы, так что они коллективно достигают оптимального решения эффективным способом.

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

Все эти особенности делают алгоритм PSO идеальным для оптимизации параметров сложной системы. PSO относительно новый алгоритм; его создатели, доктор Эберхарт и доктор Кеннеди, изобрели его в 1995 году. Псевдокод PSO выглядит следующим образом:

Для каждой частицы в рое
Инициализировать частицу, установив случайные значения
в ее начальное состояние
Конец
Выполнять
Для каждой частицы в рое
Вычислить значение приспособленности
Если значение приспособленности лучше, чем
лучшее значение приспособленности в ее истории (pBest): pBest
<-- значение приспособленности частицы
Конец
gBest <-- частица с лучшим значением приспособленности из
всех частиц в рое
Для каждой частицы
Вычислить скорость частицы согласно
уравнению А
Обновить положение частицы согласно
уравнению В
Конец
Повторять До достижения максимального числа итераций ИЛИ
достижения минимального критерия ошибки

Ключевые уравнения для обновления скорости и положения частицы, соответственно, следующие:

eq. A: v[] += c1 * rand() * (pbest[] - present[])
+ c2 * rand() * (gbest[] - present[])
eq. B: present[] += v[]

Обратите внимание, что c1 и c2 — это параметры алгоритма PSO, каждый из которых имеет значение по умолчанию 2.0 (хотя можно использовать любые значения от 0.0 до 4.0), при этом значение каждого из них не зависит от значения другого. Также скорость частицы для любого заданного измерения ограничена Vmax (другой параметр, устанавливаемый пользователем), чтобы избежать выхода частиц из-под контроля (что дестабилизировало бы весь процесс). Точное значение этого параметра зависит от задачи.

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

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

Основные варианты PSO

Подобно большинству хорошо зарекомендовавших себя алгоритмов в ИИ, PSO имеет свои варианты, большинство из которых лучше подходят для решения определенных задач. Наиболее важные из этих вариантов:

  • PSO с инерцией (Ши и Эберхарт): вариант PSO, который использует «вес инерции» (обычно около 0.9), который постепенно уменьшается, позволяя сужать область поиска со временем. Это позволяет PSO переключаться с исследовательского на эксплуатационный режим, давая более точные решения.
  • PSO с оператором соседства (Сугантан): популярный вариант PSO, который учитывает другие частицы в том же соседстве. Идея заключается в том, что с помощью этого метода шансы застрять в локальном оптимуме значительно снижаются, что делает всю систему более надежной.
  • Дискретное PSO (Кеннеди и Эберхарт): вариант PSO, который позволяет решать задачи дискретной оптимизации.
  • Ограничительный PSO (Клерк и Кеннеди): версия PSO, которая не использует параметр Vmax. Она контролирует скорости, вводя несколько дополнительных параметров, одним из которых является коэффициент ограничения χ (предлагаемое значение: 0.7289). Эти параметры гарантируют, что скорость алгоритма остается управляемой, делая PSO сходящимся плавно.
  • Полностью информированный PSO (Мендес и др.): случай Ограничительного PSO, где два параметра одинаковы; это обобщается на любое количество частиц. Это позволяет каждой частице находиться под влиянием любой другой частицы, что делает весь процесс более стабильным.
  • Босой PSO (Кеннеди): более легкая версия оригинального алгоритма PSO, в которой полностью отсутствует аспект скорости.
  • Светлячок (Синь-Шэ Ян): несколько иной подход к «движущейся» части алгоритма. Мы рассмотрим это подробнее в следующем разделе.

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

Оптимизатор "Светлячок"

Оптимизатор "Светлячок" — один из самых интересных вариантов PSO; фактически, он достаточно уникален, чтобы считаться отдельным оптимизатором для многих людей. Однако, при детальном рассмотрении становится ясно, что оптимизатор "Светлячок" — это более творческий подход к ключевым компонентам PSO.

Несмотря на то, что "Светлячок" разделяет те же принципы, что и PSO, пара заметных отличий придает ему свою нишу. Во-первых, каждая частица притягивается всеми другими частицами, а не только лучшей. Это напоминает полностью информированный вариант PSO.

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

Помимо всего этого, алгоритм Светлячка следует той же стратегии, что и алгоритм PSO. Вы можете прочитать подробности алгоритма Светлячка в его документации.12

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

PSO в сравнении с другими методами оптимизации

Несколько методов оптимизации похожи на PSO, но не являются частью его таксономии. Двумя наиболее известными из них являются оптимизация колонии муравьев (ACO) и генетические алгоритмы (GAs). Обратите внимание, что оба этих алгоритма также являются частью семейства эволюционных вычислений (EC).

Несмотря на сходство с PSO, ACO использует вероятностный подход к оптимизации. Весь фреймворк напоминает хаотическую систему, где феромоны играют роль аттракторов. Феромоны — это влияющие силы, которые решение оказывает на другие решения. Потенциальные решения называются «муравьями» вместо частиц, но идея та же. Более того, ACO породил свой собственный набор вариантов и аналогичных методов, таких как оптимизация пчелиной колонии (BCO).

Что касается ГА, они включают множество тонких настроек решений, как путем случайных изменений, так и путем взаимодействий с другими решениями. Более того, они включают кодирование каждого решения в бинарный паттерн. Мы подробно рассмотрим оптимизацию ГА в следующей главе. Хотя ГА универсальны с точки зрения типа задач, которые они могут решать, они редко используются для оптимизации непрерывных переменных. Это связано с тем, что они не так хорошо работают, как PSO и другие аналогичные методы в семействе EC.

Реализация PSO в Julia

PSO легко реализовать на любом языке программирования. Для простоты и производительности мы будем использовать Julia (версия 1.0) для этого и всех других методов оптимизации в этой книге. Обратите внимание, что реализация PSO уже доступна на Github.13 Однако маловероятно, что вы найдете более полную реализацию, чем та, которую мы предоставляем здесь, поскольку немногие программисты на Julia глубоко углублялись в эту тему.

Реализация PSO в этом разделе принимает в качестве входного аргумента функцию приспособленности ff, которая, в свою очередь, принимает на вход массив чисел. Таким образом, PSO никак не узнает, с каким количеством переменных он имеет дело, поскольку в функции ff нет ничего, что указывало бы на это. В результате количество переменных для оптимизации также необходимо включать в ее входные данные (переменная nv). Эмпирически установлено, что рой размером примерно в 10 раз больше

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

function pso(ff::Function, nv::Int64,
minimize::Bool = true, ps::Int64 = 10*nv,
ni::Int64 = 2000, c = [2.0, 2.0], maxv = 2.0, iwp
= 50)
buffer = div(iwp, 2)
ni += iwp
tol = 1e-6
PP = randn(ps, nv) # population
positions
PV = randn(ps, nv) # population
velocities
PC = Array{Float64}(undef, ps) # population
costs (scores)
Pp_best = copy(PP) # particle’s
best position
gb = Array{Float64}(undef, ni) # global best
over time
if minimize
temp = Inf
else
temp = -Inf
end
for I = 1:iwp; gb[I] = temp; end
for I = 1:ps; PC[I] = ff(PP[I,:][:]); end
p_best = copy(PC)
if minimize
m, ind = findmin(PC)
else
m, ind = findmax(PC)
end
gb[1+buffer] = m
Pg_best = PP[ind,:]
for iter = (iwp + 1):ni
for I = 1:ps
PV[I,:] += c[1] * rand() *
(Pp_best[I,:] – PP[I,:]) + c[2] * rand() *
(Pg_best – PP[I,:])
for j = 1:nv
if PV[I,j] > maxv; PV[I,j] =
maxv; end
if PV[I,j] < -maxv; PV[I,j] = -
maxv; end
end
PP[I,:] += PV[I,:]
PC[I] = ff(PP[I,:][:])
gb[iter] = gb[iter – 1]
if minimize
if PC[I] < p_best[I]
p_best[I] = PC[I]
Pp_best[I,:] = PP[I,:]
if PC[I] < gb[iter]
gb[iter] = PC[I]
Pg_best = PP[I,:]
end
end
else # maximizing mode
if PC[I] > p_best[I]
p_best[I] = PC[I]
Pp_best[I,:] = PP[I,:]
if PC[I] > gb[iter]
gb[iter] = PC[I]
Pg_best = PP[I,:]
end
end # of 2nd if
end # of 1st if
end # of I loop
if abs(gb[iter] – gb[iter-iwp]) < tol
return Pg_best, gb[iter] # best
solution and best value respectively
end
end # of iter loop
end
return Pg_best, gb[end] # best solution and
best value respectively
end

Несмотря на свою длину, ядро алгоритма простое, довольно быстрое и относительно нетребовательное к вычислительным ресурсам. Обратите внимание, что большинство параметров являются необязательными, поскольку их значения по умолчанию предопределены. Просто подайте на вход функцию приспособленности и количество переменных, и решите, хотите ли вы минимизировать или нет. Если вы не укажете последнее, метод PSO по умолчанию минимизирует функцию приспособленности.

Обратите внимание, что мы используем здесь «ванильную» версию PSO с минимальными дополнениями. В результате ее производительность невысока. Мы изучим более усовершенствованный скрипт на Julia для PSO в Главе 10, вместе с его распараллеленной версией.

PSO в действии

Первым практическим применением PSO, предложенным его создателями, было обучение ANN. Однако гибкая природа PSO сделала его полезным в различных других областях, таких как комбинаторная оптимизация, обработка сигналов, телекоммуникации, системы управления, анализ данных, проектирование, энергетические системы и многое другое. Также, по мере появления более специализированных алгоритмов для обучения ANN, PSO перестал быть актуальным вариантом для оптимизации весов ANN.

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

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

Тем не менее, некоторые организационные задачи требуют использования

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

Обратите внимание, что, как и любой другой оптимизатор ИИ, PSO не предоставляет наилучшего решения проблемы, а также не обладает математической точностью. Однако он очень эффективен. Таким образом, PSO приносит большую пользу в случаях, когда достаточно приблизительного решения, особенно если время, необходимое для нахождения этого решения, также важно. Более того, когда задачи включают функции, которые не могут быть легко проанализированы математически (например, функции, которые недостаточно «гладкие» для вычисления функции производной), метод, подобный PSO, является наиболее жизнеспособным вариантом.

Минимизация полиномиального выражения

Примеры PSO включают различные задачи, выраженные парой различных функций приспособленности. В первом случае мы рассмотрим задачу минимизации, а во втором — задачу максимизации. Сначала начнем с определения функции приспособленности F для первой задачи, которая включает сложное (сильно нелинейное) полиномиальное выражение:

function F(X::Array{Float64})
return y = X[1]^2 + X[2]^2 + abs(X[3]) +
sqrt(abs(X[4]*X[5])) + 1.0
end

Вы также можете записать приведенную выше функцию как:

F(X::Array{Float64}) = X[1]^2 + X[2]^2 +
abs(X[3]) + sqrt(abs(X[4]*X[5])) + 1.0

Хотя более компактный, это может быть не так полезно для сложных функций

включающих множество переменных.

В любом случае, мы ожидаем получить решение, близкое к (0, 0, 0, 0, 0), поскольку это решение соответствует абсолютному минимуму данной функции (которая в данном случае равна 1.0, так как 0^2 + 0^2 + |0| + sqrt(|0*0|) + 1 = 1).

Далее необходимо запустить алгоритм PSO, используя приведенную выше функцию в качестве входных данных. Мы будем работать со значениями по умолчанию для большинства входных параметров:

pso(F, 5)

При одном из запусков PSO было получено решение [-0.0403686, 0.0717666, -0.0102388, 0.0966982, -0.129386] с оценкой приспособленности примерно 1.243. Хотя это решение не особенно впечатляющее, оно приемлемо, учитывая сложность задачи и тот факт, что мы использовали самую базовую версию оптимизатора.

Мы можем попробовать рой поменьше – например, из 20 частиц – для сравнения:

pso(F, 5, true, 20)

Результатом в этом случае было [0.164684, -0.241848, 0.0640438, -0.0186612, -0.882855] с оценкой приспособленности около 1.388. Дополнительные запуски могут дать лучшие оценки. Это показывает, что системы PSO могут давать приемлемые результаты, даже без большого количества частиц.

Мы можем измерить, сколько времени занимает весь этот процесс, используя метакоманду @time, следующим образом:

@time pso(F, 5)

В данном случае, для решения с сопоставимой приспособленностью, мы узнаем, что весь процесс занял около 0.008 секунд — совсем неплохо. В качестве бонуса мы получаем некоторую информацию о том, сколько вычислительных ресурсов потребляет процесс. А именно, 7.179 МБ ОЗУ через 87.6К выделений. Обратите внимание, что для точности этого отчета команда должна запускаться более одного раза. Это справедливо для всех функций Julia, протестированных с помощью этой мета-команды.

Максимизация экспоненциального выражения

Давайте попробуем что-то более сложное для примера максимизации. Эта задача состоит из шести переменных, одна из которых возведена в 4-ю степень, что делает пространство решений немного более «шероховатым».

Function F2(X::Array{Float64})
return y = exp(-X[1]^2) + exp(-X[2]^2) + exp(-
abs(X[3])) + exp(-sqrt(abs(X[4]*X[5]))) + exp(-
X[6]^4)
end

Как и в предыдущем случае, мы ожидаем получить решение, близкое к (0, 0, 0, 0, 0, 0), поскольку это абсолютный максимум этой функции (который равен 5.0, так как F2(0, 0, 0, 0, 0, 0) = exp(-0^2) + exp(-0^2) + exp(-|0|) + exp(-sqrt(|0*0|)) + exp(-0^4) = 1 + 1 + 1 + 1 + 1 = 5). Чтобы использовать PSO, мы просто набираем:

pso(F2, 6, false)

Полученное решение: [0.370003, 0.0544304, 0.0980422, 0.00426721, -0.011095, 0.294815], соответствующее значению приспособленности около 4.721, что довольно близко к ожидаемому максимальному значению.

Снова посмотрим, сколько времени и вычислительных ресурсов занял весь этот процесс:

@time pso(F2, 6, false)

Общее время выполнения задачи составило около 0.009 секунд, при этом потребовалось около 15.006 МБ памяти и около 183.1К выделений. Очевидно, это несколько более сложная задача, включающая больший рой, поэтому требуется немного больше времени и памяти (хотя накладные расходы довольно малы). Если бы мы решали любую из этих задач с помощью детерминированного оптимизатора, это, вероятно, заняло бы больше времени на том же компьютере.

Советы по PSO

Несмотря на простоту, избегание неоптимальных результатов с PSO требует некоторого внимания к деталям. Например, если вы используете низкое значение для Vmax,

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

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

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

Более того, желательно убедиться, что рой охватывает осмысленную область при развертывании, чтобы гарантировать, что он не застрянет в локальном оптимуме. Другими словами, если вы оптимизируете набор из трех параметров, которые находятся в диапазоне от 0 до 1, лучше всего распределить рой так, чтобы он охватывал максимально возможный объем, а не располагать их все близко к (0, 0, 0). Это потому, что если оптимальное решение близко к (0, 1, 1), например, рою может потребоваться много времени для его достижения.

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

Производительность алгоритма можно значительно улучшить, если его распараллелить. Лучший способ сделать это — определить количество работников, каждый из которых выполняет экземпляр алгоритма, а затем сравнить их результаты, выбрав меньшее или большее из их решений, в зависимости от типа решаемой задачи оптимизации. Убедитесь, однако, что вы используете мета-команду @everywhere перед всеми функциями, иначе распараллеливание не будет работать. Мы более подробно рассмотрим распараллеленную

версия PSO в Главе 10.

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

Резюме

  • Оптимизация роем частиц (PSO) — фундаментальный алгоритм оптимизации под зонтиком природоподобных оптимизаторов. Он также является частью группы систем вычислительного интеллекта, которая является подклассом ИИ.
  • PSO включает набор потенциальных решений, которые постоянно развиваются как группа, становясь все лучше и лучше, основываясь на некоторой функции приспособленности, которую система пытается оптимизировать.
  • Подобно большинству надежных алгоритмов этого типа, PSO идеально подходит для решения сложных, сильно нелинейных задач, обычно включающих множество переменных, таких как параметры сложной системы типа ANN.
  • PSO заметно отличается от оптимизации колонии муравьев (ACO), а также от генетических алгоритмов (Gas). Существуют также некоторые различия между вариантами PSO; различия в основном касаются области применения и специфики метода.
  • Существуют различные версии PSO. Firefly является одним из наиболее примечательных вариантов, отчасти благодаря своему особому подходу к пространству задач.
  • «Рой», используемый в Firefly, представляет собой набор светлячков, притягивающихся друг к другу в зависимости от того, насколько хорошо они работают в функции приспособленности, которую рой пытается оптимизировать. Однако вместо использования скоростей, частицы в этом случае «притягиваются» всеми другими частицами, в зависимости от того, насколько далеко они находятся и насколько «ярко» светят.
  • Firefly, как правило, быстрее и точнее в качестве оптимизатора, по сравнению с PSO (а также с несколькими другими природоподобными
  • оптимизаторами).
  • Оригинальный PSO и большинство его вариантов идеально подходят для оптимизации непрерывных переменных.
  • Функция приспособленности оптимизатора, подобного PSO, не обязательно должна быть дифференцируемой, поскольку ее производные никогда не вычисляются.
  • PSO имеет множество применений, включая обучение ANN, обработку сигналов и комбинаторную оптимизацию. Различные версии PSO могут обрабатывать более сложные сценарии оптимизации, такие как задачи с несколькими целями, задачи с ограничениями и динамические задачи. Одна из версий PSO (дискретный PSO) даже решает задачи дискретной оптимизации.
  • PSO сам по себе не так надежен, как его варианты, но очень полезно знать его. Понимание его оригинальной формы значительно облегчает изучение его вариантов (или создание новых).

https://arxiv.org/pdf/1308.3898.pdf.

https://bit.ly/2NyIiBv.

Предыдущая глава    Следующая глава