我有一个具有适应度函数的GA,可以评估为负值或正值。为了这个问题,让我们假设函数
u = 5 - (x^2 + y^2)
其中
x in [-5.12 .. 5.12]
y in [-5.12 .. 5.12]
现在在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
相反,我想将它们缩放到正值,所以我可以在下一阶段进行轮盘选择。
我必须在这里做一些根本错误的事情。我该如何处理这个问题?
答案 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的缩放健身值进行分隔。
答案 1 :(得分:1)
u = 5的最小可能值 - (2 * 5.12 ^ 2)。为什么不把它添加到你的?
答案 2 :(得分:1)
我同意之前的回答。线性缩放本身会尝试保留平均适应值,因此如果函数为负,则需要进行偏移。有关详细信息,请参阅Goldberg的遗传算法手册(1989年),第7章,第76-79页。