-
Notifications
You must be signed in to change notification settings - Fork 1
/
projet_MAUSSION_RIOU.cpp
187 lines (133 loc) · 3.74 KB
/
projet_MAUSSION_RIOU.cpp
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
/*! \file projet_MAUSSION_RIOU.cpp
\brief Optimisation de la deuxième version du problème de voyageur de commerce
\author RIOU Matthieu, MAUSSION Damien
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <glpk.h> /* Nous allons utiliser la bibliothèque de fonctions de GLPK */
#include <time.h>
#include <sys/time.h>
#include <sys/resource.h> /* Bibliothèques utilisées pour mesurer le temps CPU */
#include <math.h>
#include <list>
#include "donnees.h"
#include "AlgoEnumeration.h"
#include "PartitionnementEnsemble.h"
#include <iostream>
/* structures et fonctions de mesure du temps CPU */
struct timeval start_utime; //!< Retient le temps de départ du crono
struct timeval stop_utime; //!< Retient le temps d'arrêt du crono
/*! \brief Démarre le crono
*/
void crono_start()
{
struct rusage rusage;
getrusage(RUSAGE_SELF, &rusage);
start_utime = rusage.ru_utime;
}
/*! \brief Arrête le crono
*/
void crono_stop()
{
struct rusage rusage;
getrusage(RUSAGE_SELF, &rusage);
stop_utime = rusage.ru_utime;
}
/*! \brief Donne le temps du crono
\return Le temps en ms
*/
double crono_ms()
{
return (stop_utime.tv_sec - start_utime.tv_sec) * 1000 +
(stop_utime.tv_usec - start_utime.tv_usec) / 1000 ;
}
/*! \brief Lecture des données
\param file Le chemin du fichier de données
\param p Les données à remplir
*/
void lecture_data(char *file, donnees *p)
{
int i,j;
FILE *fin;
int val;
fin = fopen(file,"rt");
/* Lecture du nombre de villes */
fscanf(fin,"%d",&val);
p->nblieux = val;
/* Allocation mémoire pour la demande de chaque ville, et le distancier */
p->demande = (int *) malloc (val * sizeof(int));
p->C = (int **) malloc (val * sizeof(int *));
for(i = 0;i < val;i++) p->C[i] = (int *) malloc (val * sizeof(int));
/* Lecture de la capacité */
fscanf(fin,"%d",&val);
p->capacite = val;
/* Lecture des demandes des clients */
for(i = 1;i < p->nblieux;i++)
{
fscanf(fin,"%d",&val);
p->demande[i] = val;
}
/* Lecture du distancier */
for(i = 0; i < p->nblieux; i++)
for(j = 0; j < p->nblieux; j++)
{
fscanf(fin,"%d",&val);
p->C[i][j] = val;
}
fclose(fin);
}
/*! \brief Libère les données en mémoire
\param p Les données à détruire
*/
void free_data(donnees *p)
{
int i;
for(i = 0;i < p->nblieux;i++) free(p->C[i]);
free(p->C);
free(p->demande);
}
/*! \brief Fonction main
Elle résout le problème d'optimisation de Blade Flyer en le décomposant en trois parties distinctes. Elle affiche ensuite son temps d'exécution.
\param argc Le nombre d'argument
\param argv Les arguments. Le nom du fichier de données est attendu en premier argument.
*/
int main(int argc, char *argv[])
{
/* Déclarations des variables */
donnees d;
double temps;
/* Chargement des données à partir d'un fichier */
lecture_data(argv[1],&d);
/* Lancement de la résolution... */
crono_start(); // .. et donc du chronomètre
/* Partie 1 : Calcul des regroupements de clients
* Problème d'énumération
*/
std::list<Tournee*> t = enumTournee(d);
/* Partie 2 : Calcul de la longueur minimum de chaque tournée
* Problème du Voyageur de Commerce
*/
std::list<Tournee*>::iterator it;
for(it = t.begin(); it != t.end(); ++it)
{
(*it)->calculLongueurMin(d);
}
/* Partie 3 : Calcul du meilleure ensemble de tournée
* Problème de partitionnement d'ensemble
*/
partitionnementEnsemble(t, d.nblieux);
/* Problème résolu, arrêt du chrono */
crono_stop();
temps = crono_ms()/1000,0;
/* Affichage des résultats */
printf("Temps : %f\n",temps);
/* libération mémoire */
free_data(&d);
for(it = t.begin(); it != t.end(); ++it)
{
delete (*it);
}
/* J'adore qu'un plan se déroule sans accroc! (Moi aussi !) */
return 0;
}