preview
Оптимизация атмосферными облаками — Atmosphere Clouds Model Optimization (ACMO): Теория

Оптимизация атмосферными облаками — Atmosphere Clouds Model Optimization (ACMO): Теория

MetaTrader 5Тестер | 24 сентября 2024, 09:31
109 0
Andrey Dik
Andrey Dik

Содержание

  1. Введение
  2. Реализация алгоритма


Введение

В мире современных технологий для алгоритмов оптимизации поиск наилучших решений становится всё более актуальной задачей. Одним из интереснейших подходов к этой проблеме является метаэвристический алгоритм Atmosphere Clouds Model Optimization (ACMO), который, несмотря на свою математическую сложность, можно объяснить просто и наглядно. 

Представьте себе бескрайнее виртуальное небо, где облака формируются и движутся, словно в реальной атмосфере. Погода здесь - это не просто набор условий, а живая система, в которой влажность и атмосферное давление влияют на каждое решение. Вдохновленный природными явлениями, алгоритм ACMO использует принципы формирования облаков, чтобы исследовать пространство решений, подобно тому, как облака формируются, распространяются и исчезают в небесных просторах, стремясь найти оптимальные пути. Алгоритм был предложен авторами Яном и др. и опубликован в 2013 году.

В данной статье мы подробно рассмотрим каждый этап алгоритма ACMO, начиная с подготовки "неба", где рождаются облака как потенциальные решения. Мы проследим за их движением по виртуальному небесному пространству, наблюдая, как они адаптируются и изменяются в зависимости от погодных условий. Погружаясь в этот увлекательный процесс, вы увидите, как облака, сродни исследовательским группам, стремятся найти оптимальные решения в лабиринте возможностей. Давайте вместе раскроем тайны этого алгоритма и поймем, как он работает, шаг за шагом.

Главная идея алгоритма Atmosphere Clouds Model Optimization (ACMO) заключается в моделировании поведения облаков в природе для решения задач оптимизации. Алгоритм использует три ключевых аспекта поведения облаков:
  • Генерация. Облака формируются в областях с высокой влажностью, что позволяет алгоритму исследовать окрестности текущих оптимальных решений.
  • Движение. Облака перемещаются по пространству решений, что способствует распространению популяции и увеличению ее разнообразия. Это помогает избежать застревания в локальных оптимумах.
  • Распространение. Облака рассеиваются по всему пространству поиска, что позволяет алгоритму охватывать более широкий диапазон возможных решений и улучшать шансы на нахождение глобального оптимума.


Реализация алгоритма

Поскольку концепция алгоритма ACMO достаточно сложная для восприятия, мы будем двигаться от простого к сложному. Опишем тезисно как можно проще основную идею алгоритма.

1. Подготовка "неба". Представьте, что мы создаем виртуальное небо. Это небо разделено на множество регионов. В каждой регионе есть своя влажность (качество решений) и атмосферное давление (накопленный опыт поиска).

2. Рождение облаков. Облака появляются только в самых "влажных" регионах. Каждое облако состоит из множества капель, и каждая капля - это потенциальное решение нашей задачи.

3. Движение облаков. Облака практически никогда не стоят на месте. Они двигаются из регионов с высоким давлением в регионы с низким давлением. Это подобно тому, как ветер дует от области высокого давления к области низкого давления в реальной атмосфере.

4. Изменение формы облаков. Пока облака двигаются, они становятся больше. Степень увеличения размера облаков зависит от разности давлений между регионами.

5. Испарение. С каждым шагом облака теряют немного своих капель и теряя влагу уменьшается их влажность. Если в облаке становится слишком мало влаги, оно исчезает совсем.

6. Обновление "погоды". После каждого движения облаков пересматривается влажность и давление в каждом регионе. Если облако нашло хорошее решение, влажность в этом регионе повышается.

7. Повторение. Повторяем шаги 2-6. С каждым повторением облака исследуют все новые и новые области виртуального неба в поисках самого лучшего решения.

8. Завершение. После завершения заданного количества повторений или нахождения достаточно хорошего решения, алгоритм останавливается.

Этот алгоритм похож на то, как если бы мы отправили множество исследовательских групп (облаков) на поиски сокровища (оптимального решения) в огромном лабиринте (пространстве поиска). Каждая группа ищет по-своему, делится информацией с другими через изменение "погоды" в регионах, и постепенно все вместе они находят наилучший путь.


ACMO cloud

Рисунок 1. Облака разной плотности, влажности и размера над регионами. Выпадение капель подчиняется нормальному распределению.

