English Русский Español Deutsch 日本語 Português
preview
时间演化旅行算法(TETA)

时间演化旅行算法(TETA)

MetaTrader 5示例 |
297 0
Andrey Dik
Andrey Dik

内容

  1. 概述
  2. 算法的实现
  3. 测试结果


概述

我们研究过许多基于物理定律的算法,例如 CSSEMGSAAEFAAOSm,然而,宇宙持续以新的现象取悦我们,并令我们充满各种假想和思路。宇宙的基本组成部分之一,譬如时间,给了我创建一种新优化算法的思路。时间不仅激发新的发现,而且仍然是一个难以理解的神秘实体。它像河流一样流淌,带走我们生命中的瞬间,只留下回忆。时间旅行一直是人类着迷和幻想的话题。为了更好地理解算法思路,我们想象一位科学家的故事。

从前,生活着一位物理学家,他痴迷于走向光明的未来,远离他所犯的错误。在深入研究时间流后,他面临着一个痛苦的发现:穿越到未来是不可能的。他没有被吓倒,转而研究返回过去旅行的能力,希望能够改正自己的错误,但就此他也很失望。

然而,他对于时间流假设的研究令他得出了一个惊人的发现:平行宇宙的存在。为了在世界之间移动,开发了一个理论机器模型之后,他发现了一些惊人的事情:虽然直接时间旅行是不可能的,但有可能选择一系列事件,来导致一个或另一个平行宇宙。

任何人的每一个行为都会催生一个新的平行现实,但这位科学家只对那些直接影响他生活的宇宙感兴趣。为了在它们之间导航,他在方程组中建立了特殊的锚点(在世界之间加以区分)— 他的命运关键点:家庭、事业、科学发现、友谊和重大事件。在他的机器中这些锚点成为变量,令他能够在概率世界之间选择最优路径。

推出了他的发明之后,他开始了周游平行世界的旅程,但不再寻求获得现成的光明未来。他意识到了更重要的事情:他亲手创造这个未来的能力,在当下制定决策。每一个新的选择都铺平了通往现实版本的道路,即他自己向往的生活。因此,他不再是理想未来梦想的囚徒,而是成为建筑师。他的机器不再成为逃避现实的手段,而是在每时每刻遍历选择最优解,有意识地创造自己命运的工具。

在本文中,我们将研讨时间演化旅行算法(TETA),它实现了时间旅行的概念,其特点是它没有参数、或可更改的变量。该算法在寻找最佳解并细化解之间维持自然平衡。典型情况下,没有外部参数的算法仍会拥有影响其性能的常量形式的内部参数。然而,TETA 也没有这样的常数,这令其在同类产品中独一无二。


算法的实现

在所讲述的故事中,一位科学家在生活中通过改变关键变量,发现了一种在平行宇宙之间旅行的途径。这个比喻构成了所提出的优化算法的基础。为了令这一点更清清晰,参考下面的图例,其概括了每次做出决策时,都会出现的平行宇宙的算法思路。每个拥有完整空间的宇宙都是按锚点形式的特征表述来定义的:家庭、事业、成就、等等。

通过组合这些锚点的属性,就能创建一个代表优化问题之解的新宇宙,其中锚点是被优化的参数。

TETA

图例 1. 具有自己独特锚点(特征)的平行宇宙

TETA 算法基于多个平行宇宙的概念,每个平行宇宙都代表优化问题的潜在解。在其技术具现中,每个这样的宇宙都由坐标向量(a[i].c)描述,其中每个坐标都是一个锚点 — 判定所给现实配置的一个关键变量。这些锚点可被认为是最重要的参数,其设置会影响整体的解品质。

为了评估每个宇宙的品质,用到了适应度函数(a[i].f),它判定所给现实中的“存在舒适度”。该函数的数值越高,认为宇宙就越有利。每个宇宙不仅存储有关其当前状态的信息,还存储有关最知名配置(a[i].cB)的信息,这可与最成功场景的“记忆”进行比较。此外,该算法还维护全局最佳状态(cB),其代表所有发现的选项中最有利的配置。

