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.