-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
127 lines (110 loc) · 4.89 KB
/
main.cpp
File metadata and controls
127 lines (110 loc) · 4.89 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
#include <iostream>
#include <fstream>
#include <cstring>
#include <bits/stdc++.h>
#include "classes.h"
#include "functions.h"
#include "generadorSoluciones.h"
using namespace std;
int main() {
double eficienciaEsperada = 0.02;
for(int i=1;i<2;i++){
for(int j=1;j<20;j++){
//-----EXTRACCIÓN DE DATOS DE ARCHIVOS (SE RESUELVEN AB101-AB220)-----
string nombreArchivo = "";
if(j<10){
nombreArchivo = "AB"+to_string(i)+"0"+to_string(j);
}
else{
nombreArchivo = "AB"+to_string(i)+to_string(j);
}
string archivoInput = "Instancias/"+nombreArchivo+".dat";
time_t start, end;
ifstream input(archivoInput);
Instancia inst;
Nodo *nodos;
if(input.is_open()){
inst = extraerInstancia(input);
if(inst.nombre == ""){
cout << "\nERROR EN EXTRACCION DE INSTANCIA\n";
exit(-1);
}
//Almacenar nodos en variable de heap:
nodos = (Nodo*)malloc(sizeof(Nodo)*(inst.numClientes+inst.numClientes+1));
extraerNodos(input,inst.numEstaciones,inst.numClientes,nodos);
}
else{
cout << "\nERROR EN LECTURA DE ARCHIVO\n";
exit(-1);
}
time(&start);
//Almacenar depot, estaciones y clientes en variables de stack
Nodo depot = nodos[0];
Nodo estaciones[inst.numEstaciones];
Nodo clientes[inst.numClientes];
//cout << depot.to_string();
for(int i=0;i<inst.numEstaciones;i++){
estaciones[i] = nodos[i+1];
//cout << estaciones[i].to_string();
}
for(int i=0;i<inst.numClientes;i++){
clientes[i] = nodos[i+1+inst.numEstaciones];
//cout << clientes[i].to_string();
}
input.close();
free(nodos);
//-----EJECUCION DEL GENERADOR DE SOLUCIONES Y OBTENCIÓN DE RESULTADOS------
ListaVehiculos vehiculos = loopGeneracionSolucion(depot, estaciones, clientes, inst, eficienciaEsperada);
/*
vehiculos.moveToStart();
vehiculos.next();
for(unsigned int i = 0;i<vehiculos.listSize;i++){
cout << vehiculos.curr->data.recorrido.to_string();
cout << "Distancia recorrida: "<< vehiculos.curr->data.distanciaTotalRecorrida<<"\n";
cout << "Tiempo transcurrido: "<< vehiculos.curr->data.tiempoTranscurrido<<"\n";
vehiculos.next();
}*/
time(&end);
//-----GENERAR ARCHIVO PARA SOLUCIÓN DE LA INSTANCIA ACTUAL-----
string archivoOutput = "Soluciones/"+nombreArchivo+".out";
ofstream output(archivoOutput);
double tiempoEjecucion = double(end-start)/ double(CLOCKS_PER_SEC);
//Calcular valores para mostrar:
float sumaDistancias = 0.0;
int sumaClientes = 0;
float distanciasExcedidas[vehiculos.listSize];
vehiculos.moveToStart();
vehiculos.next();
for(unsigned int i = 0; i < vehiculos.listSize; i++){
sumaDistancias += vehiculos.curr->data.distanciaTotalRecorrida;
sumaClientes += vehiculos.curr->data.cantClientesVisitados;
if(vehiculos.curr->data.distanciaTotalRecorrida > inst.maxDistancia){
distanciasExcedidas[i] = vehiculos.curr->data.distanciaTotalRecorrida - inst.maxDistancia;
}
else{
distanciasExcedidas[i] = 0.0;
}
vehiculos.next();
}
//Escribir en el archivo de output
vehiculos.moveToStart();
vehiculos.next();
output << std::fixed;
output << std::setprecision(2);
output << std::fixed << sumaDistancias << " " << sumaClientes << " " << vehiculos.listSize << " ";
output << std::setprecision(10);
output << tiempoEjecucion <<"\n";
for(unsigned int i = 0; i < vehiculos.listSize; i++){
output << std::setprecision(6);
output << vehiculos.curr->data.recorrido.to_string() << " " << vehiculos.curr->data.distanciaTotalRecorrida << " "
<< vehiculos.curr->data.tiempoTranscurrido << " ";
output << std::setprecision(2);
output << distanciasExcedidas[i] <<"\n";
vehiculos.next();
}
output.close();
vehiculos.clear();
}
}
return 0;
}