Для начала ознакомимся с внешними параметрами ACMO и их назначением с помощью таблицы ниже.

Параметр
Назначение параметра
popSize - размер популяции
Размер популяции капель, популяция фиксированного размера и капли распределяются по облакам
cloudsNumber - количество облаков 
Количество облаков
regionsNumber - количество регионовКаждый оптимизируемый параметр делится на одинаковое количество регионов
dMin- минимальное количество капель
Минимальноеколичествокапель по отношениюксреднемуколичествукапельвоблаках. Пороговое значение, ниже которого облако считается высохшим
λ - пороговый фактор 
Пороговый фактор влажности региона, где может быть сформировано облако с генерацией дождя (капель)
γ - коэффициент высыхания  Коэффициент высыхания, снижающий количество влаги в облаках на каждой итерации
EnM0 - начальная энтропия
Начальная энтропия - ширина облака при его появлении
HeM0 - начальная гиперэнтропия
Гиперэнтропия - плотность облака при его появлении, регулирует форму нормального распределения

Далее рассмотрим шаги алгоритма ACMO.

1. Инициализация:

  • Разделение пространства поиска U на MD регионов областей Ui.
  • Инициализация значений влажности HUi и атмосферного давления PUi для каждого региона.
  • Установка параметров алгоритма: пороговый фактор λ, коэффициент высыхания γ, начальная энтропия EnM0, начальная гиперэнтропия HeM0 и др.

2. Генерация облаков:

  • Определение множества регионов S, где влажность HUi превышает динамически рассчитываемый порог Ht.
  • Для каждого региона Ui из S:
  • Вычисление центра облака CenterCk по формуле CenterCk = Center (Ui).
  • Вычисление энтропии EnCk и гиперэнтропии HeCk на основе начальной энтропии EnM0, HeM0 и коэффициента контракции ζ.
  • Генерация облака Ck с центром CenterCk, энтропией EnCk и гиперэнтропией HeCk.

3. Обновление влажности и давления:

  • Обновление значений влажности HUi и атмосферного давления PUi для каждого региона Ui.

4. Фаза движения облаков:

  • Для каждого облака Ck:
  • Определение направления движения облака на основе разницы атмосферного давления между текущим регионом и выбранным соседним регионом.
  • Перемещение облака Ck в направлении более низкого атмосферного давления.

5. Фаза распространения облаков:

  • Для каждого облака Ck:
  • Определить, какие капли облака распространяются в другие регионы на основе разницы атмосферного давления.
  • Распространение капель облака Ck в соседние регионы с более низким атмосферным давлением.

6. Обновление влажности и давления:

  • Обновление значений влажности HUi и атмосферного давления PUi для каждого региона Ui после движения и распространения облаков.

7. Проверка условия завершения:

  • Увеличение счетчика итераций t.
  • Если t < tmax, то переход к шагу 2 (генерация облаков).
  • Если t >= tmax, то алгоритм завершается.

Ключевые моменты:

  • Регионы Ui формируют пространство поиска, каждый регион характеризуется влажностью HUi и атмосферным давлением PUi.
  • Облака Ck генерируются в регионах только с достаточной влажностью (HUi > Ht).
  • Движение и распространение облаков происходит под влиянием разницы атмосферного давления между регионами.
  • Значения влажности и давления обновляются после каждого цикла движения и распространения облаков.

Теперь остановимся на главных операциях с облаками более подробно.

1. Операция Cloudmove (C) отвечает за перемещение облаков.

1.1 Для каждого облака Ck:

  • Выбирается случайная целевая область F из поискового пространства U.
  • Вычисляется разница давления ΔP между текущей областью E, где расположено облако, и целевой областью F.
  • Если давление в F ниже, чем в E (ΔP > 0), то облако Ck будет перемещено в сторону области с более низким давлением.
  • Скорость движения облака Vk рассчитывается на основе разницы давлений и энтропии облака.
  • Центр облака Ck сдвигается на расстояние Vk.
  • Количество влаги в облаке Ck уменьшается на γ * 100% из-за испарения.
  • Если количество капель nk становится меньше порогового значения dN, то облако Ck удаляется из множества облаков C (фактически облако не удаляется, а перемещается в регионы с влажностью выше порогового значения с установлением начальных значений энтропии и гиперэнтропии с корректировкой на текущую итерацию).

Таким образом, облака перемещаются в сторону областей с более низким давлением, при этом их энергия (количество влаги) постепенно снижается. Этот механизм движения отражает физическое поведение облаков в природе.

