-
Notifications
You must be signed in to change notification settings - Fork 0
/
PLS.jl
157 lines (141 loc) · 6.38 KB
/
PLS.jl
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
function PLS(len_N,neighborhood_structure,e,centro,numCentro)
tick()
#Memoria vectores estaciones candidatas.
mem_C = [];
index_mem_C = 0;
#Solución inicial x.
C = zeros(Int64,length(CANDIDATAS));
E = zeros(Int64,length(ESTACIONES));
obj_f1 = Inf;
obj_f2 = Inf;
obj = Inf;
f1 = Inf;
f2 = Inf;
#SE INICIALIZAN VARIABLES Y ESTRUCTURA
t = 0;
A = solucion[]; #CREAR A
st = solucion;
#SOLUCION INICIAL
while true
println("[PLS Paquete] Solución inicial");
C,E,f1,f2,obj,dmax = init_solution_mo(centro); #GENERAR SOLUCIÓN INICIAL
if obj != Inf
st = solucion(C,E,f1,f2,obj,dmax,0);
push!(A,st); #ACTUALIZAR ACHIVO
println("A:", length(A));
break;
end
end
#Se guarda primera solución.
first_C = copy(C);
first_E = copy(E);
first_obj = copy(obj);
first_obj_f1 = copy(f1);
first_obj_f2 = copy(f2);
name = "memArchivoPLSPaquete_$(numCentro)_exp_$(e)_$(len_N)_$(neighborhood_structure)_$(prioridad)_Epsilon_$(minEpsilon)-$(maxEpsilon)"
filename = name*".txt"
open(filename, "w") do file
#HASTA QUE TODAS LAS SOLUCIONES DEL ARCHIVO SEAN VISITADAS
while ~visitados(A)
#Se generan vecinos
println("[PLS Paquete] === Generación de vecinos ===");
N = generar_vecindario(len_N,st.C,st.E,neighborhood_structure,mem_C,index_mem_C);
indiceVisitado = findall(x -> x==st, A);
A[indiceVisitado[1]].visitado = 1;
println("[PLS Paquete] Índice marcado como visitado: ", indiceVisitado[1]);
for i=1:len_N
println("[PLS Paquete] Vecino # ",i," ===============");
aux_obj, aux_f1, aux_f2, aux_E, aux_dmax = SolverNL(N[i,:]);
#= revisar si es dominado por los que están en el archivo
si no es dominado por ninguno, entra al archivo =#
if criterioAcceso(aux_f1,aux_f2,A) == true
solNueva = solucion(N[i,:],aux_E,aux_f1,aux_f2,aux_obj,aux_dmax,0);
#= se buscan los índices de las soluciones que están dentro
del archivo y que están siendo dominadas por la última
solución agregada al archivo =#
indicesAEliminar = revisarDominanciaEnArchivo(aux_f1,aux_f2,A);
push!(A,solNueva);
str_indicesEliminados = "";
if length(indicesAEliminar) != 0
for dominatedIndex = 1 : length(indicesAEliminar)
str_indicesEliminados *= string(indicesAEliminar[dominatedIndex]);
if dominatedIndex != length(indicesAEliminar)
str_indicesEliminados *= ", ";
else
str_indicesEliminados *= ".";
end
end
println("[PLS Paquete] Indices a eliminar tras análisis dominancia: ", str_indicesEliminados);
#= se eliminan los elementos en el array con los indices
que se guardaron anteriormente. A se actualiza mediante
la función deleteat! =#
deleteat!(A,indicesAEliminar);
println("[PLS Paquete] # nuevo de soluciones en archivo:", length(A));
else
println("[PLS Paquete] No se encontraron soluciones dominadas");
end
end
end
#= Apenas se elige una solución del archivo, se marca como visitada,
ya que se le generará un vecindario apenas comience la siguiente
iteración, =#
st = selArchivo(A);
if(st == nothing)
break;
end
t+=1;
write(file, "ITERACION $t \n");
for i in 1:length(A)
aC = copy(A[i].C);
aE = copy(A[i].E);
a_obj = copy(A[i].obj);
a_obj_f1 = copy(A[i].f1);
a_obj_f2 = copy(A[i].f2);
a_dmax = copy(A[i].dmax);
write(file, "Archivo [$i] \n")
write(file, "C = $aC \n");
write(file, "E = $aE \n");
write(file, "FO1 = $a_obj_f1 \n");
write(file, "FO2 = $a_obj_f2 \n");
write(file, "DMAX = $a_dmax \n");
end
end
end
println("[PLS] ====== Resultados ======");
println("n° iter = $t");
println("Estructura vecindario = $neighborhood_structure");
println("Vecinos por iteración = $len_N");
println("N° clusters = $cl");
println("N° estaciones = $(length(ESTACIONES))");
println("1° FO1 = $first_obj_f1");
println("1° FO2 = $first_obj_f2");
name = "expPLSPaquete_$(numCentro)_exp_$(e)_$(len_N)_$(neighborhood_structure)_$(prioridad)_Epsilon_$(minEpsilon)-$(maxEpsilon)"
filename = name*".txt"
segundos = tok()
open(filename, "w") do file
write(file, "Segundos = $(segundos) \n")
write(file, "n° iter = $t \n")
write(file, "Estructura vecindario = $neighborhood_structure \n")
write(file, "Vecinos por iteración = $len_N \n")
write(file, "N° clusters = $cl \n")
write(file, "N° estaciones = $(length(ESTACIONES)) \n")
write(file, "1° FO1 = $first_obj_f1\n")
write(file, "1° FO2 = $first_obj_f2\n")
#sacar de archivo
for i in 1:length(A)
aC = copy(A[i].C);
aE = copy(A[i].E);
a_obj = copy(A[i].obj);
a_obj_f1 = copy(A[i].f1);
a_obj_f2 = copy(A[i].f2);
a_dmax = copy(A[i].dmax);
write(file, "Archivo [$i] \n")
write(file, "C = $aC \n");
write(file, "E = $aE \n");
write(file, "FO1 = $a_obj_f1 \n");
write(file, "FO2 = $a_obj_f2 \n");
write(file, "DMAX = $a_dmax \n");
end
end
return A,segundos,t;
end