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

Algorithm 遗传算法中的线性适应度缩放产生负适应度值,algorithm,optimization,genetic-algorithm,Algorithm,Optimization,Genetic Algorithm,我有一个带有适应度函数的GA,它可以计算为负值或正值。为了这个问题,让我们假设函数 u = 5 - (x^2 + y^2) 在哪里 x in [-5.12 .. 5.12] y in [-5.12 .. 5.12] 现在我正在使用GA的选择阶段。由于要能够使用简单轮盘赌轮我的适应度函数必须适用于人群中的具体情况,因此我开始寻找缩放解决方案。最自然的方法似乎是线性适应度缩放。它应该是非常简单的,比如看。但是,即使在线性缩放后,我也会得到负值 例如,对于上述函数和这些适应值: -9.73489

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

u = 5 - (x^2 + y^2)
在哪里

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

现在我正在使用GA的
选择阶段。由于要能够使用
简单轮盘赌轮
我的适应度函数必须适用于人群中的具体情况,因此我开始寻找缩放解决方案。最自然的方法似乎是
线性适应度缩放
。它应该是非常简单的,比如看。但是,即使在线性缩放后,我也会得到负值

例如,对于上述函数和这些适应值:

-9.734897  -7.479017 -22.834280  -9.868979 -13.180669   4.898595
线性缩放后,我得到这些值

-9.6766040 -11.1755111  -0.9727897  -9.5875139  -7.3870793 -19.3997490
相反,我希望将它们缩放为正值,以便在下一阶段进行轮盘赌轮选择


我一定是做错了什么。我应该如何处理这个问题?

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

关于负值的讨论不是关于算法的输入,而是关于算法的输出(缩放值)。检查的目的是处理这种情况,然后进行纠正,以避免产生负的缩放值

  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)
最好将我们试图最大化的真实适应度值与输入GA的
选择阶段
标度适应度值分开


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

关于负值的讨论不是关于算法的输入,而是关于算法的输出(缩放值)。检查的目的是处理这种情况,然后进行纠正,以避免产生负的缩放值

  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)
最好将我们试图最大化的真实适应度值与输入GA的
选择阶段
标度适应度值分开


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

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

我同意前面的答案。线性缩放本身试图保持平均适应度值,因此如果函数为负,则需要对其进行偏移。有关更多详细信息,请参阅戈德堡的遗传算法书(1989年),第7章,第76-79页

我同意前面的答案。线性缩放本身试图保持平均适应度值,因此如果函数为负,则需要对其进行偏移。有关更多详细信息,请参阅戈德堡的遗传算法书(1989年),第7章,第76-79页

u=5-(2*5.12^2)的最小可能值。为什么不把这个加到你的u染色体上呢?据我所知,这样做会破坏种群内的适合度分布,并且会为下一代挑选出如此不同/错误的染色体。在我的帖子中的链接中:“我们希望在人群中的最大适应度个体和平均人群适应度之间保持一定的关系。”您是否完全使用了链接页面中的代码?如果你仔细阅读,他们会说这段代码确实会产生负值,你仍然需要通过f'_min的移位进行调整。是的,我使用了我链接到的页面中的算法,但将其转换为R。据我所知,在该算法中,else子句(/*如果smin在缩放时变为负值*/)已经可以处理这个问题了,不是吗,“f''u min'的移位就是我建议的。u=5-(2*5.12^2)的最小可能值。为什么不把这个加在u上呢?据我所知,这样做会破坏种群内的适应度分布,并且会为下一代挑选出如此不同/错误的染色体。从我帖子中的链接:我们希望在群体中的最大适应度个体和平均群体适应度之间保持一定的关系。“您是否完全使用了链接页面中的代码?如果你仔细阅读,他们会说这段代码确实会产生负值,你仍然需要通过f'_min的移位进行调整。是的,我使用了我链接到的页面中的算法,但将其转换为R。据我所知,在该算法中,else子句(/*如果smin在缩放时变为负值*/)已经可以处理这个问题了,不是吗,我的建议是“转移f''u min”。