particleswarm основан на алгоритме, описанном в Kennedy и 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 - вектор начальных диапазонов. Диапазон компонентов 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. и К. А. Коэльо Коэльо. «Обработка ограничений в цифровой оптимизации, вдохновленной природой: прошлое, настоящее и будущее». Рой и эволюционные вычисления. 2011, стр 173–194.
[3] Педерсен, М. Е. «Хорошие параметры для оптимизации роя частиц». Люксембург: Hvass Laboratories, 2010.