2. Операция Cloudspread (C) отвечает за распространение облаков.

2.1 Для каждого облака Ck:

  • Получить текущий регион E, в котором находится центр облака.
  • Получить регион G, в который переместится центр облака после фазы движения.
  • Вычислить разницу давления ΔP = PE - PG между текущим и новым регионами.
  • Если регионы E и G различаются, то рассчитать фактор распространения α = ΔP / ΔPmax.
  • Если регионы E и G совпадают, то установить α = 0.3 (базовая скорость распространения).
  • Рассчитать новую энтропию облака EnCk = EnCk × (1 + α), где α - фактор распространения.
  • Рассчитать новую гиперэнтропию облака HeCk = HeCk × (1 + α), т.е. она увеличивается пропорционально фактору распространения.
  • Если энтропия облака Ck больше 5 × EnM0 или количество влаги в нем меньше порогового значения dN, то облако Ck "удаляется" из множества C.

Основные идеи операций 1 и 2:

  • Чем больше разница давлений в регионах, тем облака перемещаются быстрее.
  • Энтропия увеличивается, чтобы расширить область пространства поиска.
  • Гиперэнтропия облака увеличивается, чтобы способствовать более детальному исследованию пространства.
  • Критерии диссипации облаков: энтропия больше 5 × EnM0 или количество влаги меньше dN.

В описании алгоритма авторами не указаны ограничения на количество регионов, которые может охватывать одно облако. Алгоритм рассматривает лишь два региона: текущий регион E, в котором находится центр облака Ck, и новый регион G (новый центр после перемещения). Однако облака увеличиваются в размерах на каждой итерации, захватывая соседние регионы, что приводит к повышению влажности и давления в тех областях, где выпадают капли. Таким образом, одно облако может последовательно перемещаться из одного региона в другой, но в каждый конкретный момент времени алгоритм оперирует только двумя регионами - текущим и новым. Это означает, что процессы перемещения облаков и выпадения капель в регионах рассматриваются отдельно. Облака и капли не связаны друг с другом и представляют собой разные сущности в рамках алгоритма.

Алгоритм обновляет положение облака, рассчитывает новую энтропию и гиперэнтропию, а также проверяет, не превышает ли облако критериев диссипации, но не накладывает явных ограничений на количество регионов, которые оно может охватывать.

ACMO

Рисунок 2. Движение облаков по регионам в сторону меньшего давления.

Из описания алгоритма следует, что регион, а не облако, имеет некую "фитнес-функцию", а именно - влажность в регионе. Роль облака в этом алгоритме - это скорее индикатор, который указывает, сколько капель выпадет в том или ином регионе. Ключевые моменты:

1. Регион имеет свое давление P, которое определяет скорость распространения облака.
2. Облако Ck не "владеет" каплями, а служит индикатором, показывающим, сколько капель будет выпадать в текущем регионе E и новом регионе G.
3. Перемещение облака из региона E в регион G определяется градиентом давления ΔP = PE - PG.
4. Капли не принадлежат конкретному облаку, а выпадают в тех регионах, где находятся облака.

Таким образом, регион, а не облако, является основной сущностью, определяющей динамику "погоды" в данной системе. Можно подчеркнуть, что этим и отличается данный алгоритм от многопопуляционных алгоритмов.

Давление является важной характеристикой каждого региона в пространстве поиска и используется для определения направления движения облаков, то есть облака движутся из областей с высоким давлением в области с низким давлением. Концептуально, давление в регионе увеличивается каждый раз, когда регион оценивается (когда вычисляется значение целевой функции для точки в этом регионе). Это отражает идею, что чем больше мы исследуем определенную область, тем выше становится "давление" в этой области, побуждая алгоритм исследовать другие, менее изученные участки.

Согласно алгоритму авторов, изменение формы облаков происходит в зависимости от разницы атмосферного давления между текущим регионом, где находится облако, и новым регионом, куда облако перемещается. Конкретно это происходит следующим образом:

  • Если разница давлений ΔP = PE - PG велика, то это означает, что облако перемещается из области с сильно отличающимся давлением и скорость движения облака будет выше.
  • Если разница давлений ΔP небольшая, то это означает, что облако перемещается в область с близким по значению давлением и с низкой скоростью.

Далее, согласно описанию алгоритма, значения энтропии и гиперэнтропии на первой итерации определяются следующим образом:

