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.