-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathCrossOvers.java
196 lines (148 loc) · 5.54 KB
/
CrossOvers.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
package Individual;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
public class CrossOvers {
private static List<Integer> filho1;
private static List<Integer> filho2;
private static List<Integer> PMX(List<Integer> pai1, List<Integer> pai2) {
// Lista usada para verificar se existe mais de um elemento com mesmo
// valor
List<Integer> posRepetidas = new ArrayList<Integer>();
HashMap hm1 = new HashMap();
HashMap hm2 = new HashMap();
int tam = pai1.size();
List<Integer> filho = new ArrayList<Integer>();
for (int i = 0; i < tam; i++) { // Inicializar ArrayList com null (pra
// poder acessar as posicoes)
filho.add(null);
posRepetidas.add(null);
// Associa cada valor dos elementos do pai1 a uma string atraves de
// um hashmap. A string eh
// representada por "N" mais um sufixo, sendo este, um valor inteiro
// de 1 ate o tamanho dos pais
Integer valor = pai1.get(i);
hm1.put("N" + (i + 1), valor);
}
// Vetor de string que guarda a ordem em que os elementos do pai2
// aparecem
// identificados pela String que identifica o hashmap
// TODO String[] ordem_elementos_pai2 = new String[pai2.size()];
ArrayList<String> ordem_elementos_pai2 = new ArrayList<String>();
for (int i = 1; i <= tam; i++) {
Integer valor = pai2.get(i - 1); // Pega o valor da primeira posicao
// de pai2
int indice = pai1.indexOf(valor); // Busca a posicao desse valor em
// pai1
// Se este valor apareceu uma unica vez
if (posRepetidas.contains(indice) == false) {
hm2.put("N" + (indice + 1), valor);
posRepetidas.add(indice);
ordem_elementos_pai2.add("N" + (indice + 1));
}
else {
int lastPos = indice; // Guarda a posicao da primeira ocorrencia
// do valor repetido em pai1
List<Integer> copia = new ArrayList<Integer>();
do {
// Copia sublista, a partir da posicao seguinte do indice
// guardado ate pai1.size() (porque eh exclusivo)
copia = pai1.subList(lastPos + 1, tam);
// Procura proxima ocorrendia do elemento na sublista,
// retorna -1 se nao encontrar
lastPos = copia.indexOf(valor);
System.out.println("\t\tLAST POS\t" + lastPos);
} while (posRepetidas.contains(indice + (lastPos + 1)) == true);
if (lastPos != -1) {
// Guarda posicao da nova ocorrencia, em relacao a sua
// posicao na lista pai1
indice = indice + (lastPos + 1);
posRepetidas.add(indice);
hm2.put("N" + (indice + 1), valor);
ordem_elementos_pai2.add("N" + (indice + 1));
}
}
}
// TODO TIRAR
// ArrayList<Integer> ValoresInseridosFilho = new ArrayList<Integer>();
int a, b, aux;
// Gera dois numeros distintos, aleatoriamente, menores que o tamanho do
// pai
do {
a = ThreadLocalRandom.current().nextInt(0, tam);
b = ThreadLocalRandom.current().nextInt(0, tam);
} while (a == b);
// Garante que a será sempre o menor numero
if (a > b) {
aux = a;
a = b;
b = aux;
}
// Vetor de string que guarda as trocas ocorridas no crossover atraves
// das strings que
// identificam os hashmas
ArrayList<String> ValoresInseridosFilho = new ArrayList<String>();
// Seleciona conjunto de elementos do pai1 e copia para filho,
// em suas posicoes respectivas
for (int i = a; i < b; i++) {
ValoresInseridosFilho.add("N" + (i + 1));
filho.set(i, (Integer) hm1.get("N" + (i + 1)));
// TODO filho.set(i, pai1.get(i));
// TODO ValoresInseridosFilho.add(pai1.get(i));
}
// Procura os elementos do pai2 nas mesmas
// posicoes para tentar inseri-los
// TODO for (int i = 0; i < (tam / 2); i++) {
for (int i = a; i < b; i++) {
// TODO String elemento = ordem_elementos_pai2.get(i);
String Elemento_de_Insercao = "N" + (i + 1);
String Elemento_de_Referencia = "N" + (i + 1);
int Posicao_de_Insercao = ordem_elementos_pai2.indexOf(Elemento_de_Referencia);
//Caso elemento ainda nao tenha sido inserido em filho
if (ValoresInseridosFilho.contains(Elemento_de_Insercao) == false) {
int j = 0;
while (j < tam) {
// Caso a posicao esteja livre, elemento do pai2 eh inserido
if (filho.get(Posicao_de_Insercao) == null) {
ValoresInseridosFilho.add(Elemento_de_Insercao);
filho.set(Posicao_de_Insercao, (Integer) hm2.get(Elemento_de_Insercao));
break;
}
// Caso a posicao ja tenha sido preenchid,
// procura-se pelo novo elemento equivalente
else {
Elemento_de_Referencia = "N" + (Posicao_de_Insercao+1);
Posicao_de_Insercao = ordem_elementos_pai2.indexOf(Elemento_de_Referencia);
}
j++;
}
}
// TODO int elemento = pai1.get(a + i);
}
// Completa o resto das posicoes vazias com os elementos do pai2
for (int i = 0; i < a; i++) {
if (filho.get(i) == null){
String elemento = ordem_elementos_pai2.get(i);
filho.set(i, (Integer) hm2.get(elemento));
}
}
for (int i = b; i < tam; i++) {
if (filho.get(i) == null){
String elemento = ordem_elementos_pai2.get(i);
filho.set(i, (Integer) hm2.get(elemento));
}
}
return filho;
}
public void ParcialmenteMapeado(List<Integer> pai1, List<Integer> pai2) {
filho1 = PMX(pai1, pai2);
filho2 = PMX(pai2, pai1);
}
public List<Integer> getF1() {
return filho1;
}
public List<Integer> getF2() {
return filho2;
}
}