1. Начальная энтропия EnM0 = Ij / A, где:

  • A установлено на уровне 6
  • Ij - длина области в j-ом измерении

2. Начальная гиперэнтропия HeM0 устанавливается на уровне 0.5.

Энтропия в алгоритме определяет, насколько широко распространяется облако (размер). На первой итерации облако должно покрыть не менее одного целого региона поиска.

Гиперэнтропия отвечает за "толщину" облака и регулирует форму нормального распределения, или, другими словами, за то, насколько плотно расположены капли в облаке. Начальное значение 0.5 выбрано экспериментально как баланс между слишком разреженным и слишком плотным облаком.

1. Энтропия увеличивается с каждой итерацией. Это означает, что облака постепенно "растягиваются", охватывая всё более обширные области поиска и помогает избегать застревания в локальных оптимумах
2. Гиперэнтропия, наоборот, увеличивает плотность в центре облака. Это приводит к тому, что облако уточняет решение перспективного региона.

Такой подход позволяет алгоритму одновременно с расширением области поиска уточнять решения и при этом сохранять возможность "выбраться" из локальных оптимумов.

В многомерном пространстве определение индекса региона для облака становится немного сложнее, но принцип остается тем же. Вот как это работает:

  • Пространство поиска разделено на регионы по всем измерениям. Если у нас D измерений и каждое измерение разделено на M интервалов, то всего у нас будет M × D регионов.
  • Индекс региона в этом случае - это не просто число, а набор координат, показывающих положение региона по каждому измерению. Чтобы определить индекс региона для облака, алгоритм проверяет, в какие интервалы по каждому измерению попадает центр облака.

Например, если у нас трехмерное пространство (D = 3), разделенное на 10 интервалов по каждому измерению (M = 10), индекс региона может выглядеть как (3, 7, 2), что означает 3-й интервал по первому измерению, 7-й по второму и 2-й по третьему.

Необходимо уделить внимание центру облака, который не обязательно является лучшей каплей облака. Вот несколько важных моментов:

  • Центр облака определяется как некая "средняя точка" области, в которой генерируется облако.
  • Лучшая капля в облаке - это та, которая дает наилучшее значение целевой функции (наивысшее значение приспособленности).
  • В алгоритме есть понятие "значение влажности региона" (UiH), которое представляет собой лучшее значение приспособленности, найденное в данном регионе. Это значение связано с лучшей каплей, а не с центром облака.
  • Центр облака используется для определения положения облака в пространстве поиска и для расчета его движения, но он не обязательно соответствует лучшему решению.

Таким образом, центр облака и лучшая капля - это разные концепции в данном алгоритме. Центр используется для навигации облака в пространстве поиска, в то время как лучшая капля представляет наиболее оптимальное решение, найденное в данном регионе на текущий момент.

Этот подход позволяет алгоритму эффективно исследовать пространство поиска (используя центр облака для движения), одновременно отслеживая и сохраняя лучшие найденные решения в регионах (лучшие капли, выпавшие в регионах).

В алгоритме ACMO есть несколько случаев, когда происходит уничтожение или "растворение" облаков. Давайте разберем их:

1. Недостаточное количество влаги:

  • У каждого облака есть определенное количество влаги.
  • Если количество влаги становится меньше порогового значения dN, облако считается слишком сухим и исчезает.
  • Это похоже на то, как в природе маленькие облака рассеиваются.

2. Слишком большая энтропия:

  • Энтропия облака показывает, насколько широко оно распространено.
  • Если энтропия становится больше чем 5 раз начальной энтропии (5 × EnM0), облако считается слишком рассеянным и исчезает.

Это можно представить как облако, которое настолько растянулось, что просто растворилось в воздухе.

3. Естественное испарение:

  • После каждого движения облака, количество его влаги уменьшается на определенный процент (γ * 100%).
  • Если после такого уменьшения количество влаги становится меньше dN, облако исчезает.
Это похоже на постепенное испарение облака в природе.

4. При слиянии облаков:

  • Хотя это тоже не явно описано в данном алгоритме, в некоторых вариантах ACMO облака могут сливаться.
  • При слиянии одно из облаков (обычно меньшее) может считаться исчезнувшим, став частью большего облака.

Все эти механизмы уничтожения облаков помогают алгоритму "очищать" пространство поиска от неперспективных решений и концентрироваться на наиболее многообещающих областях. 

