文章 "种群优化算法:社群进化(ESG)" - 页 2

 
Andrey Dik #:
我怀疑 GetMicrosecondCount 值能否在重复运行时重复这些值,即使你很努力也不行。当然,前提是单个测试的时间超过一微秒。
2024.02.03 16:11:25.824 OPTIMIZATION_METHOD_AO_BGA
2024.02.03 16:11:25.873 AmountCycles = 5000, Repeats = 1
2024.02.03 16:11:25.873 BestResult = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:25.873 Check = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:36.957 OPTIMIZATION_METHOD_AO_BGA
2024.02.03 16:11:37.007 AmountCycles = 5000, Repeats = 1
2024.02.03 16:11:37.007 BestResult = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:37.007 Check = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:47.218 OPTIMIZATION_METHOD_AO_BGA
2024.02.03 16:11:47.267 AmountCycles = 5000, Repeats = 1
2024.02.03 16:11:47.267 BestResult = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:47.267 Check = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:12:49.104 OPTIMIZATION_METHOD_AO_BGA
2024.02.03 16:12:49.152 AmountCycles = 5000, Repeats = 1
2024.02.03 16:12:49.152 BestResult = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:12:49.152 Check = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999

左侧是脚本运行时间列。

 
fxsaber #:

左侧是一列脚本开始时间。


99.99% 是所选步骤能达到的最大值,据我所知,小数点后两位的精度是在 BGA 设置中选择的。
因此,这并不是 gcc 初始化相同的结果,而是在设定任务内理论上完全可能收敛的结果。
如果打印每个测试中创建的第一个染色体,就能确保这一点,因为它们将是不同的染色体。这就是优化算法的神奇之处--在不同的(随机)初始状态下找到相同的解决方案。
 
我想出了一个测试方法,来测试算法对陷入局部困境的抵抗力。
我们需要在第一次迭代时,不是在整个区域内随机放置所有代理,而是放置在全局最小值处。我们的任务是找到全局最大值。我相信,很多算法都会这样停留在洞里。
这只是一个非常人为的案例,但却能得出有趣的结论。
 
Andrey Dik #:
我想到了一个测试算法对陷入本地化的抵抗力的方法。
我们需要在第一次迭代时,不是随机地将所有代理放置在整个区域内,而是放置在全局最小值处。我们的任务是找到全局最大值。我相信很多算法都会停留在洞里。
这只是一个非常人为的案例,但却能得出有趣的结论。

整个种群在某一点上是一个退化种群。这也是对种群多样性下降影响的测试,算法应该能够摆脱这种瓶颈。

这只是胡思乱想。

 
Andrey Dik #:
我们需要在第一次迭代时,不是随机地将所有代理放置在整个区域,而是放置在全局最小值处。我们的任务就是找到全局最大值。

  1. 通常的启动方式是搜索全局最大值。
  2. 然后从找到的点(MaxTmp)开始寻找全局最小值。
  3. 然后从找到的点(MinTmp)开始寻找全局最大值。
  4. 进入第 2 步。

在步骤 2-3 中,我们将测量离全局最小值/最大值的距离(MaxGlobal - MaxTmp + MinTmp - MinGlobal)。平均值就是优化算法的评分1。

(MaxTmp[i]-MinTmp[i])之和的平均值就是优化算法的评分 2。


现在还没有允许从某一点开始运行算法的函数。

 
fxsaber #:

  1. 正常启动,搜索全局最大值。
  2. 然后从找到的点(MaxTmp)开始搜索全局最小值。
  3. 然后从找到的点(MinTmp)开始搜索全局最大值。
  4. 转到步骤 2。

在步骤 2-3 中,我们将测量离全局最小值/最大值的距离(MaxGlobal - MaxTmp + MinTmp - MinGlobal)。平均值是优化算法的评分1。

我们取总和(MaxTmp[i]-MinTmp[i])的平均值-优化算法的评分 2。


你可以这样做))

Сейчас нет функции, позволяющей запускать алгоритм из точки.

