This repository has been archived by the owner on Dec 26, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.cpp
125 lines (98 loc) · 2.89 KB
/
main.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
#include <iostream>
#include <stdio.h>
#include <sstream>
#include <fstream>
#include <string>
#include <ilcplex/ilocplex.h>
using namespace std;
int main(int argc, char *argv[]) {
// lendo nome da instancia por parametro
string arquivo_instancia = argv[1];
// ambiente (environment)
IloEnv ambiente;
// numero de medianas
IloInt p;
// declaracao matriz de distancias (2 dimensoes)
IloArray<IloNumArray> c(ambiente);
// ---- Leitura de arquivo
ifstream arquivo(arquivo_instancia.c_str());
if (!arquivo) {
cerr << "Erro na leitura do arquivo!!!" << endl;
}
// ler matriz de distancias
arquivo >> c;
// ler o numero de medianas
arquivo >> p;
// numero de vertices (nós) pegando o tamanho dinamicamente
IloInt n = c.getSize();
// matriz de alocação
IloArray<IloNumVarArray> x(ambiente, n);
// declara modelo matematico
IloModel modelo(ambiente);
// variavel de decisao (matriz binaria)
for (int i = 0;i < n; i++) {
x[i] = IloNumVarArray(ambiente, n, 0, 1, ILOBOOL);
}
// ---- Funcao Objetivo
IloExpr fo(ambiente);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
fo += c[i][j] * x[i][j];
}
}
// adiciona funcao objetivo ao modelo
modelo.add(IloMinimize(ambiente, fo));
// ---- Restricoes
/*
Restrição: 1b
assegurar que cada vertice xj seja atendido por apenas uma mediana
*/
for (int i = 0; i < n; i++) {
IloExpr restricao_1b(ambiente);
for (int j = 0; j < n; j++) {
restricao_1b += x[i][j];
}
modelo.add(restricao_1b == 1);
}
/*
Restrição: 1c
Garante que a quantidade de medianas é igual a p
*/
IloExpr restricao_1c(ambiente);
for (int j = 0; j < n; j++) {
restricao_1c += x[j][j];
}
modelo.add(restricao_1c == p);
restricao_1c.end();
/*
Restrição: 1d
certifica que cada v ertice j seja designado a um vertice i
desde que xjj = 1
*/
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
modelo.add(x[i][j] <= x[j][j]);
}
}
// ---- Resolvendo modelo
IloCplex cplex(modelo);
cplex.exportModel("viatura.lp");
if (cplex.solve()) {
ambiente.out() << "\n-> Resultado Modelo: " << cplex.getStatus() << endl;
ambiente.out() << "\n-> Menor Custo: " << cplex.getObjValue() << endl;
ambiente.out() << "\n-> N: " << n << endl;
ambiente.out() << "\n-> P: " << p << endl;
cout << "\n~> Matriz de alocação: \n" << endl;
// printa matriz de alocacao convertendo
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
cout << bool(cplex.getValue(x[i][j])) << " ";
}
cout << endl;
}
} else {
cout << "Erro ao resolver modelo!" << endl;
}
ambiente.end();
return 0;
}