-
Notifications
You must be signed in to change notification settings - Fork 0
/
CaixeiroVianjanteMain.cpp
187 lines (162 loc) · 6.3 KB
/
CaixeiroVianjanteMain.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
/*Faculdade de Ciência e Tecnologia de Montes Claros
Professor: Alberto Miranda
Matéria: Otimização
Trabalho: Travelling Salesman Problem
Keisse Lopes Brandão e Daniel Melo Lafetá
*/
#include <cstdlib>
#include <iostream>
#include "glpk.h"
#define INF (2000111222)
int nCidades, nEstradas;
int G[123][123];
struct Estrada{
int ori, dest, dist;
};
Estrada estradas[12345];
void leEstradas() {
scanf("%d%d", &nCidades, &nEstradas);
for (int ori = 1; ori <= nCidades; ++ori) {
for (int dest = 1; dest <= nCidades; ++dest) {
G[ori][dest] = INF;
}
}
for(int estrada = 1; estrada <= nEstradas; ++estrada) {
int ori, dest, dist;
scanf("%d%d%d", &ori, &dest, &dist);
estradas[estrada].ori = ori;
estradas[estrada].dest = dest;
estradas[estrada].dist = dist;
G[ori][dest] = G[dest][ori] = dist;
}
}
void NADA() {
glp_prob *lp;
lp = glp_create_prob();
glp_add_cols(lp, 3);
glp_set_col_bnds(lp, 1, GLP_LO, 0.0, 3.0); // 0 <= x1
glp_set_col_bnds(lp, 2, GLP_LO, 0.0, 2.0); // 0 <= x2
glp_set_col_bnds(lp, 3, GLP_LO, 0.0, 0.0); // 0 <= x3
glp_set_obj_dir(lp, GLP_MAX); //max
glp_set_obj_coef(lp, 1, -3.0); // -3x1
glp_set_obj_coef(lp, 2, 4.0); // +4x2
glp_set_obj_coef(lp, 3, 11.0); // +11x3
// max -3x1 + 4x2 + 11 x3.
int indCol[123];
double val[123];
glp_add_rows(lp, 1);
indCol[1] = 1; val[1] = 10; // 10*x1
indCol[2] = 2; val[2] = 3; // 3*x2
glp_set_row_bnds(lp, 1, GLP_UP, 0.0, 15.0);// <=15
glp_set_mat_row(lp, 1, 2, indCol, val);// 10 x1 + 3 x2 <= 15
glp_add_rows(lp, 1);
indCol[1] = 3; val[1] = 9; // 9*x3
indCol[2] = 1; val[2] = 7; // 7*x1
glp_set_row_bnds(lp, 2, GLP_UP, 0.0, 38.0);// <=38
glp_set_mat_row(lp, 2, 2, indCol, val);// 7x1+9x2<=38
glp_add_rows(lp, 1);
indCol[1] = 3; val[1] = 15; // 15*x3
glp_set_row_bnds(lp, 3, GLP_LO, 0.0, 25.0);// >=25
glp_set_mat_row(lp, 3, 1, indCol, val);// 15x3 >=25
glp_set_col_kind(lp, 1, GLP_IV);// X1 EH INTEIRO
glp_set_col_kind(lp, 2, GLP_IV);// X2 EH INTEIRO
glp_set_col_kind(lp, 3, GLP_IV);// X3 EH INTEIRO
glp_intopt(lp, NULL); // acha solucao com restricao de integralidade
// glp_simplex(lp, NULL);
// printf("Solucao Otima: %.3f\n", glp_get_obj_val(lp));
// printf("X1: %.3f\n", glp_get_col_prim(lp, 1));
// printf("X2: %.3f\n", glp_get_col_prim(lp, 2));
// printf("X3: %.3f\n", glp_get_col_prim(lp, 3));
printf("Solucao Otima: %.3f\n", glp_mip_obj_val(lp));
printf("X1: %.3f\n", glp_mip_col_val(lp, 1));
printf("X2: %.3f\n", glp_mip_col_val(lp, 2));
printf("X3: %.3f\n", glp_mip_col_val(lp, 3));
// for (int est = 1; est <= nEstradas; ++est) {
// glp_set_col_bnds(lp, est, GLP_LO, 0.0, 0.0);
// }
}
glp_prob * montarModeloInicial() {
glp_prob *lp;
lp = glp_create_prob();//cria problema
glp_add_cols(lp, nEstradas); // cria uma variavel por estrada
for(int est = 1; est <= nEstradas; ++est) { // para cada estrada
glp_set_col_bnds(lp, est, GLP_DB, 0.0, 1.0); // estrada entre 0 e 1
glp_set_col_kind(lp, est, GLP_BV); // estrada binaria
}
glp_set_obj_dir(lp, GLP_MIN); //MIN
for(int est=1; est <= nEstradas; ++est) { // para cada estrada
glp_set_obj_coef(lp, est, estradas[est].dist);
// custo da estrada eh coeficiente da objetivo
}
for (int cid = 1; cid <= nCidades; ++cid) { //para cada cidade
int indCol[123];
double val[123];
int nCoef = 0;
for (int est = 1; est < nEstradas; ++est) { //para cada estrada
Estrada estrada = estradas[est];
if (estrada.ori == cid || estrada.dest == cid) {
//se cidade toca estrada est
indCol[nCoef + 1] = est; // a est-esima estrada
val[nCoef + 1] = 1.0; // com coeficiente 1 na linha
nCoef++; //incremente numero de coeficiente
}
}
glp_add_rows(lp, 1);
glp_set_mat_row(lp, cid, nCoef, indCol, val); // adiciona coeficientes da linha
glp_set_row_bnds(lp, cid, GLP_DB, 2.0, 2.0); // restringe linha = 2.
}
}
void busca(int v, int aE[], int vA[]) {
if (vA[v]) return;
vA[v] = 1;
for(int e = 1; e <= nEstradas; ++e) {
if (aE[e]) {
Estrada estrada = estradas[e];
if (estrada.ori == v) {
busca(estrada.dest);
} else if (estrada.dest == v) {
busca(estrada.ori);
}
}
}
}
void encontraVerticesAlcancaveis(int arestaEscolhidas[], int verticesAlcancados[]) {
for (int v = 1;) verticesAlcancados[v] = 0;
busca(1, arestaEscolhidas, verticesAlcancados);
}
int main(int argc, char *argv[])
{
leEstradas();
glp_prob *lp = montarModeloInicial();
while(1){
glp_intopt(lp, NULL); // acha solucao com restricao de integralidade
printf("Solucao Otima: %.3f\n", glp_mip_obj_val(lp));
printf("X1: %.3f\n", glp_mip_col_val(lp, 1));
printf("X2: %.3f\n", glp_mip_col_val(lp, 2));
printf("X3: %.3f\n", glp_mip_col_val(lp, 3));
int arestaEscolhida[1234];
for(int est = 1; est) {
arestaEscolhida[est] = glp_mip_col_val(lp, est);
}
int verticesAlcancados[123];
for( ) ; // para contar se todos os vertices foram alcancados
// se tiverem sido, de um break e mostre a resposta;
encontraVerticesAlcancaveis(arestaEscolhida, verticesAlcancados);
glp_add_row(lp, 1);
int indCol[123];
double val[123];
int nCoef = 0;
for (int e = 1; e <= nArestas; ++e) {
Estrada estrada = estradas[e];
int nextremosAlcancados = verticesAlcancados[estrada.ori] +
verticesAlcancados[estrada.dest];
if (nextremosAlcancados == 1) {
indCol[nCoef + 1] = e;
val[nCoef + 1] = 1.0;
}
}
glp_set_mat_row(lp, glp_get_num_rows(lp), nCoef, indCol, val);
glp_set_row_bnds(lp, glp_get_num_rows(lp), GLP_LO, 2.0, 2.0);
system("PAUSE");
return EXIT_SUCCESS;
}