您可以在第一个纪元测量 FF 之前,"强制 "将代理的坐标初始化为任意值。代理的字段是公开的。算法的 "内脏 "试图让它们尽可能地从外部访问,当然,这与确保字段安全的通常做法相矛盾,但无论如何,想自取灭亡的人总会找到办法的,因此使用算法的便利性得以保留。

那么,HCS 的初始化问题解决了吗?

 
Andrey Dik #:

99.99% 是所选间距能达到的最大值,据我所知,在 BGA 设置中,所选精度为小数点后两位。
因此,这并不是 gcc 初始化相同的结果,而是在设定任务内理论上完全可能收敛的结果。
如果打印每个测试中创建的第一个染色体,就能确定这一点,因为每个测试创建的染色体都不一样。这就是优化算法的神奇之处--在不同的(随机)初始状态下找到相同的解决方案。

您说得对,谢谢!

void OnStart()
{
  Print(GetMicrosecondCount());
}
2024.02.04 15:31:28.422 2142
2024.02.04 15:31:40.553 2367
2024.02.04 15:31:42.385 2326
 
Andrey Dik #:

在第一次测量 FF 之前,可以 "强制 "从外部将代理的坐标初始化为任何值。

请举例说明你们的两种算法。

 
fxsaber #:

请举例说明您的两种算法。

在历时的主循环中插入一段代码,用函数全局最小值的坐标覆盖代理的坐标:

for (int epochCNT = 1; epochCNT <= epochCount && !IsStopped (); epochCNT++)
    {
      AO.Moving ();
      
      //--插入的代码----插入的代码----插入者
      if (epochCNT == 1)
      {
        for (int set = 0; set < ArraySize (AO.a); set++)
        {
          for (int i = 0; i < funcCount; i++)
          {
            AO.a [set].c [i * 2]     = f.GetMinFuncX ();
            AO.a [set].c [i * 2 + 1] = f.GetMinFuncY ();
          }
        }
      }
      //--插入的代码----插入的代码----插入者

      for (int set = 0; set < ArraySize (AO.a); set++)
      {
        AO.a [set].f = f.CalcFunc (AO.a [set].c, funcCount);
      }

      AO.Revision  ();

      if (Video_P)
      {
        //drawing a population--------------------------------------------------
        SendGraphToCanvas  (1, 1);

        for (int i = 0; i < ArraySize (AO.a); i++)
        {
          PointDr (AO.a [i].c, f, 1, 1, funcCount, false);
        }
        PointDr (AO.cB, f, 1, 1, funcCount, true);

        MaxMinDr (f);

        //绘制收敛图---------------------------------------------
        xConv = (int)Scale (epochCNT, 1,              epochCount,     H + 2, W - 3, false);
        yConv = (int)Scale (AO.fB,   f.GetMinFun (), f.GetMaxFun (), 2,     H - 2, true);
        Canvas.FillCircle (xConv, yConv, 1, COLOR2RGB (clrConv));

        Canvas.Update ();
      }
    }

这一招对 BGA 算法不起作用,因为这样我们只能覆盖表型,而二进制基因型将保持不变。为此,我们必须进入算法内部,当种群处于初级阶段时,我们就必须执行这样的外科手术。

这就是以这种方式初始化 ESG 的结果:

扩大

在这里,我拍摄了一段 ESG 的视频,你可以看到它是如何从一个点爬出来,向四周扩散,寻找全局最大值的。并不是所有算法都会这样,我在文章中提到过,有些算法根本没有 "逃离陷阱 "的机制。

 
你好,我刚刚开始了解内置快速遗传算法的 替代方案。我想知道你能否帮助我实现 BGA 优化。我一直在看你们关于这个主题的一些文章。不过,我觉得自己起步晚了,错过了一些信息,也不知道如何使用不同的算法来优化 EA。我下载并编译了 test_ao_bga.mq5。当我加载终端时,它显示:"程序类型无效,加载 Test_AO_BGA.ex5 失败"。如果我尝试运行它,终端报告说 "未找到 Test_AO_BGA.ex5"。能否请您帮助我使其正常运行?我如何配置自己的 EA 以使用 BGA 优化?谢谢。