В статье автор расскажет об эволюционных вычислениях с использованием генетического алгоритма собственной реализации. Будет показано на примерах функционирование алгоритма, даны практические рекомендации по его использованию.
class COptimizatedParam: public CObject
{
public:
string name; //имя оптимизируемого параметра, требуется для выполнения ФФ(в моем случае у меня модель полностью так и работает как работала, только с виртуальным аккаунтом)
string type; //тип оптимизируемого параметра, требуется для см. выше
string on; //с какого значения начать выполнение -минимум
string step; //шаг
string end; //максимум
stringvalue; //в моем случае инициализация модели происходит по тому же CList, который передан функции оптимизации и value -текущее значение оптимизируемого параметра
在文章的自由库中处理基因型。在 FF 中处理表型(如例 2)。
上述情况意味着,如果在 FF 中处理表型,文库的工作效率一样高,但迭代次数(FF 运行)将大大高于 GA 直接处理表型的情况(因为搜索空间细节增加了)。在极限情况下,搜索(无表型细化)将趋向于连续搜索空间。
晚安。
我要感谢你写了一篇很棒的文章。
一开始,我觉得有点复杂,但后来我想明白了。
在我写这篇论坛文章之前,我想先澄清一下我是否正确理解了你的文章和 UGA 算法的过程:
1)为特定任务设置 UGA 的输入参数。
---UGA
2) 通过随机组合基因创建初始亲本群落
2.2)计算每个群体的 FF 结果
2.3)去除克隆。
3)从该群体的所有个体中确定最佳 FF 结果
4) 从第一个群体开始循环创建后代群体。后代是通过以下工具产生的杂交、人工突变和自然突变、基因复制和基因借用,其中
交叉--交换亲本的部分染色体、
人工突变--选择超出范围的基因(亲本 1 的基因、亲本 2 的基因)。
Est.突变 - 从范围内选择基因(基因范围的最小值,基因范围的最大值)。
复制--在接近亲代基因值的范围内选择基因,但有一定偏移。
基因借用--从与基因数量相等的亲本中创建 "组装个体"。
5 )删除克隆
6 )计算每个克隆的 FF 结果
7 )将后代个体的结果与参考结果进行比较,并进行可能的替换。
8)对所有个体从优到劣排序。
9) -->项目 4
10)如果出现 Y 不变的历时,则终止并输出找到的参考值。
我提前向您道歉,也许这是一个讨论主题而不是教程,但我无处寻求建议。实际上,我是在您的文章中第一次见到 GA 的(在您的文章之前,我甚至不明白终端测试器中的 "Fast(遗传算法)"是什么意思),所以我的知识和经验(我大约两个月前开始使用 MQL5 编程)有点有限。
如果我理解了您的 GA 算法,我会尝试将其移植到 OOP 中。事实上,我已经开始研究它了。我已经使用直接搜索实现了交易模型的自我优化,但还没有使用 GA。(模型的原理如文章 https://www.mql5.com/ru/articles/217 所述)。
在此先表示感谢。
mi__x__an:
......我想澄清一下,我对您的文章和 UGA 算法的理解是否正确?
日安 。
感谢您的及时回复。
那么我有几个问题。
这里的染色体数组是什么? 优化参数的可能值?
例如,如果 我们在 0.1 到 1 的范围内优化 "最小 批量"(最小批量步长为 0.1)、
那么数组将如下所示:{0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0},1 号染色体的基因数,最小 0.1 最大 1.0,步长 0.1?是这样吗?
还有一个相关的问题,如何输入这样一个数组,例如:优化止损[10...500]、止盈[10...500]、最小手数[0.1...1.0]和追踪标志(是否使用追踪)[0...1]?
一般来说,在优化不同类型、最小值和最大值的参数时,输入数据应该是怎样的?
感谢您的解答。
这里的 "染色体数组 "是什么? 优化参数的可能值?
举例来说,如果 我们在 0.1 到 1 的范围内优化 "最小 批量"(最小批量步长为 0.1)、
那么数组将如下所示:{0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}, 1 号染色体的基因数,最小 0.1 最大 1.0,步长 0.1?是这样吗?
还有一个相关的问题,如何输入这样一个数组,例如:优化止损[10...500]、止盈[10...500]、最小手数[0.1...1.0]和追踪标志(是否使用追踪)[0...1]?
一般来说,在优化不同类型、最小值和最大值的参数时,输入数据应该是怎样的?
感谢您的回答。
不需要、
Chromosome[] 正是注释中所说的。
第一个索引 [0] 是个体的适应度值。其他是给定范围内的优化参数。这就是基因型。
在 FF 中处理表型(止损、止盈、交易量、指标或其他)(染色体基因范围内优化参数的缩放):
例如,基因设置范围为 [-1;1],则
第 0 个指数:FF 值 <---------------------------------------------------------[8;8]//枢轴为 Pi/2 8。
第 1 个指数:止损 [10..500] <------------------------------------------------ [-1;1]
第 2 个指数:止盈 [10...500] <--------------------------------------------- [-1;1]
第 3 个指标:最小手数 [0.1...1.0] <--------------------------------------- [-1;1]
第 4 个索引:拖曳标志(是否使用拖曳)[0...1] <------ [-1;1]
此外,Chromosome[] 数组有 5 个单元格。例如,一个染色体可能是这样的 {0.2, 0.3, -0.8, 0.1, 0.9;}
但在这种情况下,必须在 FF 中处理非真实基因值的正确性。也就是说,如果我们对long、double 和 bool类型 进行优化,UGA 将为所有这些类型生成真实值,包括 bool 类型,在RangeMinimum 到 RangeMaximum 范围内会有许多不同的基因,真正可能使用的只有 1 和 0 这两个值。正确值的选择已经在 FF 中完成了吗?
那么,对我个人来说,消除这一缺点的最好办法就是引入一个服务函数,将染色体基因值修正为可在 FF 中使用的值。
-->生成后代-->将基因值调整为实际可用值-->删除克隆-->调用 FF。
您认为这样做会对 UGA 性能产生很大影响吗?毕竟,按照我们的想法,如果一个参数的优化步骤大于另一个参数,那么 FF 运行的次数就会减少。
对了,如果这不合适,那么你应该使用二进制遗传算法(比如在测试仪中实现的算法)。第四论坛上有一篇相关文章。
不,重点不同。该算法也完全可以用于这种情况。
mi__x__an:
但在这种情况下,必须在 FF 中处理值的正确性,而不是真正的基因。也就是说,如果我们对long、double 和 bool类型 进行优化,UGA 将为所有这些类型生成真实值,包括 bool 类型,在RangeMinimum 到 RangeMaximum 范围内会有许多不同的基因,而真正可能使用的只有 1 和 0 这两个值。正确值的选择已经在 FF 中完成了吗?
对表型的所有操作都应在 FF 中完成。这是一个从基因型到表型的解码问题。
好吧,我们假设优化后的参数是 bool 类型,而且只有两种可能的变体:true 和 false。那么解码过程如下
其中基因是染色体上的特定基因。
事实证明,由于该基因(基因型)可能存在多种变体,我们只能得到两种表型。自然界的生物也是如此。
然而,由此产生的一个自然结果是:产生的染色体变体数(因此,计算的 FF 数)将超过解决问题所需的次数。也就是说,优化将需要更长的时间。我已经提到过这一点。染色体的二进制编码也是如此。你仍然需要解码成特定任务的表型。
但是无论是二进制编码还是用实数表示基因,都可以很容易地通过为每个参数设置搜索步骤和步数来避免不必要的 FF 计算(以减少可能的染色体变体数量)。也就是说,提前切断不必要的染色体变体(这在二进制编码的标准优化器中已经实现)。文章中的 GA 也可以做到这一点,您只需为其添加适当的功能--为每个基因设置边界和步骤,即允许 GA直接使用表型。
但由于需要为库中的每个基因指定边界和步骤,这将降低其灵活性。
我在交易模型优化器中使用的方法可能不是最好的,甚至是最差的:
1 - 被优化参数的类 - CObject 继承者
2 - 主要通用模型的虚拟函数:
virtual CList *OptimizatedParams()
它允许每个特定模型创建自己的优化参数列表。
3. 优化函数 - 它递归枚举所有必要的值。
优化函数可以处理任何枚举类型。
现在的问题是:如果将 CList 作为输入数据,其中有关优化参数的信息通过该优化参数类传递,而 UGA 库本身会根据需要为每个基因创建尽可能多的边界和步骤,这将是合理的。这将赋予 UGA 库更大的灵活性,并减少不必要的 FF 运行次数,以创建不是基因而是表型的克隆。