particleswarm основан на алгоритме, описанном в Кеннеди и Эберхарте [1], с помощью модификаций, предложенных в Месура-Монтесе и Коэльо Коэльо [2] и в Педерсене [3].
Алгоритм роя частицы начинается путем создания начальных частиц и присвоения их начальные скорости.
Это выполняет целевую функцию в каждом местоположении частицы и определяет лучшее (самое низкое) значение функции и лучшее расположение.
Это выбирает новые скорости, на основе текущей скорости, отдельного лучшего местоположения частиц и лучшего местоположения их соседей.
Это затем итеративно обновляет местоположения частицы (новое местоположение является старым плюс скорость, измененная, чтобы сохранить частицы в границах), скорости и соседи.
Итерации продолжают, пока алгоритм не достигает останавливающегося критерия.
Вот детали шагов.
По умолчанию particleswarm создает частицы наугад однородно в границах. Если существует неограниченный компонент, particleswarm создает частицы со случайным равномерным распределением от –1000 до 1 000. Если у вас есть только один связанный, particleswarm переключает создание, чтобы иметь связанное как конечную точку и интервал создания 2 000 широких. 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 выполняет итерации, пока он не достигает останавливающегося критерия.
| Остановка опции | Остановка теста | Exitflag |
|---|---|---|
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] Кеннеди, J. и Р. Эберхарт. "Оптимизация Роя частицы". Продолжения Международной конференции IEEE по вопросам Нейронных сетей. Перт, Австралия, 1995, стр 1942–1945.
[2] Mezura-Montes, E. и К. А. Коэльо Коэльо. "Обработка ограничения во вдохновленной природой числовой оптимизации: Прошлое, настоящее и будущее". Роитесь и Эволюционное Вычисление. 2011, стр 173–194.
[3] Педерсен, M. E. "Хорошие параметры для оптимизации роя частицы". Люксембург: лаборатории Hvass, 2010.