particleswarm
основан на алгоритме, описанном в Kennedy and Eberhart [1], с использованием модификаций, предложенных в Mezura-Montes и Coello Coello [2] и в Pedersen [3].
Алгоритм роя частиц начинается с создания начальных частиц и присвоения им начальных скоростей.
Он оценивает целевую функцию в каждом местоположении частицы и определяет лучшее (самое низкое) значение функции и лучшее местоположение.
Он выбирает новые скорости, основанные на текущей скорости, отдельных лучших местоположениях частиц и лучших местоположениях их соседей.
Затем он итерационно обновляет местоположения частиц (новое местоположение является старым плюс скорость, модифицированная, чтобы сохранить частицы в границах), скорости и соседи.
Итерации продолжаются до тех пор, пока алгоритм не достигнет критерия остановки.
Вот подробные сведения о шагах.
По умолчанию, particleswarm
создает частицы случайным образом равномерно в границах. Если существует неограниченный компонент, particleswarm
создает частицы со случайным равномерным распределением от -1000 до 1000. Если у вас есть только одна граница, particleswarm
смещает создание так, чтобы граница была конечной точкой и интервалом создания 2000 в ширину. Частицы i
имеет положение x(i)
, который является вектором-строкой с nvars
элементы. Управление размахом начального роя с помощью InitialSwarmSpan
опция.
Точно так же, particleswarm
создает начальные скорости частиц v
случайным образом равномерно в пределах области значений [-r,r]
, где r
- вектор начальных ranges. Область значений компонентов k
является min(ub(k) - lb(k),InitialSwarmSpan(k))
.
particleswarm
определяет целевую функцию для всех частиц. Он записывает текущее положение p(i)
каждой частицы i
. В последующих итерациях p(i)
будет местом расположения наилучшей целевой функции, которая i частицы
нашел. И b
является лучшим по всем частицам: b = min(fun(p(i)))
. d
является ли местоположение таким, что b = fun(d)
.
particleswarm
инициализирует размер окрестности N
на minNeighborhoodSize = max(2,floor(SwarmSize*MinNeighborsFraction))
.
particleswarm
инициализирует инерцию W = max(InertiaRange)
, или если InertiaRange
отрицательно, задает W = min(InertiaRange)
.
particleswarm
инициализирует счетчик остановки c = 0
.
Для удобства обозначения установите переменную y1 = SelfAdjustmentWeight
, и y2 = SocialAdjustmentWeight
, где SelfAdjustmentWeight
и SocialAdjustmentWeight
являются опциями.
Алгоритм обновляет рой следующим образом. Для i
частиц, который находится в положении
x(i)
:
Выберите случайное подмножество S
от N
частицы, отличные от i
.
Поиск fbest(S)
, лучшая целевая функция среди соседей, и g(S)
, положение соседа с наилучшей целевой функцией.
Для u1
и u2
равномерно (0,1) распределенные случайные векторы длины nvars
, обновить скорость
v = W*v + y1*u1.*(p-x) + y2*u2.*(g-x)
.
Это обновление использует взвешенную сумму:
Предыдущая скорость v
Различие между текущим положением и лучшим положением, которое видела частица p-x
Различие между текущей позицией и лучшей позицией в текущей окрестности g-x
Обновите положение x = x + v
.
Применить ограничения. Если какой-либо компонент x
находится вне границы, установите ее равной этой границе. Для тех компонентов, которые были только что установлены на границу, если скорость v
из этих точек компонента вне границы установите этот компонент скорости в нуль.
Оцените целевую функцию f = fun(x)
.
Если f < fun(p)
, затем установите p = x
. Этот шаг гарантирует p
имеет лучшее положение, которое видела частица.
Следующие шаги алгоритма применяются к параметрам всего роя, а не к отдельным частицам. Рассмотрим наименьший f = min(f(j))
среди частиц j
в рое.
Если f < b
, затем установите b = f
и d = x
. Этот шаг гарантирует b
имеет лучшую целевую функцию в рое, и d
имеет лучшее расположение.
Если на предыдущем шаге лучшее значение функции было понижено, то установите flag = true
. В противном случае flag = false
. Значение flag
используется на следующем шаге.
Обновляйте окрестности. Если flag = true
:
Задайте c = max(0,c-1)
.
Задайте N
на minNeighborhoodSize
.
Если c < 2
, затем установите W = 2*W
.
Если c > 5
, затем установите W = W/2
.
Убедитесь, что W
находится в границах InertiaRange
опция.
Если flag = false
:
Задайте c = c+1
.
Задайте N = min(N + minNeighborhoodSize,SwarmSize)
.
particleswarm
итерация до тех пор, пока не достигнет критерия остановки.
Опция остановки | Остановка теста | Выходной флаг |
---|---|---|
MaxStallIterations и FunctionTolerance | Относительное изменение наилучшего значения целевой функции g за последнее MaxStallIterations итерации меньше FunctionTolerance . | 1 |
MaxIterations | Количество итераций достигает MaxIterations . | 0 |
OutputFcn или PlotFcn | OutputFcn или PlotFcn может остановить итерации. | -1 |
ObjectiveLimit | Лучшее значение целевой функции g меньше ObjectiveLimit . | -3 |
MaxStallTime | Лучшее значение целевой функции g не изменился в последнем MaxStallTime секунд. | -4 |
MaxTime | Время выполнения функции превышает MaxTime секунд. | -5 |
Если particleswarm
останавливается с выходным флагом 1
он опционально вызывает гибридную функцию после выхода.
[1] Кеннеди, Дж., и Р. Эберхарт. Оптимизация роя частиц. Материалы Международной конференции IEEE по нейронным сетям. Перт, Австралия, 1995, с. 1942-1945.
[2] Mezura-Montes, E., and C. A. Coello Coello. «Управление ограничениями в естественной численной оптимизации: прошлое, настоящее и будущее». Рой и эволюционные расчеты. 2011, стр 173–194.
[3] Педерсен, М. Е. «Хорошие параметры для оптимизации роя частиц». Люксембург: Hvass Laboratories, 2010.