English Русский Español Deutsch 日本語 Português
preview
大气云模型优化(ACMO):理论

大气云模型优化(ACMO):理论

MetaTrader 5测试者 | 13 五月 2025, 13:42
96 0
Andrey Dik
Andrey Dik

内容

  1. 概述
  2. 算法实现


概述

如今,为优化算法寻找最优解决方案正变得越来越重要。解决这一问题的最有趣的方法之一是元启发式算法——大气云模型优化(ACMO)。尽管其数学机理比较复杂,但却可以简单直白地解释。 

想象一片广阔的虚拟天空,云朵像在真实大气中一样形成并移动。这里的天气不仅仅是一组条件,而是一个活生生的系统,其中湿度和气压影响每一个决策。受自然现象的启发,ACMO算法利用云的形成原理来探索解空间,类似于云在天空中形成、扩散和消散的过程,试图找到最优路径。该算法由Yan等人提出,并于2013年发表。

接下来,我们将详细查看ACMO算法的每一个步骤,从准备云朵诞生的“天空”开始。我们将跟随它们在虚拟的天体空间中的移动,观察它们如何根据天气条件适应和变化。当您深入到这个神秘的过程时,您就会看到云朵,就像研究团队一样,努力在可能性的迷宫中找到最优解。让我们一起揭开这个算法的秘密,逐步了解它是如何工作的。

大气云模型优化(ACMO)算法的主要思想是模拟自然界中云层的行为来解决优化问题。该算法利用云行为的三个关键方面:
  • 生成。云层在湿度高的区域形成,使算法能够探索当前最优解的周边区域。
  • 移动。云层在解空间中移动,这促进了群体的扩散并增加了其多样性。这有助于避免陷入局部最优。
  • 扩散。云层在搜索空间中分散,使算法能够覆盖更广泛的可能解,从而提高找到全局最优解的机会。


算法实现

由于ACMO算法的概念相当复杂,我们将从简单到复杂逐步展开。让我们尽可能简单地描述该算法的主要思想。

1. 准备“天空”。想象我们正在创建一片虚拟天空。这片天空被划分为许多区域。每个区域都有自己的湿度(解的质量)和气压(积累的搜索经验)。

2. 云层的诞生。云层只在最“潮湿”的区域出现。每朵云由许多水滴组成,而每个水滴都是我们问题的一个潜在解。

3. 云层的移动。云层几乎从不静止。它们从高压区域向低压区域移动。这类似于真实大气中风从高压区域吹向低压区域。

4. 改变云层的形状。随着云层的移动,它们会变大。云层的大小增加程度取决于区域之间的气压差。

5. 蒸发。在每一步中,云层都会失去一些水滴,随着湿度的减少,云的湿度也会降低。如果云层变得太“干”,它将完全消失。

6. “天气”更新。每次云层移动后,每个区域的湿度和气压都会被重新评估。如果云层找到了一个更优秀的解,那么该区域的湿度就会增加。

7. 重复。重复步骤2-6。随着每次重复,云层在虚拟天空中探索越来越多的区域,以寻找最优解。

8. 完成。在完成指定的迭代次数或找到足够好的解之后,该算法中止。

这个算法就好比我们派遣了许多探索小组(云层)去一个巨大的迷宫(搜索空间)中寻找宝藏(最优解)。每个小组以自己的方式搜索,并通过改变区域中的“天气”与其他小组共享信息,最终它们共同逐渐找到最优路径。


ACMO云

图例1. 不同密度、湿度和大小的云分布在各个区域。水滴的降水遵循正态分布。

首先,让我们通过下表了解ACMO的外部参数及其用途。

参数
参数的用途
popSize — 种群规模
水滴种群大小,固定大小的种群,水滴分布在云中
cloudsNumber — 云层的数量 
云层的数量
regionsNumber — 区域的数量每个待优化的参数被划分为相同数量的区域
dMin — 最小水滴数量
相对于云层中平均水滴数量的最小水滴数量云被视为干云(或无降水云/低降水倾向云 )的阈值下限
λ — 阈值因子 
一个区域形成带有降水(水滴)的云的阈值湿度因子
γ — 干燥比率  每次迭代中减少云中湿度的干燥比率
EnM0 — 初始熵
初始熵是云出现时的宽度
HeM0 — 初始超熵
超熵是云出现时的密度。该参数调节正态分布的形状

接下来,让我们看一下ACMO算法的步骤。

1. 初始化:

  • U 搜索空间被划分为 MDUi区域。
  • 初始化每个区域的 HUi 湿度值和 PUi 气压。
  • 设置算法参数:λ 阈值因子,γ 干燥比率,EnM0 初始熵,HeM0 初始超熵等。