Внимательный исследователь может задаться вопросом: что произойдет, если облака начнут двигаться в области с низким давлением и соберутся в одних и тех же регионах все вместе? Во-первых, регионы с низким давлением не являются наихудшими решениями в пространстве поиска; это просто области, которые исследованы слабо. Даже если все облака сосредоточатся в регионах с наименьшим давлением, они постепенно начнут повышать давление в этих областях. В какой-то момент это приведет к возникновению новых регионов с меньшим давлением, что неизбежно заставит облака покинуть текущее место.

Таким образом, облака никогда не остаются на месте долго и перемещаются как в области качественных решений, так и в менее перспективных. Кроме того, механизмы испарения облаков и их непрерывного расширения, за которыми следует их уничтожение, позволяют создавать новые облака взамен уничтоженных в хороших регионах. Это инициирует новый цикл уточнения перспективных областей пространства поиска.

Определение центра нового облака Ck. Если значение влажности в регионе превышает порог, то он может сгенерировать новое облако. Пороговое значение влажности Ht рассчитывается динамически по уравнению:

Ht = Hmin + λ * (Hmax - Hmin), где:

  • Hmin и Hmax - минимальные и максимальные значения влажности во всей области поиска по соответственно
  • λ - пороговый фактор, равный 0.7 на основе экспериментальных тестов

Расчет энтропии и гиперэнтропии. Значение энтропии для новых облаков EnM уменьшается в процессе поиска и задается формулой:

EnMt = ζ * EnM0, где ζ - коэффициент сжатия, который рассчитывается по формуле:

ζ = 1 / (1 + e^(- (8 - 16 * (t / tmax))))

Гиперэнтропия вновь сгенерированных облаков увеличивается с каждой итерацией:

HeMt = ζ * HeM0, где ζ - выступает в роли коэффициента расширения, который рассчитывается по формуле:

ζ = 1 / (1 + e^(8 - 16 * (t / tmax))), где:

  • EnM0j - начальная энтропия, равная 0.2
  • HeM0 - начальная гиперэнтропия, равная 0.5
  • t - текущая итерация
  • tmax - максимальное количество итераций

En and He

Рисунок 3. Графики энтропии и гиперэнтропии для новых облаков в зависимости от текущей эпохи.


Скорость движения облака подчиняется следующему закону:

Vk = β * EnCk, где β выражается по уравнению:

β = (PCk - PF) / (PMax - PMin), где:

  • β - фактор атмосферного давления
  • PMax и PMin - максимальное и минимальное атмосферное давление в поисковом пространстве
  • PCk и PF - давление в текущем и целевом регионе
  • EnCk - текущая энтропия облака

Теперь, когда мы знаем всю теорию модели атмосферной модели движения облаков ACMO, приступим к написанию кода алгоритма.

Опишем структуру "S_ACMO_Region", которая используется для представления региона с метеорологическими характеристиками. Структура "S_ACMO_Region" содержит несколько полей, каждое из которых хранит информацию о регионе:

Поля структуры:

  • humidity - уровень влажности в регионе.
  • pressure - атмосферное давление в регионе.
  • centre - центр региона в виде вектора координат, обозначающих центральную точку.
  • x - указывает на точку с наивысшим давлением в регионе.

Init() - метод инициализации, который устанавливает начальные значения для полей структуры.

  • humidity - инициализируется значением "-DBL_MAX", что указывает на крайне низкий уровень влажности.
  • pressure - инициализируется нулём, потому что давление ещё не измерено.

Структура "S_ACMO_Region" используется в метеорологической модели, где требуется хранить и обрабатывать информацию о различных регионах с точки зрения их климатических условий. Метод "Init ()" позволяет гарантировать, что структура будет правильно инициализирована перед использованием. 

//——————————————————————————————————————————————————————————————————————————————
// Region structure
struct S_ACMO_Region
{
    double humidity; //humidity in the region
    double pressure; //pressure in the region
    double centre;   //the center of the region
    double x;        //point of highest pressure in the region

    void Init ()
    {
      humidity = -DBL_MAX;
      pressure = 0;
    }
};
//——————————————————————————————————————————————————————————————————————————————

Далее опишем две структуры: "S_ACMO_Area" и "S_ACMO_Cloud" и рассмотрим подробно:

 1. Структура "S_ACMO_Area" представляет область, состоящую из массива регионов, которые описаны структурой "S_ACMO_Region" и содержат информацию о нескольких регионах в данной области.

 2. Структура "S_ACMO_Cloud" представляет облако и его характеристики. Поля структуры:

  • center [] - массив хранит координаты центра облака.
  • entropy [] - массив значений энтропии облака по каждой координате.
  • entropyStart [] - массив начальных значений энтропии.
  • hyperEntropy - значение гиперэнтропии.
  • regionIndex [] - массив индексов регионов, к которым относятся облака.
  • droplets - количество капель в облаке (условное понятие, обозначающее влажность облака).