N 个个体组成的种群形成一组平行宇宙,每个平行宇宙都由自己的一组锚点值来描述。这些宇宙不断根据适应度函数的值进行排位,这就创造了一种从最不利状态到最有利状态的层次结构。现实的每个锚点都是一个可优化的变量,这些变量的任何变化都会产生新的宇宙配置。完整的锚点集合形成一个变量 x = (x₁, x₂, ..., xₙ) 的向量,它完整描述了一个特定的现实。甚至,对于每个变量,定义了可接受数值的边界,这可解释为每个宇宙的物理定律,限制可能的变化。

每个宇宙的有利度评估是通过适应度函数 f(x) 进行的,该函数将宇宙的配置映射为实数。该值越高,认为给定现实越可取。以这种方式,创建了一个数学上严格的机制,用于评估和比较多个平行宇宙中各种可能的发展。

      该算法的关键特征是单一概率比(rnd *= rnd),它既决定了选择宇宙进行交互的概率,也决定了锚点变化的强度。这为系统创造了一种自然的自我平衡机制:最好的宇宙被选中的机会更高,但它们的锚点变化较小(与 rnd 成正比),而最差的宇宙虽然选择频率较低,但变化更强烈(与 1.0 - rnd 成正比)。

      这种方法反映出深邃的哲学思想,即不可能同时在所有事情上都达成完美。改进是经由各层面的不断平衡而发生的:有时最好的锚点或许会为了整体平衡而略有恶化,而最差的锚点则努力改进。变化的强度与宇宙的“良好”程度成正比,反映了现实生活,当有些事情走岔时,更有可能发生戏剧性的变化。

      如是结果,该算法不是简单地优化数值,而是模拟在复杂的多维生活环境系统中寻找平衡的过程,经由对其各层面的微妙平衡,努力寻找并非理想,而是最和谐的现实版本。

      图例 2. 红线是根据品质选择宇宙的概率函数,绿线是相应宇宙的锚点变化程度

      算法伪码:

      初始化:
      1. 创建 N 个平行宇宙的种群
      2. 对于每个宇宙:
         - 在可接受范围内随机初始化锚点(坐标)值
         - 设置初始最佳值等于当前值

      主循环:
      1. 按品质(适应度函数)对宇宙进行排序
         - 最好的宇宙获得较低的索引
         - 最差的宇宙获得较高的索引

      2. 对于 N 个宇宙的第 i 个:
         对于每个锚点(坐标):
         
         a) 选择一个用于交互的宇宙:
            - 生成一个从 0 到 1 的随机数 rnd
            - 平方 rnd,提升最佳宇宙的优先级
            - 选择与 rnd 成正比的 'pair' 索引
         
         b) 如果当前宇宙与所选不匹配(i ≠ pair):
            
            如果当前宇宙优于所选(i < pair):         - 锚点的轻微变化与 rnd 成正比
               - 新数值 = 当前值 + rnd * (所选数值 - 当前值)
            
            否则(当前宇宙比所选要差):
               如果(随机数字 > rnd):
                  - 锚点的强烈变化与(1 - rnd)成正比
                  - 新数值 = 当前值 + (1-rnd) * (所选数值 - 当前值)
               否则:
                  - 从最佳宇宙完整复制锚点数值
                  - 新数值 = 所选数值
         
         c) 否则(与自己互动):
            - 按高斯分布局部搜索
            - x新数值 = 高斯分布(当前值)
         
         d) 在可接受的限定内调整新锚点数值

      3. 更新最佳值:
         对于每个宇宙:
         - 如果当前解优于个体最佳,则更新个体最佳
         - 如果当前解优于全局最佳,则更新全局最佳

      4. 重复主循环,直到满足停止准则

      现在我们已准备好在代码中实现平行宇宙旅行机器的一切。我们来编写 C_AO_TETA 类,它将派生自 C_AO 类。以下是简要说明:

      • 构造函数 — 初始化名称、描述、以及链接到算法,并设置种群规模
      • SetParams 参数 — 取来自 “params” 数组中的值设置参数。
      • Init、MovingRevision 方法均已声明,但将在另一段代码中实现。
      class C_AO_TETA : public C_AO
      {
        public: //--------------------------------------------------------------------
        ~C_AO_TETA () { }
        C_AO_TETA ()
        {
          ao_name = "TETA";
          ao_desc = "Time Evolution Travel Algorithm";
          ao_link = "https://www.mql5.com/en/articles/16963";
      
          popSize = 50; // number of parallel universes in the population
      
          ArrayResize (params, 1);
          params [0].name = "popSize"; params [0].val = popSize;
        }
      
        void SetParams ()
        {
          popSize = (int)params [0].val;
        }
      
        bool Init (const double &rangeMinP  [],  // minimum values for anchors
                   const double &rangeMaxP  [],  // maximum values for anchors
                   const double &rangeStepP [],  // anchor change step
                   const int     epochsP = 0);   // number of search epochs
      
        void Moving ();
        void Revision ();
      
        private: //-------------------------------------------------------------------
      };
      //——————————————————————————————————————————————————————————————————————————————
      
      

      C_AO_TETA 类的 Init 初始化方法执行算法的初始设置。 

      方法参数
      • rangeMinP — 锚点的最小值数组。
      • rangeMaxP — 锚点的最大值数组。
      • rangeStepP — 锚点变化步骤数组。
      • epochsP — 搜索局次数量(默认为 0)。
      标准初始化
      • 该方法调用 StandardInit,执行锚点的检查、并设置范围。如果初始化失败,则返回 'false'。
      返回值
      • 如果所有检查和设置都成功,则该方法返回 “true”,示意算法初始化成功。
      //——————————————————————————————————————————————————————————————————————————————
      // TETA - Time Evolution Travel Algorithm
      // An optimization algorithm based on the concept of moving between parallel universes
      // through changing the key anchors (events) of life
      
      //——————————————————————————————————————————————————————————————————————————————
      bool C_AO_TETA::Init (const double &rangeMinP  [], // minimum values for anchors
                            const double &rangeMaxP  [], // maximum values for anchors
                            const double &rangeStepP [], // anchor change step
                            const int     epochsP = 0)   // number of search epochs
      {
        if (!StandardInit (rangeMinP, rangeMaxP, rangeStepP)) return false;
      
        //----------------------------------------------------------------------------
        return true;
      }
      //——————————————————————————————————————————————————————————————————————————————
      

      C_AO_TETA 类的 Moving 方法负责更改平行宇宙中的锚点,以便在算法中创建新锚点。

      检查修订状态
      • 如果 “revision” 为 'false',则该方法取来自给定范围内的随机值,初始化所有平行宇宙的初始锚点值,并应用函数将它们设置为有效值(基于步骤)。
      更新锚点值
      • 如果已经运作了修订,则发生一个跨所有平行宇宙的迭代。对于每个锚点,都会生成一个概率,并计算其新值:
        • 如果当前的宇宙更有利,那么锚点就朝着积极方向稍微调整一下,从而找到更好的平衡点。
        • 如果当前宇宙不太有利,概率测试或许会导致锚点发生重大变化、或彻底采用更有利宇宙的锚点。
        • 如果宇宙冲突,则使用高斯分布进行局部锚点调整。
      • 计算新数值之后,锚点会带至可接受的范围。

        该方法在实践中负责适配和改进解值(平行宇宙),这是优化算法的关键部分。 

        //——————————————————————————————————————————————————————————————————————————————
        void C_AO_TETA::Moving ()
        {
          //----------------------------------------------------------------------------
          if (!revision)
          {
            // Initialize the initial values of anchors in all parallel universes
            for (int i = 0; i < popSize; i++)
            {
              for (int c = 0; c < coords; c++)
              {
                a [i].c [c] = u.RNDfromCI (rangeMin [c], rangeMax [c]);
                a [i].c [c] = u.SeInDiSp  (a [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
              }
            }
        
            revision = true;
            return;
          }
        
          //----------------------------------------------------------------------------
          double rnd  = 0.0;
          double val  = 0.0;
          int    pair = 0.0;
        
          for (int i = 0; i < popSize; i++)
          {
            for (int c = 0; c < coords; c++)
            {
              // Generate a probability that determines the chance of choosing a universe,
              // as well as the anchor change force
              rnd  = u.RNDprobab ();
              rnd *= rnd;
        
              // Selecting a universe for sharing experience
              pair = (int)u.Scale (rnd, 0.0, 1.0, 0, popSize - 1);
        
              if (i != pair)
              {
                if (i < pair)
                {
                  // If the current universe is more favorable:
                  // Slightly change the anchor (proportional to rnd) to find a better balance
                  val = a [i].c [c] + (rnd)*(a [pair].cB [c] - a [i].cB [c]);
                }
                else
                {
                  if (u.RNDprobab () > rnd)
                  {
                    // If the current universe is less favorable:
                    // Significant change of anchor (proportional to 1.0 - rnd)
                    val = a [i].cB [c] + (1.0 - rnd) * (a [pair].cB [c] - a [i].cB [c]);
                  }
                  else
                  {
                    // Full acceptance of the anchor configuration from a more successful universe
                    val = a [pair].cB [c];
                  }
                }
              }
              else
              {
                // Local anchor adjustment via Gaussian distribution
                val = u.GaussDistribution (cB [c], rangeMin [c], rangeMax [c], 1);
              }
        
              a [i].c [c] = u.SeInDiSp  (val, rangeMin [c], rangeMax [c], rangeStep [c]);
            }
          }
        }
        //——————————————————————————————————————————————————————————————————————————————
        
        

        C_AO_TETA 类的 Revision 方法负责更新平行宇宙中的锚点配置,并按品质对这些宇宙进行排序。更多详情:

          更新全局最佳配置
          • 该方法遍历所有平行宇宙(从 0 到 popSize)。
          • 如果当前宇宙的 f 函数(a[i].f)的值大于 fB 全局最佳值,则:
            • fB 按(a[i].f)的数值更新。
            • 当前宇宙锚点配置将复制到 cB 局配置。
            更新每个宇宙的已知最佳配置
            • 如果当前宇宙的 f 函数值大于其已知最佳值(a[i].fB),则:
              • (a[i].fB)的值更新为(a[i].f)。
              • 当前宇宙的锚点配置被复制到其最知名的配置(a[i].cB)。
            宇宙排序
            • aT 静态数组被声明为存储个体。
            • 数组大小更改为 popSize。
            • 使用 u.Sorting_fB 函数按其最知名独体属性对宇宙进行排序。
              //——————————————————————————————————————————————————————————————————————————————
              void C_AO_TETA::Revision ()
              {
                for (int i = 0; i < popSize; i++)
                {
                  // Update globally best anchor configuration
                  if (a [i].f > fB)
                  {
                    fB = a [i].f;
                    ArrayCopy (cB, a [i].c);
                  }
              
                  // Update the best known anchor configuration for each universe
                  if (a [i].f > a [i].fB)
                  {
                    a [i].fB = a [i].f;
                    ArrayCopy (a [i].cB, a [i].c);
                  }
                }
              
                // Sort universes by their degree of favorability
                static S_AO_Agent aT []; ArrayResize (aT, popSize);
                u.Sorting_fB (a, aT, popSize);
              }
              //——————————————————————————————————————————————————————————————————————————————
              


              测试结果

              TETA results:

              TETA|Time Evolution Travel Algorithm|50.0|
              =============================
              5 Hilly's; Func runs: 10000; result: 0.9136198796338938
              25 Hilly's; Func runs: 10000; result: 0.8234856192574587
              500 Hilly's; Func runs: 10000; result: 0.3199003852163246
              =============================
              5 Forest's; Func runs: 10000; result: 0.970957820488216
              25 Forest's; Func runs: 10000; result: 0.8953189778250419
              500 Forest's; Func runs: 10000; result: 0.29324457646900925
              =============================
              5 Megacity's; Func runs: 10000; result: 0.7346153846153844
              25 Megacity's; Func runs: 10000; result: 0.6856923076923078
              500 Megacity's; Func runs: 10000; result: 0.16020769230769372
              =============================
              All score: 5.79704 (64.41%)

              最终结果:5.79704(64.41%)。考虑到测试函数的复杂性,这是一个优异的结果。该算法极快速地检测到最具前景最优解的表面重要区域,并立即开始细化它们,这能够在算法每次运算的可视化中看到。

              Hilly

              Hilly 测试函数上的 TETA

              Forest

                Forest 测试函数上的 TETA

              Megacity

              Megacity 测试函数上的 TETA

              值得注意的是,该算法在所有优化算法中达成了最佳结果,取代了种群算法组的领导者,在优化算法测试函数样本集中包含的 GoldsteinPrice 函数上,经受测试。

              GoldsteinPrice

              在 Goldstein 测试函数(可从测试函数列表中选择)上的 TETA

              GoldsteinPrice 的结果:

              5 GoldsteinPrice's; Func runs: 10000; result: 0.9999786723616957
              25 GoldsteinPrice's; Func runs: 10000; result: 0.9999750431600845
              500 GoldsteinPrice's; Func runs: 10000; result: 0.9992343490683104

              测试完成后,TETA 算法跻身十大最佳优化算法之列,并获得了可敬的第 6 名。

              # AO 描述 Hilly Hilly 最终 Forest Forest 最终 Megacity (离散) Megacity 最终 最终结果 % 最大
              10 p (5 F) 50 p (25 F) 1000 p (500 F) 10 p (5 F) 50 p (25 F) 1000 p (500 F) 10 p (5 F) 50 p (25 F) 1000 p (500 F)
              1 ANS 跨邻里搜索 0.94948 0.84776 0.43857 2.23581 1.00000 0.92334 0.39988 2.32323 0.70923 0.63477 0.23091 1.57491 6.134 68.15
              2 CLA 代码锁定算法(JOO) 0.95345 0.87107 0.37590 2.20042 0.98942 0.91709 0.31642 2.22294 0.79692 0.69385 0.19303 1.68380 6.107 67.86
              3 AMOm 动物迁徙优化 M 0.90358 0.84317 0.46284 2.20959 0.99001 0.92436 0.46598 2.38034 0.56769 0.59132 0.23773 1.39675 5.987 66.52
              4 (P+O)ES (P+O)进化策略 0.92256 0.88101 0.40021 2.20379 0.97750 0.87490 0.31945 2.17185 0.67385 0.62985 0.18634 1.49003 5.866 65.17
              5 CTA 彗尾算法(JOO) 0.95346 0.86319 0.27770 2.09435 0.99794 0.85740 0.33949 2.19484 0.88769 0.56431 0.10512 1.55712 5.846 64.96
              6 TETA 时间演化旅行算法(JOO) 0.91362 0.82349 0.31990 2.05701 0.97096 0.89532 0.29324 2.15952 0.73462 0.68569 0.16021 1.58052 5.797 64.41
              7 SDSm 随机扩散搜索 M 0.93066 0.85445 0.39476 2.17988 0.99983 0.89244 0.19619 2.08846 0.72333 0.61100 0.10670 1.44103 5.709 63.44
              8 AAm 射箭算法 M 0.91744 0.70876 0.42160 2.04780 0.92527 0.75802 0.35328 2.03657 0.67385 0.55200 0.23738 1.46323 5.548 61.64
              9 ESG 社会群体进化(JOO) 0.99906 0.79654 0.35056 2.14616 1.00000 0.82863 0.13102 1.95965 0.82333 0.55300 0.04725 1.42358 5.529 61.44
              10 SIA 模拟各向同性退火(JOO) 0.95784 0.84264 0.41465 2.21513 0.98239 0.79586 0.20507 1.98332 0.68667 0.49300 0.09053 1.27020 5.469 60.76
              11 ACS 人工协同搜索 0.75547 0.74744 0.30407 1.80698 1.00000 0.88861 0.22413 2.11274 0.69077 0.48185 0.13322 1.30583 5.226 58.06
              12 BHAm 黑洞算法 M 0.75236 0.76675 0.34583 1.86493 0.93593 0.80152 0.27177 2.00923 0.65077 0.51646 0.15472 1.32195 5.196 57.73
              13 ASO 无政府状态社会优化 0.84872 0.74646 0.31465 1.90983 0.96148 0.79150 0.23803 1.99101 0.57077 0.54062 0.16614 1.27752 5.178 57.54
              14 AOSm 原子轨道搜索 M 0.80232 0.70449 0.31021 1.81702 0.85660 0.69451 0.21996 1.77107 0.74615 0.52862 0.14358 1.41835 5.006 55.63
              15 TSEA 龟壳进化算法(JOO) 0.96798 0.64480 0.29672 1.90949 0.99449 0.61981 0.22708 1.84139 0.69077 0.42646 0.13598 1.25322 5.004 55.60
              16 DE 差异进化 0.95044 0.61674 0.30308 1.87026 0.95317 0.78896 0.16652 1.90865 0.78667 0.36033 0.02953 1.17653 4.955 55.06
              17 CRO 化学反应优化 0.94629 0.66112 0.29853 1.90593 0.87906 0.58422 0.21146 1.67473 0.75846 0.42646 0.12686 1.31178 4.892 54.36
              18 BSA 鸟群算法 0.89306 0.64900 0.26250 1.80455 0.92420 0.71121 0.24939 1.88479 0.69385 0.32615 0.10012 1.12012 4.809 53.44
              19 HS 谐波搜索 0.86509 0.68782 0.32527 1.87818 0.99999 0.68002 0.09590 1.77592 0.62000 0.42267 0.05458 1.09725 4.751 52.79
              20 SSG 苗木播种和生长 0.77839 0.64925 0.39543 1.82308 0.85973 0.62467 0.17429 1.65869 0.64667 0.44133 0.10598 1.19398 4.676 51.95
              21 BCOm 细菌趋化性优化 M 0.75953 0.62268 0.31483 1.69704 0.89378 0.61339 0.22542 1.73259 0.65385 0.42092 0.14435 1.21912 4.649 51.65
              22 ABO 非洲水牛优化 0.83337 0.62247 0.29964 1.75548 0.92170 0.58618 0.19723 1.70511 0.61000 0.43154 0.13225 1.17378 4.634 51.49
              23 (PO)ES (PO)进化策略 0.79025 0.62647 0.42935 1.84606 0.87616 0.60943 0.19591 1.68151 0.59000 0.37933 0.11322 1.08255 4.610 51.22
              24 TSm 禁忌搜索 M 0.87795 0.61431 0.29104 1.78330 0.92885 0.51844 0.19054 1.63783 0.61077 0.38215 0.12157 1.11449 4.536 50.40
              25 BSO 头脑风暴优化 0.93736 0.57616 0.29688 1.81041 0.93131 0.55866 0.23537 1.72534 0.55231 0.29077 0.11914 0.96222 4.498 49.98
              26 WOAm 韦尔优化算法 M 0.84521 0.56298 0.26263 1.67081 0.93100 0.52278 0.16365 1.61743 0.66308 0.41138 0.11357 1.18803 4.476 49.74
              27 AEFA 人工电场算法 0.87700 0.61753 0.25235 1.74688 0.92729 0.72698 0.18064 1.83490 0.66615 0.11631 0.09508 0.87754 4.459 49.55
              28 AEO 基于人工生态系统的优化算法 0.91380 0.46713 0.26470 1.64563 0.90223 0.43705 0.21400 1.55327 0.66154 0.30800 0.28563 1.25517 4.454 49.49
              29 ACOm 蚁群优化 M 0.88190 0.66127 0.30377 1.84693 0.85873 0.58680 0.15051 1.59604 0.59667 0.37333 0.02472 0.99472 4.438 49.31
              30 BFO-GA 细菌觅食优化 - GA 0.89150 0.55111 0.31529 1.75790 0.96982 0.39612 0.06305 1.42899 0.72667 0.27500 0.03525 1.03692 4.224 46.93
              31 SOA 简单优化算法 0.91520 0.46976 0.27089 1.65585 0.89675 0.37401 0.16984 1.44060 0.69538 0.28031 0.10852 1.08422 4.181 46.45
              32 ABHA 人工蜂巢算法 0.84131 0.54227 0.26304 1.64663 0.87858 0.47779 0.17181 1.52818 0.50923 0.33877 0.10397 0.95197 4.127 45.85
              33 ACMO 大气云层模型优化 0.90321 0.48546 0.30403 1.69270 0.80268 0.37857 0.19178 1.37303 0.62308 0.24400 0.10795 0.97503 4.041 44.90
              34 ADAMm 自适应动量评估 M 0.88635 0.44766 0.26613 1.60014 0.84497 0.38493 0.16889 1.39880 0.66154 0.27046 0.10594 1.03794 4.037 44.85
              35 ATAm 人工部落算法 M 0.71771 0.55304 0.25235 1.52310 0.82491 0.55904 0.20473 1.58867 0.44000 0.18615 0.09411 0.72026 3.832 42.58
              36 ASHA 人工降雨算法 0.89686 0.40433 0.25617 1.55737 0.80360 0.35526 0.19160 1.35046 0.47692 0.18123 0.09774 0.75589 3.664 40.71
              37 ASBO 自适应社会行为优化 0.76331 0.49253 0.32619 1.58202 0.79546 0.40035 0.26097 1.45677 0.26462 0.17169 0.18200 0.61831 3.657 40.63
              38 MEC 心智进化计算 0.69533 0.53376 0.32661 1.55569 0.72464 0.33036 0.07198 1.12698 0.52500 0.22000 0.04198 0.78698 3.470 38.55
              39 IWO 入侵杂草优化 0.72679 0.52256 0.33123 1.58058 0.70756 0.33955 0.07484 1.12196 0.42333 0.23067 0.04617 0.70017 3.403 37.81
              40 Micro-AIS 微型人工免疫系统 0.79547 0.51922 0.30861 1.62330 0.72956 0.36879 0.09398 1.19233 0.37667 0.15867 0.02802 0.56335 3.379 37.54
              41 COAm 布谷鸟优化算法 M 0.75820 0.48652 0.31369 1.55841 0.74054 0.28051 0.05599 1.07704 0.50500 0.17467 0.03380 0.71347 3.349 37.21
              42 SDOm 螺旋动力学优化 M 0.74601 0.44623 0.29687 1.48912 0.70204 0.34678 0.10944 1.15826 0.42833 0.16767 0.03663 0.63263 3.280 36.44
              43 NMm Nelder-Mead 方法 M 0.73807 0.50598 0.31342 1.55747 0.63674 0.28302 0.08221 1.00197 0.44667 0.18667 0.04028 0.67362 3.233 35.92
              44 BBBC 大爆炸-大紧缩算法 0.60531 0.45250 0.31255 1.37036 0.52323 0.35426 0.20417 1.08166 0.39769 0.19431 0.11286 0.70486 3.157 35.08
              45 CPA 循环孤雌生殖算法 0.71664 0.40014 0.25502 1.37180 0.62178 0.33651 0.19264 1.15093 0.34308 0.16769 0.09455 0.60532 3.128 34.76
              RW 随机游走 0.48754 0.32159 0.25781 1.06694 0.37554 0.21944 0.15877 0.75375 0.27969 0.14917 0.09847 0.52734 2.348 26.09


              汇总

              在研究 TETA 算法时,我始终在努力创造简单而高效的东西。平行宇宙和时间旅行的隐喻最初似乎是一个简单、巧妙的想法,但在开发过程中,它有机地演变成一种有效的优化机制。

              该算法的关键特点是不可能在所有事情上都一次性达到完美 — 您需要找到一个平衡点。在生活中,我们不断地在家庭、事业和个人成就之间取得平衡,而我经由锚点系统的这个概念,奠定了算法的基础。每个锚点都代表一个需要优化的重要层面,但不能以牺牲其它为代价。

              最有趣的技术解决方案,是在选择宇宙的概率、及其影响其它宇宙强度之间的连结。这创造了一种自然机制,其中最佳解被选中的机会更高,并且它们的影响取决于它们的品质。该方式在探索新的可能性、与利用已找到的优良解之间提供了平衡。

              测试该算法亦有出乎意料的优异结果。这令该算法对于计算资源有限的实际问题特别宝贵。甚至,该算法在不同类型的函数上始终表现出优异的结果,展示其全能型。特别令人愉快的是实现的紧凑性。只有大约 50 行关键代码,没有可自定义的参数,但却如此有效。这是一个真正成功的解决方案,将实现结合了简单性与高性能。

              终极,TETA 超出了我最初的预期。时间旅行的比喻催生了一种实用而有效的优化工具,可以应用于广泛的领域。这表明有时基于清晰的自然类比的简单解决方案也能非常有效。该算法是一口气创建的 — 从概念到实现 — 我非常满意在该算法上所做的工作,它可成为研究人员和从业者快速找到最优解决方案的好助手。 

              表格

              图例 3. 算法颜色渐变是根据相应测试

              图表

              图例 4. 算法测试结果直方图(从 0 到100,越高越好,其中 100 是最大可能的理论结果,存档中有一个用于计算评级表的脚本)

              TETA 的优点和缺点:

              优点:

              1. 唯一的外部参数是种群规模。
              2. 实现简单。
              3. 非常快速的 EA。
              4. 小维度和大维度问题两者均为平衡量级。

              缺点:

              1. 低维离散问题的结果散射。

              本文附有一个存档,其中包含当前版本的算法代码。文章作者不对规范算法描述的绝对准确性负责。其中许多都进行了修改,以提高搜索能力。文章中提出的结论和判断是基于实验结果。

              文章中用到的程序

              # 名字 类型 描述
              1 #C_AO.mqh
              包含
              种群优化算法的父类
              2 #C_AO_enum.mqh
              包含
              种群优化算法的枚举
              3 TestFunctions.mqh
              包含
              测试函数库
              4
              TestStandFunctions.mqh
              包含
              测试台函数库
              5
              Utilities.mqh
              包含
              辅助函数库
              6
              CalculationTestResults.mqh
              包含
              计算比较表中结果的脚本
              7
              Testing AOs.mq5
              脚本 所有种群优化算法的统一测试台
              8
              Simple use of population optimization algorithms.mq5
              脚本
              无可视化的种群优化算法的简单示例
              9
              Test_AO_TETA.mq5
              脚本 TETA 测试台

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

              附加的文件 |
              TETA.zip (155.82 KB)
              开发多币种 EA 交易(第 21 部分):准备重要实验并优化代码 开发多币种 EA 交易(第 21 部分):准备重要实验并优化代码
              为了取得进一步的进展,最好看看我们是否可以通过定期重新运行自动优化并生成新的 EA 来改进结果。关于使用参数优化的许多争论中的绊脚石是,在将盈利能力和回撤保持在指定水平的同时,所获得的参数在未来一段时间内可用于交易的时间有多长。有可能做到这一点吗?
              价格行为分析工具包开发(第十八部分):四分位理论(3)——四分位看板 价格行为分析工具包开发(第十八部分):四分位理论(3)——四分位看板
              本文中,我们在原有四分位脚本的基础上新增 "四分位看板"(Quarters Board) 工具,该工具让您无需返回代码即可直接在图表上切换四分位水平。您可以轻松启用或禁用特定水平,EA还会提供趋势方向注释,帮助您更好地理解市场走势。
              MQL5交易策略自动化(第十二部分):实现缓解型订单块(MOB)策略 MQL5交易策略自动化(第十二部分):实现缓解型订单块(MOB)策略
              在本文中,我们将构建一个MQL5交易系统,可针对“聪明资金”(Smart Money)交易自动检测订单块。我们将阐述该策略的规则,在MQL5中实现其逻辑,并融入风险管理以实现有效的交易执行。最后,我们将对该系统进行回测,以评估其表现,并对其进行优化以获得最优结果。
              MQL5自动化交易策略(第十一部分):开发多层级网格交易系统 MQL5自动化交易策略(第十一部分):开发多层级网格交易系统
              在本文中,我们将使用MQL5开发一款多层级网格交易系统EA,重点探讨网格交易策略背后的架构与算法设计。我们将研究多层网格逻辑的实现方式以及应对不同市场状况的风险管理技术。最后,我们将提供详尽的解释和实用技巧,指导您完成自动化交易系统的构建、测试与优化。