Pareto Front computation with JGAP - keeping all individuals of a set fitness
I’m a user of JGAP and I would like to ask whether some things are possible with the package (i.e. if they are already implemented – then where, if not, whether I can implement them by extending some of the classes, and
if yes, which ones?).
I am optimizing a physical system (an electrical power converter) for losses and volume. It is therefore a multi-objective optimization.
Now, I want to compute at the end, not a single design, but the set of pareto-optimal designs – in other words, non-dominated designs – a series of compromises between losses and volume which are “best” for the given
parameters – i.e., for each combination of (loss,volume) to be pareto-optimal i.e. non-dominated there must be no other design which has the same losses and lower volume, or the same volume and lower losses, or both lower losses and lower volume. My population
after the final evolution should hopefully contain all such solutions (or some very close approximation of that set).
From a theoretical point of view, this can be obtained using the maximin function ( link.springer.com/content/pdf/10.1007/3-540-36970-8_1.pdf ), which compares all individuals to one another, and then gives a fitness
of < 0 for non-dominated (pareto-optimal) designs, and a fitness of > 0 for dominated designs.
Therefore I need the following:
1)I only want to discriminate between fitness > 0 and fitness < 0. The results (loss and volume) are not scaled (because scaling the volume would skew my results), hence a fitness of -145 vs. a fitness -5 is not
really meaningful in a comparison sense – I only know that -2 is better than 2, not necessarily that -50 is better than -5 (both may be on the pareto front).
2)I wish to therefore keep for the next generation all individuals with fitness < 0. The fitness > 0 ones, some can stay, some can go, the standard GA way, doesn’t matter. But the fitness < 0 individuals should
always be preserved because they are potential members of the pareto set, and this set is what I am after.
The question is, how can I do this in JGAP?
I know I can implement maximin by creating my own BulkFitnessFunction. However questions remain:
1)Can I use negative fitness values? The documentation seems to suggest I can’t (must be a positive double). But is this true even if I implement my own selector?
2)How do I insure that all individuals with a given fitness are promoted to the next generation? Is it enough to implement my own subclass of BestChromosomeSelector?
3)Keeping in mind what said above about the fitness value (that only whether it is less or greater than zero is truly meaningful), does the fitness value have any other influence on how JGAP operates (e.g. who
it selects for crossover or mutation, or something else) other than inside the selector classes? The documentation seems to suggest that the fitness value must be meaningful in terms of comparison (i.e. the difference between fitness 1 and fitness 10 must
be the same proportionally as between fitness 10 and fitness 100), but does this requirement hold if I implement my own selector, which only essentially discriminated between fitness > 0 and fitness < 0?
Has anybody done something similar with JGAP? Maximin seems to be a common approach with GA.