Метод "Init (int coords)" - инициализирует массивы в структуре, изменяя их размер в зависимости от переданного параметра "coords".

Обе структуры используются в метеорологической модели для представления и анализа регионов и облаков. "S_ACMO_Area" служит для группировки регионов, а "S_ACMO_Cloud" - для описания характеристик облаков.

//——————————————————————————————————————————————————————————————————————————————
struct S_ACMO_Area
{
    S_ACMO_Region regions [];
};
//——————————————————————————————————————————————————————————————————————————————

//——————————————————————————————————————————————————————————————————————————————
// Cloud structure
struct S_ACMO_Cloud
{
    double center       [];    // cloud center
    double entropy      [];    // entropy
    double entropyStart [];    // initial entropy
    double hyperEntropy;       // hyperEntropy
    int    regionIndex  [];    // index of regions
    double droplets;           // droplets

    void Init (int coords)
    {
      ArrayResize (center,       coords);
      ArrayResize (entropy,      coords);
      ArrayResize (entropyStart, coords);
      ArrayResize (regionIndex,  coords);
      droplets = 0.0;
    }
};
//——————————————————————————————————————————————————————————————————————————————

Давайте разберем класс "C_AO_ACMO", который наследуется от другого класса "C_AO". Общая структура класса:

1. Параметры класса, играющие роль внешних параметров алгоритма:

  • popSize - размер популяции.
  • cloudsNumber - количество облаков.
  • regionsNumber - количество регионов на размерность.
  • dMin - минимальное количество капель относительно среднего числа капель в облаках.
  • EnM0 и HeM0 - начальные значения энтропии и гиперэнтропии.
  • λ - пороговый фактор для определения дождливых регионов.
  • γ - темп ослабления.

2. Массив параметров:

  • params - массив структур, где каждый элемент содержит имя и значение параметра.

3.  Методы:

  • SetParams () - устанавливает параметры модели из массива  "params".
  • Init () - инициализирует модель с заданными границами поиска, шагом и количеством эпох.
  • Moving () - метод отвечает за движение облаков.
  • Revision () - метод, который выполняет пересмотр состояния модели.
  • MoveClouds () - метод, отвечающий за перемещение облаков.
  • GetRegionIndex () - метод для получения индекса региона по заданной точке.
  • RainProcess() - метод, отвечающий за процесс дождя.
  • DropletsDistribution () - метод для распределения капель по облакам.
  • UpdateRegionProperties () - метод для обновления свойств регионов.
  • GenerateClouds () - метод для генерации облаков.
  • CalculateHumidityThreshold () - метод для расчета порога влажности.
  • CalculateNewEntropy () - метод для расчета новой энтропии для облака.

4. Члены класса:

   S_ACMO_Area areas [] - массив областей содержат информацию о различных регионах.

   S_ACMO_Cloud clouds [] - массив облаков содержат информацию о характеристиках облаков.

   Приватные переменные, такие как "epochs", "epochNow", "dTotal", "entropy []", и "minGp" используются для отслеживания состояния модели и расчетов.

Класс "C_AO_ACMO" предназначен для моделирования и движения облаков в атмосфере. Он включает в себя различные параметры и методы, которые позволяют управлять состоянием облаков, их движением и взаимодействием с регионами.

//——————————————————————————————————————————————————————————————————————————————
class C_AO_ACMO : public C_AO
{
  public: //--------------------------------------------------------------------
  ~C_AO_ACMO () { }
  C_AO_ACMO ()
  {
    ao_name = "ACMO";
    ao_desc = "Atmospheric Cloud Model Optimization";
    ao_link = "https://www.mql5.com/ru/articles/15849";

    popSize       = 50;    //population size

    cloudsNumber  = 5;     // Number of clouds
    regionsNumber = 10;    // Number of regions per dimension  (M)
    dMin          = 0.2;   // Minimum number of drops relative to the average number of drops in the clouds (dN)
    EnM0          = 1.0;   // Initial value of entropy
    HeM0          = 0.5;   // Initial value of hyperentropy
    λ             = 0.7;   // Threshold factor (threshold of the rainiest regions)
    γ             = 0.2;   // Weaken rate

    ArrayResize (params, 8);

    params [0].name = "popSize";       params [0].val = popSize;

    params [1].name = "cloudsNumber";  params [1].val = cloudsNumber;
    params [2].name = "regionsNumber"; params [2].val = regionsNumber;
    params [3].name = "dMin";          params [3].val = dMin;
    params [4].name = "EnM0";          params [4].val = EnM0;
    params [5].name = "HeM0";          params [5].val = HeM0;
    params [6].name = "λ";             params [6].val = λ;
    params [7].name = "γ";             params [7].val = γ;
  }

