Предпредисловие
По обратной связи было решено довести до ума данный пост, так что надеюсь, что теперь его чтение станет более приятным и информативным занятием. Постарался по максимуму учесть все пожелания.
Предисловие
Как я уже писал ранее: есть желание освещать эвристические методы (как достаточно распространенные, так и неизвестные). Данный пост предназначался для того, чтобы понять, будет ли данная тема вам интересна. Что ж, будем надеяться, что я не ошибся. Первый метод, с которым хотелось бы познакомить читателей — метод гармонического поиска (HS).
![image](https://habrastorage.org/storage3/392/7ea/45f/3927ea45fac9ad3aad7dc82e831b9a1a.jpg)
Историческая справка
Итак, с чего же все началось? А началось все не так давно. В 2001 году Geem разработал и предложил свой алгоритм гармонического поиска (Harmony Search, или HS). Некоторые авторы заявляют, что навеян данный алгоритм был игрой джаз-музыкантов, другие говорят, что в основе лежит просто процесс создания приятной мелодии. Сути это не меняет. Важно лишь то, что опытный музыкант может достаточно быстро как сыграться с другими музыкантами, так и сымпровизировать что-нибудь прекрасное. Это и легло в основу алгоритма.
Стратегия
Классический HS оперирует понятием гармонической памяти (по аналогии с родительским пулом генетических алгоритмов). Здесь хранятся вектора, представляющие приближенные решения задачи оптимизации. Изначально они генерируются случайным образом в области, которая исследуется на наличие максимума или минимума (в зависимости от того, что вам нужно). Размер этой памяти, естественно, ограничен. Далее начинается
Сама импровизация заключается в следующем:
- генерируется пробный вектор (либо абсолютно случайно, либо с использованием векторов из памяти),
- пробный вектор модифицируется (происходит небольшой сдвиг в компонентах, если пробный вектор был создан с помощью памяти),
- модифицированный пробный вектор заменяет худший из имеющихся в памяти.
Для тех, кого интересует более подробное описание алгоритма
План самого алгоритма был вероломно взят из [3]. Добавим немного формул, чтобы все это приняло более осмысленный вид. Итак, имеем некоторую функцию
, которую необходимо минимизировать, и область поиска
(для простоты предполагаем ее многомерным прямоугольным параллелепипедом), в которой точка минимума, а точнее ее приближение, и будет искаться. Следующим шагом генерируем в нашей области поиска начальные гармоники
(случайным образом). Величина
задается пользователем, и, как несложно догадаться, указывает на количество гармоник, которые могут храниться в памяти. Кроме этого, пользователь еще должен задать
— вероятность выбора из гармоник в памяти,
— вероятность модификации и
— величину той самой модификации. Теперь, когда все приготовления сделаны, с чистой совестью можем приступать творить музыку минимизировать функцию. Итеративная часть продолжается до выполнения критерия остановки алгоритма. Им может быть либо ограничение по количеству итераций, либо количество прогонов без обновления памяти гармоник, либо близость добавляемой гармоники в смысле той или иной метрики. Все зависит от вашего желания. В ходе итеративной части происходит следующее:
Алгоритм
План самого алгоритма был вероломно взят из [3]. Добавим немного формул, чтобы все это приняло более осмысленный вид. Итак, имеем некоторую функцию
![image](https://habrastorage.org/storage3/da2/1b0/65d/da21b065d72fe91ea2004dc88f57bf4a.gif)
![](https://habrastorage.org/storage3/41b/d63/f05/41bd63f0578e908e28a14145f18701ae.gif)
![](https://habrastorage.org/storage3/7cc/88d/288/7cc88d2888ad7919a6aea26e57e714e7.gif)
![](https://habrastorage.org/storage3/da4/141/9a9/da41419a9d9708b29f00ad48abd4245d.gif)
![](https://habrastorage.org/storage3/f97/267/d86/f97267d8602c07a94410099331e1a240.gif)
![](https://habrastorage.org/storage3/6bc/0ef/8ac/6bc0ef8ac3d4d80b43c4dfa1e4b86668.gif)
![](https://habrastorage.org/storage3/17c/544/12f/17c54412f5be5b1aa62f12daac11057b.gif)
- Создаем нулевую новую гармонику
.
- Далее для каждой компоненты гармоники выполняем следующее: генерируем случайное число
, равномерно распределенное от нуля до единицы. Если
меньше, чем
, то в текущую компоненту записываем соответствующую компоненту из наугад выбранной гармоники из памяти. В противном случае компонента генерируется случайно, с учетом принадлежности соответствующей компоненте области поиска
. Если компонента была сгенерирована с использованием памяти, то, возможно, она подлежит модификации. Для этого опять генерируется случайное число
, равномерно распределенное от нуля до единицы. Если
меньше, чем
, то компонента меняется на величину
, где
— случайная величина, равномерно распределенная от
до
.
- Если
, то
заменяет
(происходит обновление памяти).
Pros and Cons
Плюсы:
- простота (как реализации, так и понимания). Действительно, алгоритм не нагроможден операциями (по сути лишь генерация случайных чисел и модификация вектора);
- достаточно малое количество настраиваемых параметров и наличие рекомендаций по выбору параметров;
- является методом нулевого порядка (отпадает необходимость численного дифференцирования, а, следовательно, все сопутствующие этому процессу сложности);
- метод легко и удобно встраивается в другие методы (например, в меметические алгоритмы, или в качестве дополнительного контура генетического алгоритма).
Минусы:
- низкая скорость сходимости;
- на мой взгляд метод плохо применим для решения задач больших размерностей (как и метод симуляции отжига) из-за простоты составляющих метод операций (в этом случае те же генетические алгоритмы работают на порядок быстрее).
Использованные источники
- Zong Woo Geem, Music-Inspired Harmony Search Algorithm (издательство Springer),
- Википедия,
- Статья под авторством Chukiat Worasucheep (есть ссылки на вариации HS),
- Статья Xin-She Yang, одного из моих любимых авторов и ученых.
Послесловие
Хочу завести добрую традицию — определять голосованием тему будущего поста. Так что просьба ко всем неравнодушным проголосовать за тему следующего поста.
Only registered users can participate in poll. Log in, please.
Какой алгоритм описать в следующем посте?
32% Grenade Explosion Method8
8% Fireworks Algorithm2
60% Gravitational Search15
25 users voted. 11 users abstained.