2. 云层的生成:

  • 定义多个 S 区域,其中 HUi 湿度超过动态计算的 Ht 阈值。
  • 对于每个来自 SUi 区域:
  • 使用公式 CenterCk = Center (Ui) 计算 CenterCk 云层的中心。
  • 基于初始熵 EnM0HeM0 和收缩比率 ζ 计算 EnCk 熵和 HeCk 超熵。
  • 生成具有 CenterCk 中心、EnCk 熵和 HeCk 超熵的 Ck 云。

3. 湿度和气压更新:

  • 更新每个 Ui 区域的 HUi 湿度值和 PUi 气压。

4. 云层的移动阶段:

  • 对于每朵 Ck 云:
  • 根据当前区域与选定相邻区域之间的气压差确定云的移动方向。
  • Ck 云向气压较低的方向移动。

5. 云层的扩散阶段:

  • 对于每朵 Ck 云:
  • 根据区域之间的气压差确定哪些云的水滴扩散到其他区域。
  • Ck 云的水滴扩散到气压较低的相邻区域。

6. 湿度和气压更新:

  • 在云层发生移动和扩散后,更新每个 Ui 区域的 HUi 湿度值和 PUi 气压。

7. 检查终止条件:

  • 增加迭代计数器 t。
  • 如果 t < tmax,转到2(云层的生成)。
  • 如果 t >= tmax,算法终止。

要点:

  • Ui 区域构成了搜索空间,每个区域都具有 HUi 湿度和 PUi 气压。
  • 只有在湿度足够的区域(HUi > Ht)才会生成 Ck 云。
  • 云层的移动和扩散是在区域之间的气压差的影响下发生的。
  • 在每次云层的移动和扩散循环后,更新湿度和气压值。

现在让我们更详细地看一下主要的云层操作。

1. Cloudmove (C) 操作负责云层的移动。

1.1对于每朵 Ck 云:

  • U 搜索空间中随机选择一个目标区域 F
  • 计算云所在的当前区域 E 与目标区域 F 之间的气压差 ΔP
  • 如果目标区域 F 的气压低于当前区域 EΔP > 0),则 Ck 云将向气压较低的区域移动。
  • 根据气压差和云的熵计算云层的移动速度 Vk
  • Ck 云层的中心移动 Vk 的距离。
  • 由于蒸发,Ck 云层中的湿度减少 γ * 100%
  • 如果水滴数量 nk 低于阈值 dN,则从云集合 C 中移除 Ck 云(实际上,云并没有被移除,而是被移动到湿度高于阈值的区域,并设置初始的熵和超熵值以适应当前迭代)。

因此,云层向气压较低的区域移动,而其能量(湿度量)逐渐减少。这种移动机制反映了自然界中云层的物理行为。

2. Cloudspread (C) 操作负责云层的扩散。

2.1对于每朵 Ck 云:

  • 获取云中心所在的当前区域 E
  • 获取云在移动阶段后将移动到的新区域 G
  • 计算当前区域和新区域之间的气压差 ΔP = PE - PG
  • 如果区域 EG 不同,计算扩散因子 α = ΔP / ΔPmax
  • 如果区域 EG 相同,设置 α = 0.3(基本传播速度)。
  • 计算新的云熵 EnCk = EnCk × (1 + α),其中 α 是扩散因子。
  • 计算云的新超熵 HeCk = HeCk × (1 + α),即超熵与传播因子成比例增加。
  • 如果 Ck 云的熵超过 5 × EnM0 或其湿度量低于阈值 dN,则从集合 C 中“移除”Ck 云。

操作1和2的主要思想:

  • 区域之间的气压差越大,云层移动得越快。
  • 通过提高熵值来扩大搜索空间。
  • 云的超熵增大,以促进对空间进行更详细地探索。
  • 云层消散标准:熵超过 5 × EnM0 或湿度量低于 dN

在算法描述中,作者没有指出一个云可以覆盖的区域数量有任何限制。算法只考虑两个区域:当前区域 ECk 云中心所在的区域)和新区域 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),其中:

  • HminHmax — 分别是整个搜索区域中的最小和最大湿度值。
  • λ — 基于实验性测试,阈值因子等于 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和He

图例 3. 根据当前迭代次数变化的新云层的熵和超熵图表。


云层的移动速度遵循以下规律:

Vk = β * EnCk,其中 β 由以下公式表示:

