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.