  void SetParams ()
  {
    popSize       = (int)params [0].val;

    cloudsNumber  = (int)params [1].val;
    regionsNumber = (int)params [2].val;
    dMin          = params      [3].val;
    EnM0          = params      [4].val;
    HeM0          = params      [5].val;
    λ             = params      [6].val;
    γ             = params      [7].val;
  }

  bool Init (const double &rangeMinP  [], //minimum search range
             const double &rangeMaxP  [], //maximum search range
             const double &rangeStepP [], //step search
             const int     epochsP = 0);  //number of epochs

  void Moving   ();
  void Revision ();

  //----------------------------------------------------------------------------
  int    cloudsNumber;  // Number of clouds
  int    regionsNumber; // Number of regions per dimension (M)
  double dMin;          // Minimum number of drops relative to the average number of drops in the clouds (dN)
  double EnM0;          // Initial value of entropy
  double HeM0;          // Initial value of hyperentropy
  double λ;             // Threshold factor
  double γ;             // Weaken rate


  S_ACMO_Area   areas  [];
  S_ACMO_Cloud  clouds [];

  private: //-------------------------------------------------------------------
  int    epochs;
  int    epochNow;
  int    dTotal;         // Maximum total number of droplets (N)
  double entropy [];     // Entropy
  double minGp;          // Minimum global pressure


  void   MoveClouds                 (bool &rev);
  int    GetRegionIndex             (double point, int ind);
  void   RainProcess                (bool &rev);
  void   DropletsDistribution       (double &clouds [], int &droplets []);

  void   UpdateRegionProperties     ();

  void   GenerateClouds             ();
  double CalculateHumidityThreshold ();
  void   CalculateNewEntropy        (S_ACMO_Cloud &cl, int t);
};
//——————————————————————————————————————————————————————————————————————————————

Далее разберем метод "Init" класса "C_AO_ACMO", который отвечает за инициализацию параметров модели облаков.

1. Метод принимает три массива "rangeMinP", "rangeMaxP", "rangeStepP", которые описывают границы и шаги для параметров модели. Четвертым параметром является "epochsP", по умолчанию равен 0 и указывает количество эпох.

2. Вызов метода "StandardInit" для выполнения базовой инициализации. Если она не успешна, метод возвращает "false".

3. Инициализация переменных: метод устанавливает общее количество эпох и сбрасывает текущую эпоху на 0.

4. Инициализация параметров:

  • dTotal - устанавливается равным размеру популяции.
  • dMin - пересчитывается с учетом соотношения между размером популяции и количеством облаков.

5. Распределение памяти под массивы: метод изменяет размеры массивов "entropy" и "areas" в соответствии с количеством координат.

6. Инициализация энтропии и регионов:

  • для каждой координаты "c" вычисляется значение энтропии.
  • для каждого региона "r" вызывается метод "Init ()" для инициализации региона.
  • центр региона вычисляется как среднее значение между минимальным и максимальным значениями, умноженное на количество регионов.
  • затем центр проходит через метод "SeInDiSp", который нормализует значения заданным диапазоном.
  • устанавливается координата "x" для региона (самое высокое значение влажности, по умолчанию находится в центре региона).

7. Инициализация облаков:

  • изменяет размер массива "clouds" в соответствии с количеством облаков.
  • для каждого облака вызывается метод "Init" и инициализирует параметры.

Метод "Init" выполняет основную настройку и инициализацию модели облаков, устанавливая необходимые параметры, размеры массивов и значения для дальнейшей симуляции. Он структурирован так, чтобы сначала выполнять стандартную инициализацию родительского класса, а затем настраивать специфические параметры, связанные с координатами, регионами и облаками.

