不适合MT开发者!用什么来代替INIT_PARAMETERS_INCORRECT?

 

我遇到了这个问题:根据程序的逻辑,需要筛选出无效的函数调用。我为此使用INIT_PARAMETERS_INCORRECT。但是,遗传优化实际上是一下子就停止了。开发人员对有关这种情况的问题感到愤怒。他们建议研究遗传分析,等等,等等。

但我需要它做什么呢?我,作为一个用户,想得到结果,我不关心它是如何工作的。

因此,这里有一个关于三个函数1、2和3的例子。0是不能使用的。

在一个链中,函数不能重复,函数之间不能有0(否则可能出现重复)。

允许的链子的一个例子。

  • 100
  • 120
  • 130
  • 123
  • 132
  • 2..
  • 3..

不可接受的链子的例子。

  • 010
  • 001
  • 110
  • 101
  • 111
  • 121
  • 122
  • 131
  • 133
  • 112
  • 113
  • 102
  • 103
  • 2..
  • 3..
正如你所看到的,无效链比有效链多出一个数量级。如何进行采样? 如何替换 INIT_PARAMETERS_INCORRECT ?我在哪里挖?

 
如果参数是左手的,取消On-functions中的计算。运行速度会比INIT_PARAMETERS_INCORRECT慢,但不明显
 
怎么说呢?我可以给你一个小小的例子吗?
 

你能不能更明确地说明可能的输入参数集、不受欢迎的参数集,以及为什么有太多的不受欢迎的参数集?

我完全同意开发者的观点,即不应该有太多的不受欢迎的套装。最佳状态是不超过10%。

 
Сергей Таболин:
怎么说呢?我可以给你一个小小的例子吗?

fxsaber是对的。

如果输入了不正确的参数集--你会一次性返回所有OnTick()函数。而onTester - 你返回最小的结果。

 
Сергей Таболин:
怎么说呢?我可以给你一个小小的例子吗?
input int i = 0; 

bool Incorrect;
 
int OnInit()
{
  Incorrect = !i; // нулевое значение считается некорректным (пример)
  
//  return(Incorrect ? INIT_PARAMETERS_INCORRECT : INIT_SUCCEEDED); // Было
  return(INIT_SUCCEEDED);
}

void OnTick()
{
  if (Incorrect)
    return;
    
  // ...
}
 
这些不是输入参数集!它们是一套不能重复的功能!它们是一套不能重复的功能。在慢速优化中,INIT_PARAMETERS_INCORRECT确实有助于建立调用这些函数的有效链,但我有6个。我有117649个链条变体。但如果没有一些输入参数,这些链子是没有用的。有了他们,我们已经有超过38,000,000 !用缓慢的蛮力是没有办法的。
 
Сергей Таболин:
这些不是输入参数集!这是一套不能重复的功能!这是一套不能重复的功能。在慢速优化中,INIT_PARAMETERS_INCORRECT确实有助于建立调用这些函数的有效链,但我有6个。我有117649个链条变体。但如果没有一些输入参数,这些链子是没有用的。有了他们,我们已经有超过38,000,000 !用缓慢的蛮力是没有办法的。

遗传学会死亡,因为优化标准 的优化面应该是或多或少连续的(平滑的)。然而,在你的案例中,你得到了大量的尖峰(失败)。


你可以设置以下实验。以标准的专家顾问为例,在那里添加一些额外的优化参数--假的。使得他们90%的套装都是不正确的。GA会死。虽然没有假的参数,它也会做得很好。

 
fxsaber:

明白了。这只是一个选择正确的函数和它们在优化器中的顺序的问题。并手动写入所有不相关的链....那么,优化器将如何找到它们呢?

 
fxsaber:

遗传学会死亡,因为优化标准 的优化面应该是或多或少连续的(平滑的)。然而,在你的案例中,你得到了大量的尖峰(跌落)。

我理解这一点。我不明白的是,如何才能绕过它?

 
Сергей Таболин:

我明白这一点。我不明白的是如何绕过它?

一个秘诀是,开发人员将不正确的通行证的结果视为最近的先前计算的正确通行证。这将使优化表面的孔洞变得均匀。