-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
171 lines (131 loc) · 5.51 KB
/
Copy pathmain.cpp
File metadata and controls
171 lines (131 loc) · 5.51 KB
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
#include<bits/stdc++.h>
#include <fstream>
#include <chrono>
#include "global.h"
using namespace std;
//Creamos las variables globales del problema
string instance_name;
int n_bays;
int n_rows;
int max_h;
int n_initial_containers;
vector<vector<int>> initial_yard;
vector<int> stack_position; //stack_position[i] -> indica el stack en el que está el individuo i
//Variables con los hyperparámetros
hyperparams params;
debug_params debug;
//Variables con los archivos
write_files files;
//Generador de numeros aleatoreos
mt19937 rng;
int main(int argc, char *argv[]){
//Pedimos la semilla por consola
if(argc < 10){
cout << "Usage:\n./main instance_path seed max_gen popsize pcross pmut pmut_swap pmut_inversion pmut_intFlip";
cout << "\nExample:\n./main Random/R020306_0020_001.txt 11 5000 20 0.8 0.2 swap inv flip\n";
exit(1);
}
//Asignamos el path
string path = argv[1];
//Asignamos la semilla
int seed = atoi(argv[2]);
randomize(seed);
//Definimos hyperparametros del algoritmo
params.max_gen = atoi(argv[3]);
params.popsize = atoi(argv[4]); // Multiplo de 4
params.pmyo = 0.5;
params.pcross = stof(argv[5]);
params.pmut = stof(argv[6]);
params.pmut_swap = stof(argv[7]);
params.pmut_inversion = stof(argv[8]);
params.pmut_intFlip = stof(argv[9]);
params.n_heu = 5;
params.elite = 1; // Multiplo de 4, menor a popsize
//Definimos que vamos a debugear
debug.save_pops = true;
debug.show_initial_yard = false;
//Creamos los archivos de data
if(debug.save_pops){
files.f_all_pops.open("data/all_pops.txt");
files.f_best_ind.open("data/best_ind.txt");
files.exec_params.open("data/params.txt");
}
//Escribimos los parámetros de ejecución
if(debug.save_pops){
files.exec_params << "PARAMS: \n";
files.exec_params << "Instance " << path << "\n";
files.exec_params << "Seed: " << seed << "\n";
files.exec_params << "Max_gen: " << params.max_gen << "\n";
files.exec_params << "Popsize: " << params.popsize << "\n";
files.exec_params << "Cross prob: " << params.pcross << "\n";
files.exec_params << "Mut prob: " << params.pmut << "\n";
files.exec_params << "Swap prob: " << params.pmut_swap << "\n";
files.exec_params << "Inversion prob: " << params.pmut_inversion << "\n";
files.exec_params << "intFlip prob: " << params.pmut_intFlip << "\n";
files.exec_params << "N heuristics: " << params.n_heu << "\n";
files.exec_params << "Elites: " << params.elite << "\n";
}
//Comenzamos lectura de la instancia
ifstream file(path);
if(!file.is_open()){
cout << "\nNo se pudo abrir el archivo" << path << endl;
exit(1);
}
cout << "Reading instance: " << path << "\n";
readInstance(file, initial_yard, stack_position);
//Mostramos el yard inicial
if(debug.show_initial_yard) printYard(initial_yard);
auto start = chrono::high_resolution_clock::now();
//Inicializamos la población
vector<individuo> pop = initialize_pop(initial_yard, stack_position);
//Guardamos la población inicial en el txt
if(debug.save_pops){
writePob(0, pop, files.f_all_pops);
}
bool pruebas = false;
if(pruebas){
//Prueba de crossover
cout<<endl<<"Prueba Crossover: "<<endl;
vector<individuo> hijos = one_point_crossover(pop[params.popsize-1],pop[params.popsize-2]);
evaluateInd(hijos[0], initial_yard, stack_position);
evaluateInd(hijos[1], initial_yard, stack_position);
cout<<endl<<"Padres: ";
cout<<endl; printInd(pop[params.popsize-1]); cout<<endl; printInd(pop[params.popsize-2]);
cout<<endl<<"Hijos: ";
cout<<endl; printInd(hijos[0]); cout<<endl; printInd(hijos[1]);
//Prueba de mutación
cout<<endl<<"Prueba Mutaciones: "<<endl;
individuo original = hijos[0];
cout<<endl; cout<<"Ind original: "; printInd(original);cout<<endl;
//Swap
swap(hijos[0]);
evaluateInd(hijos[0], initial_yard, stack_position);
cout<<endl; cout<<"Mutacion swap: "; printInd(hijos[0]);cout<<endl;
hijos[0] = original;
//Inversion
inversion(hijos[0]);
evaluateInd(hijos[0], initial_yard, stack_position);
cout<<endl; cout<<"Mutacion inversion: "; printInd(hijos[0]);cout<<endl;
hijos[0] = original;
//Int flip
intFlip(hijos[0]);
evaluateInd(hijos[0], initial_yard, stack_position);
cout<<endl; cout<<"Mutacion intFlip: "; printInd(hijos[0]);cout<<endl;
}
//Ejecutamos el algoritmo
for (int i = 0; i < params.max_gen; i++)
{
generateNewPop(pop);
//mutatePop(pop);
evaluatePop(pop, initial_yard, stack_position);
if(debug.save_pops) writePob(i+1, pop, files.f_all_pops);
}
//De la última población sorteamos de forma descendente
sort(pop.begin(), pop.end(), compararPorFobjAsc);
if(debug.save_pops) writeIndDecoded(initial_yard, stack_position, pop[0], files.f_best_ind);
auto end = chrono::high_resolution_clock::now();
chrono::duration<double> elapsed = end - start;
cout<<endl<<"Mejor individuo encontrado: ";printInd(pop[0]);
cout<<endl<<"Tiempo de ejecucion: "<<elapsed.count()<<" segundos"<<endl;
return 0;
}