1
2
3
4
5
6
7
8
9 package com.delhezi.ga.crossover.standard;
10
11 import com.delhezi.ga.Chromosome;
12 import com.delhezi.ga.utility.RandomUniqueInteger;
13
14 import java.util.ArrayList;
15 import java.util.Collections;
16 import java.util.List;
17 import java.util.logging.Logger;
18
19
20
21
22
23
24
25
26 public class KPointCrossover implements com.delhezi.ga.crossover.ICrossover {
27
28
29 private static final Logger LOGGER =
30 Logger.getLogger(KPointCrossover.class.getName());
31
32
33
34
35
36 private static final String CLASS_NAME = KPointCrossover.class.getName();
37
38
39 private int k = 1;
40
41
42
43
44
45
46
47 public final void crossover(final Chromosome chromosome1,
48 final Chromosome chromosome2) {
49 LOGGER.entering(CLASS_NAME, "crossover",
50 new Object[] { chromosome1, chromosome2 });
51 this.crossover(chromosome1, chromosome2, this.k);
52 LOGGER.exiting(CLASS_NAME, "crossover",
53 new Object[] { chromosome1, chromosome2 });
54 }
55
56
57
58
59
60
61
62
63
64 public final void crossover(final Chromosome chromosome1,
65 final Chromosome chromosome2, int k) {
66 LOGGER.entering(CLASS_NAME, "crossover",
67 new Object[] { chromosome1, chromosome2, k });
68
69 if (chromosome1.size() < 2) {
70 return;
71 }
72 if (k > chromosome1.size() - 1) {
73 throw new IllegalArgumentException("k > chromosome1.size() - 1");
74 }
75 if (k < 1) {
76 throw new IllegalArgumentException("k < 1");
77 }
78
79
80 List<Integer> kPoints = new ArrayList<Integer>(k);
81
82 RandomUniqueInteger bezPowtorzenZUsuwaniem =
83 new RandomUniqueInteger(chromosome1.size()-1);
84
85 for (int i = 0; i < k; i++) {
86 kPoints.add(bezPowtorzenZUsuwaniem.get());
87 }
88
89 this.crossover(chromosome1, chromosome2, kPoints);
90
91 LOGGER.exiting(CLASS_NAME, "crossover",
92 new Object[] { chromosome1, chromosome2 });
93 }
94
95
96
97
98
99
100
101
102
103 private final void crossover(final Chromosome chromosome1,
104 final Chromosome chromosome2,
105 List<Integer> kPoints) {
106 LOGGER.entering(CLASS_NAME, "crossover",
107 new Object[] { chromosome1, chromosome2, kPoints });
108
109
110 assert chromosome1 != null : "Illegal argument chromosome1: null";
111 assert chromosome2 != null : "Illegal argument chromosome2: null";
112
113 assert kPoints != null : "Illegal argument kPoints: null";
114
115 Collections.sort(kPoints);
116
117 Object tmpCh;
118 boolean s = false;
119 for (int i = 0; i < chromosome1.size(); i++) {
120 if (s) {
121 tmpCh = chromosome1.getGene(i);
122 chromosome1.setGene(i, chromosome2.getGene(i));
123 chromosome2.setGene(i, tmpCh);
124 }
125 if (kPoints.size() > 0) {
126 if (i == kPoints.get(0) - 1) {
127 s = !s;
128 kPoints.remove(0);
129 }
130
131 if ((kPoints.size() == 0) && (s==false)) {
132 return;
133 }
134 }
135 }
136
137 LOGGER.exiting(CLASS_NAME, "crossover",
138 new Object[] { chromosome1, chromosome2 });
139 }
140
141
142
143
144
145
146 public void setK(int k) {
147 this.k = k;
148 }
149
150
151
152
153
154
155 public int getK() {
156 return this.k;
157 }
158 }