遗传算法中的线性适应度缩放产生负适应值

时间:2011-07-12 05:59:58

标签: algorithm optimization genetic-algorithm

我有一个具有适应度函数的GA,可以评估为负值或正值。为了这个问题,让我们假设函数

u = 5 - (x^2 + y^2)

其中

x in [-5.12 .. 5.12]
y in [-5.12 .. 5.12]

Example fitness function

现在在GA的selection phase我正在使用simple roulette wheel。由于能够使用simple roulette wheel我的适应度函数必须对群体中的具体情况是正面的,我开始寻找缩放解决方案。最自然的似乎是linear fitness scaling。它应该非常简单,例如this implementation。但是,即使在线性缩放之后,我也会获得负值。

例如,对于上述功能和这些适应值:

-9.734897  -7.479017 -22.834280  -9.868979 -13.180669   4.898595
线性缩放后

我得到这些值

-9.6766040 -11.1755111  -0.9727897  -9.5875139  -7.3870793 -19.3997490

相反,我想将它们缩放到正值,所以我可以在下一阶段进行轮盘选择。

我必须在这里做一些根本错误的事情。我该如何处理这个问题?

3 个答案:

答案 0 :(得分:4)

主要的错误是线性缩放的输入必须已经是正的(根据定义),而我也是负值。

关于负值的讨论不是关于算法的输入,而是关于来自算法的输出(缩放值)。检查是处理这种情况,然后更正它,以便不产生负缩放值。

  if(p->min > (p->scaleFactor * p->avg - p->max)/
     (p->scaleFactor - 1.0)) { /* if nonnegative smin */
    d = p->max - p->avg;
    p->scaleConstA = (p->scaleFactor - 1.0) * p->avg / d;
    p->scaleConstB = p->avg * (p->max - (p->scaleFactor * p->avg))/d;
  } else {  /* if smin becomes negative on scaling */
    d = p->avg - p->min;
    p->scaleConstA = p->avg/d;
    p->scaleConstB = -p->min * p->avg/d;
  }

在下图中,如果f'min为负数,请转到else子句并处理此案例。

那么解决方案是预先对上述函数进行预定标,因此它只给出正值。正如Hyperboreus所说,这可以通过添加尽可能小的值来实现

u = 5 - (2*5.12^2)

最好将我们尝试最大化的真实健身值与输入到selection phase GA的缩放健身值进行分隔。

enter image description here

答案 1 :(得分:1)

u = 5的最小可能值 - (2 * 5.12 ^ 2)。为什么不把它添加到你的?

答案 2 :(得分:1)

我同意之前的回答。线性缩放本身会尝试保留平均适应值,因此如果函数为负,则需要进行偏移。有关详细信息,请参阅Goldberg的遗传算法手册(1989年),第7章,第76-79页。