//——————————————————————————————————————————————————————————————————————————————
bool C_AO_ACMO::Init (const double &rangeMinP  [],
                      const double &rangeMaxP  [],
                      const double &rangeStepP [],
                      const int     epochsP = 0)
{
  if (!StandardInit (rangeMinP, rangeMaxP, rangeStepP)) return false;

  //----------------------------------------------------------------------------
  epochs   = epochsP;
  epochNow = 0;

  //----------------------------------------------------------------------------
  dTotal       = popSize;
  dMin         = dMin * (popSize / (double)cloudsNumber);

  ArrayResize (entropy, coords);
  ArrayResize (areas,   coords);

  for (int c = 0; c < coords; c++)
  {
    entropy [c] = (rangeMax [c] - rangeMin [c]) / regionsNumber;

    ArrayResize (areas [c].regions, regionsNumber);

    for (int r = 0; r < regionsNumber; r++)
    {
      areas [c].regions [r].Init ();
      areas [c].regions [r].centre = rangeMin [c] + entropy [c] * (r + 0.5);
      areas [c].regions [r].centre = u.SeInDiSp (areas [c].regions [r].centre, rangeMin [c], rangeMax [c], rangeStep [c]);
      areas [c].regions [r].x      = areas [c].regions [r].centre;
    }
  }

  ArrayResize (clouds, cloudsNumber);
  for (int i = 0; i < cloudsNumber; i++) clouds [i].Init (coords);

  minGp = DBL_MAX;

  return true;
}
//——————————————————————————————————————————————————————————————————————————————

Выводы

В данной статье мы погрузились в мир необычного и увлекательного алгоритма ACMO, который представляет собой атмосферную метеорологическую модель, предназначенную для решения многомерных задач оптимизации. Этот алгоритм, на первый взгляд, может показаться многопопуляционным, но при более глубоком анализе открывается его уникальность и новизна.

Основу модели составляют три ключевые сущности: облака, регионы и капли. Каждая из этих компонентов функционирует независимо, однако их взаимодействие создает гармоничную и эффективную систему, где каждая часть играет свою важную роль. Облака символизируют разнообразие решений, регионы представляют собой пространства поиска, а капли — это элементы, которые осуществляют переходы между различными решениями. Такое сочетание делает алгоритм ACMO не только оригинальным, но и весьма мощным инструментом в области оптимизации.

Во второй части статьи мы сделаем шаг от теории к практике. Мы протестируем алгоритм на различных тестовых функциях, чтобы оценить его эффективность и выявить сильные стороны. Подведем итоги, проанализируем результаты и, возможно, откроем новые горизонты для применения этой инновационной модели в реальных задачах.

Прикрепленные файлы |
ACMO.ZIP (36.43 KB)
Нейросети в трейдинге: Безмасочный подход к прогнозированию ценового движения Нейросети в трейдинге: Безмасочный подход к прогнозированию ценового движения
В данной статье предлагаем познакомиться с методом Mask-Attention-Free Transformer (MAFT) и его применение в области трейдинга. В отличие от традиционных Transformer, требующих маскирования данных при обработке последовательностей, MAFT оптимизирует процесс внимания, устраняя необходимость в маскировании, что значительно повышает вычислительную эффективность.
Ложные регрессии в Python Ложные регрессии в Python
Ложные регрессии возникают, когда два временных ряда демонстрируют высокую степень корреляции чисто случайно, что приводит к вводящим в заблуждение результатам регрессионного анализа. В таких случаях, даже если переменные кажутся связанными, корреляция является случайной и модель может быть ненадежной.
Оптимизация атмосферными облаками — Atmosphere Clouds Model Optimization (ACMO): Практика Оптимизация атмосферными облаками — Atmosphere Clouds Model Optimization (ACMO): Практика
В данной статье мы продолжим погружение в реализацию алгоритма ACMO (Atmospheric Cloud Model Optimization). В частности, обсудим два ключевых аспекта: перемещение облаков в регионы с низким давлением и моделирование процесса дождя, включая инициализацию капель и распределение их между облаками. Мы также разберем другие методы, которые играют важную роль в управлении состоянием облаков и обеспечении их взаимодействия с окружающей средой.
Разработка системы репликации (Часть 47): Проект Chart Trade (VI) Разработка системы репликации (Часть 47): Проект Chart Trade (VI)
Наконец, наш индикатор Chart Trade начинает взаимодействовать с советником, позволяя передавать информацию в интерактивном режиме. Поэтому в этой статье мы доработаем индикатор, сделав его функциональным настолько, чтобы его можно было использовать вместе с каким-либо советником. Это позволит нам получить доступ к индикатору Chart Trade и работать с ним, как если бы он действительно был связан с советником. Но сделаем мы это гораздо более интересным способом чем ранее.