Linear fitness scaling in Genetic Algorithm produces negative fitness values

落花浮王杯 提交于 2019-12-06 13:36:06

问题


I have a GA with a fitness function that can evaluate to negative or positive values. For the sake of this question let's assume the function

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

where

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

Now in the selection phase of GA I am using simple roulette wheel. Since to be able to use simple roulette wheel my fitness function must be positive for concrete cases in a population, I started looking for scaling solutions. The most natural seems to be linear fitness scaling. It should be pretty straightforward, for example look at this implementation. However, I am getting negative values even after linear scaling.

For example for the above mentioned function and these fitness values:

-9.734897  -7.479017 -22.834280  -9.868979 -13.180669   4.898595

after linear scaling I am getting these values

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

Instead, I would like to scale them to positive values, so I can do roulette wheel selection in the next phase.

I must be doing something fundamentally wrong here. How should I approach this problem?


回答1:


Your smallest possible value for u = 5 - (2*5.12^2). Why not just add this to your u?




回答2:


The main mistake was that the input to linear scaling must already be positive (by definition), whereas I was fetching it also negative values.

The talk about negative values is not about input to the algorithm, but about output (scaled values) from the algorithm. The check is to handle this case and then correct it so as not to produce negative scaled values.

  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;
  }

On the image below, if f'min is negative, go to else clause and handle this case.

Well the solution is then to prescale above mentioned function, so it gives only positive values. As Hyperboreus suggested, this can be done by adding the smallest possible value

u = 5 - (2*5.12^2)

It is best if we separate real fitness values that we are trying to maximize from scaled fitness values that are input to selection phase of GA.




回答3:


I agree with the previous answer. Linear scaling by itself tries to preserve the average fitness value, so it needs to be offset if the function is negative. For more details, please have a look in Goldberg's Genetic Algorithms book (1989), Chapter 7, pp. 76-79.



来源:https://stackoverflow.com/questions/6660069/linear-fitness-scaling-in-genetic-algorithm-produces-negative-fitness-values

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!