View Javadoc
1   package net.bmahe.genetics4j.moo.spea2.replacement;
2   
3   import java.util.Comparator;
4   import java.util.List;
5   import java.util.stream.Collectors;
6   import java.util.stream.IntStream;
7   
8   import org.apache.commons.lang3.Validate;
9   import org.apache.commons.lang3.tuple.ImmutablePair;
10  import org.apache.commons.lang3.tuple.Pair;
11  
12  import net.bmahe.genetics4j.core.Population;
13  
14  public class SPEA2Utils {
15  
16  	private SPEA2Utils() {
17  	}
18  
19  	public static <T extends Comparable<T>> int strength(final Comparator<T> dominance, final int index,
20  			final T fitness, final Population<T> population) {
21  		Validate.isTrue(index >= 0);
22  		Validate.isTrue(index < population.size());
23  
24  		Validate.notNull(fitness);
25  		Validate.notNull(population);
26  		Validate.isTrue(population.size() > 0);
27  
28  		int dominatedCount = 0;
29  
30  		for (int j = 0; j < population.size(); j++) {
31  			final T fitnessJ = population.getFitness(j);
32  
33  			if (dominance.compare(fitness, fitnessJ) > 0) {
34  				dominatedCount++;
35  			}
36  		}
37  
38  		return dominatedCount;
39  	}
40  
41  	public static <T extends Comparable<T>> int rawFitness(final Comparator<T> dominance, final double[] strengths,
42  			final int index, final T fitness, final Population<T> population) {
43  		Validate.isTrue(index >= 0);
44  		Validate.isTrue(index < population.size());
45  
46  		Validate.notNull(strengths);
47  		Validate.notNull(fitness);
48  		Validate.notNull(population);
49  		Validate.isTrue(population.size() > 0);
50  		Validate.isTrue(population.size() == strengths.length);
51  
52  		int rawFitness = 0;
53  
54  		for (int j = 0; j < population.size(); j++) {
55  			final T fitnessJ = population.getFitness(j);
56  
57  			if (index != j) {
58  				if (dominance.compare(fitness, fitnessJ) < 0) {
59  					rawFitness += strengths[j];
60  				}
61  			}
62  		}
63  
64  		return rawFitness;
65  	}
66  
67  	public static <T extends Comparable<T>> List<Pair<Integer, Double>> kthDistances(
68  			final double[][] distanceObjectives, final int index, final T fitness,
69  			final Population<T> combinedPopulation) {
70  		Validate.notNull(distanceObjectives);
71  		Validate.isTrue(index >= 0);
72  		Validate.isTrue(index < combinedPopulation.size());
73  
74  		Validate.notNull(fitness);
75  		Validate.notNull(combinedPopulation);
76  		Validate.isTrue(combinedPopulation.size() > 0);
77  
78  		return IntStream.range(0, combinedPopulation.size())
79  				.boxed()
80  				.sorted((a, b) -> Double.compare(distanceObjectives[index][a], distanceObjectives[index][b]))
81  				.map(i -> ImmutablePair.of(i, distanceObjectives[index][i]))
82  				.collect(Collectors.toList());
83  
84  	}
85  
86  }