β = (PCk - PF) / (PMax - PMin),其中:

  • β 是气压因子。
  • PMaxPMin — 搜索空间中的最大和最小气压。
  • PCk PF — 当前区域和目标区域的气压。
  • EnCk — 当前云层的熵

现在我们已经了解了ACMO大气云运动模型的全部理论,让我们开始实现算法代码。

定义 S_ACMO_Region 结构,该结构用于表示具有气象特征的区域。 S_ACMO_Region 结构包含以下字段,每个字段存储有关区域的信息:

结构字段:

  • humidity — 区域的湿度。
  • pressure — 区域的气压。
  • centre — 区域的中心,以坐标向量的形式表示中心点。
  • x — 区域中气压最高的点。

Init() — 初始化方法,用于设置结构字段的初始值。

  • humidity 的初始值为 -DBL_MAX,表示极低的湿度。
  • pressure 的初始值为 0,因为尚未测量气压。

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_AreaS_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类的C_AO_ACMO类。类的整体结构:

1. 作为算法外部参数的类参数:

  • popSize — 种群大小。
  • cloudsNumber — 云层的数量。
  • regionsNumber — 每个维度的区域数量。
  • dMin — 相对于云中平均水滴数量的最小水滴数量。
  • EnM0HeM0 — 熵和超熵的初始值。
  • λ — 用于确定有雨区域的阈值因子。
  • γ — 减弱率。

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[] — 云数组,包含有关云特征的信息。

   私有变量,如epochsepochNowdTotalentropy[]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/en/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);
};
//——————————————————————————————————————————————————————————————————————————————

接下来,让我们看一下负责初始化云模型参数的C_AO_ACMO类的Init方法。

1. 该方法接受三个数组(rangeMinPrangeMaxPrangeStepP),这些数组描述了模型参数的边界和步长。第四个参数是 epochsP,其默认值为0,用于指定迭代次数。

2. 调用StandardInit方法执行基本初始化。如果初始化失败,该方法将返回false

3. 变量初始化:该方法设置总迭代次数,并将当前迭代次数重置为0。

4. 参数初始化:

  • dTotal — 设置为种群大小。
  • dMin — 根据种群大小与云层数量之间的关系重新计算。

5. 数组内存分配:根据坐标数量调整entropyareas数组的大小。

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算法具有原创性,而且使其成为优化领域中一个非常强大的工具。

在文章的第二部分,我们将从理论迈向实践。在各种测试函数上测试该算法,以评估其性能并识别其优势。此外,我们将分析结果,并且或许会为这个创新模型在实际问题中的应用开辟新的视野。

本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/15849

附加的文件 |
ACMO.zip (37.22 KB)
您应当知道的 MQL5 向导技术(第 34 部分):采用非常规 RBM 进行价格嵌入 您应当知道的 MQL5 向导技术(第 34 部分):采用非常规 RBM 进行价格嵌入
受限玻尔兹曼(Boltzmann)机是一种神经网络形式,开发于 1980 年代中叶,当时的计算资源非常昂贵。在其初创时,它依赖于 Gibbs 采样,以及对比散度来降低维度,或捕获输入训练数据集上的隐藏概率/属性。我们验证当 RBM 为预测多层感知器“嵌入”价格时,反向传播如何执行类似的操作。
使用PSAR、Heiken Ashi和深度学习进行交易 使用PSAR、Heiken Ashi和深度学习进行交易
本项目探索深度学习与技术分析的融合,用于在外汇市场测试交易策略。使用Python脚本进行快速实验,结合ONNX模型和传统指标(如PSAR、SMA和RSI)来预测欧元/美元(EUR/USD )的走势。之后,MQL5脚本将此策略引入实时环境,利用历史数据和技术分析帮助交易者做出明智的交易决策。回测结果表明,该策略秉持保守且稳健的运作理念,始终将风险管控置于首位,追求持续稳定的收益增长模式,摒弃激进逐利的行为。
在任何市场中获得优势(第四部分):CBOE欧元和黄金波动率指数 在任何市场中获得优势(第四部分):CBOE欧元和黄金波动率指数
我们将分析芝加哥期权交易所(CBOE)整理的替代数据,以提高我们的深度神经网络在预测XAUEUR货币对时的准确性。
您应当知道的 MQL5 向导技术(第 33 部分):高斯(Gaussian)进程核心 您应当知道的 MQL5 向导技术(第 33 部分):高斯(Gaussian)进程核心
高斯(Gaussian)进程核心是正态分布的协方差函数,能够在预测中扮演角色。我们在 MQL5 的自定义信号类中探索这种独特的算法,看看它是否可当作主要入场和离场信号。