1 package net.bmahe.genetics4j.samples.clustering;
2
3 import net.bmahe.genetics4j.core.postevaluationprocess.FitnessSharing;
4
5 public class FitnessSharingUtils {
6
7
8 public static final FitnessSharing clusterDistance = FitnessSharing.ofStandard((i0, i1) -> {
9 final var cluster0 = PhenotypeUtils.toPhenotype(i0);
10 final var cluster1 = PhenotypeUtils.toPhenotype(i1);
11
12 double distanceAcc = 0.0D;
13 for (int i = 0; i < cluster0.length; i++) {
14 double distance = 0.0D;
15 distance += (cluster1[i][0] - cluster0[i][0]) * (cluster1[i][0] - cluster0[i][0]);
16 distance += (cluster1[i][1] - cluster0[i][1]) * (cluster1[i][1] - cluster0[i][1]);
17
18 distanceAcc += Math.sqrt(distance);
19 }
20
21 return distanceAcc;
22 }, 5.0);
23
24
25 public static final FitnessSharing hausDorffFitnessSharing = FitnessSharing.ofStandard((i0, i1) -> {
26 final var p0 = PhenotypeUtils.toPhenotype(i0);
27 final var p1 = PhenotypeUtils.toPhenotype(i1);
28
29 double min0 = Double.MAX_VALUE;
30 for (int i = 0; i < p0.length; i++) {
31 for (int j = 0; j < p1.length; j++) {
32 final double distance = Math
33 .sqrt((p0[i][0] - p1[j][0]) * (p0[i][0] - p1[j][0]) - (p0[i][1] - p1[j][1]) * (p0[i][1] - p1[j][1]));
34 if (distance < min0) {
35 min0 = distance;
36 }
37 }
38 }
39
40 double min1 = Double.MAX_VALUE;
41 for (int i = 0; i < p1.length; i++) {
42 for (int j = 0; j < p0.length; j++) {
43 final double distance = Math
44 .sqrt((p0[i][0] - p1[j][0]) * (p0[i][0] - p1[j][0]) - (p0[i][1] - p1[j][1]) * (p0[i][1] - p1[j][1]));
45 if (distance < min1) {
46 min1 = distance;
47 }
48 }
49 }
50
51 return Math.max(min0, min1);
52
53 }, 5.0);
54
55 }