Originally posted by: daniellvc
I'm trying to implement a DARP modeling, with a multi-objective function.
But I'm only get this message: 'IloAlgorithm::CannotExtractException'
I don't know how to correct this. The code is below.
Any idea ??
Ps: This is my first Cplex code
void OptimizeCplex(double **distancias, int V, int F, int P, double tempMaxRota, int* capacidadeDeCadaVeiculo,
double* tempMaxViagemCliente, double* tempServPonto, double* inicioJanela, double* fimJanela, int *garagemInicial,
int *garagemFinal, int* cargaCliente, double* tempMaxRotaV, double* tempMaxEsperaVeiculo, int capacidadeMaximaVeiculo)
{
puts("Inicio OptCplex");
//V quantidade de veiculos
//P quantidade de pontos N = {g-u P u U u g+}
//Criando o environment.
IloEnv env;
//Criando o modelo
IloModel modelo(env);
//Variáveis de decisão
//int coletas = P/2, entregas = ((P/2)+1);
cout << "P(" << P << "): "<< endl;
IloArray <IloArray <IloBoolVarArray> > x(env,P);
for (int i=0; i < P; i++) {
IloArray <IloBoolVarArray> matrix(env,P);
x[i] = matrix;
for (int j=0; j < P; j++) {
IloBoolVarArray vetor(env,V);
x[i][j] = vetor;
}
}
puts("X");
//Adiciona a variavel xk ao modelo
char var[100];
for (int k=0; k < V; k++) {
for (int i = 0; i < F ; i++) {
for (int j = 0; j < F ; j++) {
sprintf(var, "X(%d,%d,%d)", i, j, k);
x[i][j][k].setName(var);
modelo.add(x[i][j][k]); //Adicionando ao modelo
}
}
}
//Variavel A
puts("A");
IloFloatVarArray A(env, P, 0 ,IloInfinity);
for (int j = 0; j < P; j++) { // A[0] = garagemInicial
sprintf(var, "A(%d)", j);
A[j].setName(var);
modelo.add(A[j]);
}
// modelo.add(A[garagemInicial[0]] == 0);// A[garagemInicial[0]] = 0
//Variavel D
puts("D");
IloFloatVarArray D(env, P, 0 ,IloInfinity);
for (int j = 0; j < P; j++) {
sprintf(var, "D(%d)", j);
D[j].setName(var);
modelo.add(D[j]);
}
//modelo.add(D[garagemFinal[0]] == 0);
//Variavel B
puts("B");
IloFloatVarArray B(env, P, 0 ,IloInfinity);
for (int j = 0; j < P; j++) {
sprintf(var, "B(%d)", j);
B[j].setName(var);
modelo.add(B[j]);
}
//Variavel W
puts("W");
IloFloatVarArray W(env, P, 0 ,IloInfinity);
for (int j = 0; j < P; j++) {
sprintf(var, "W(%d)", j);
W[j].setName(var);
modelo.add(W[j]);
}
//modelo.add(W[garagemInicial[0]] == 0);
//Variavel R
puts("R");
IloFloatVarArray R(env, P, 0 ,IloInfinity);
for (int j = 0; j < P; j++) {
sprintf(var, "R(%d)", j);
R[j].setName(var);
modelo.add(R[j]);
}
//Variavel Q
puts("Q");
IloNumVarArray Q(env, P, 0, capacidadeMaximaVeiculo);
for(int j = 0; j < P; j++) {
sprintf(var, "Q(%d)", j);
Q[j].setName(var);
modelo.add(Q[j]);
}
modelo.add(Q[garagemInicial[0]] == 0);
modelo.add(Q[garagemFinal[0]] == 0);
puts("Fim das variaveis de decisao!");
//--------------------------------------------------VARIAVEIS DE DECISAO FIM---------------------------------------
//---------------------------------------- Criando a Função Objetivo (FO)-------------------------------------------//
puts("Inicio Criacao Funcao Objetivo");
puts("FO");
IloExpr FO(env);
puts("W0");
IloExpr W0(env);
for (int i = 0; i < P ; i++) {
for (int j = 0; j < P ; j++) {
for (int k=0; k < V; k++) {
W0 += distancias[i][j]*x[i][j][k] ;
}
}
}
puts("W1");
IloExpr W1(env);
for (int j = 0; j < P ; j++) {
for (int k=0; k < V; k++) {
W1 += x[garagemInicial[k]][j][k] ;
}
}
puts("W2");
IloExpr W2(env);
for (int k=0; k < V; k++) {
W2 += B[garagemFinal[k]] - D[garagemInicial[k]];
}
puts("W3");
IloExpr W3(env);
for (int i=0; i < P/2; i++) {
W3 += R[i];
}
puts("W4");
IloExpr W4(env);
for (int i=0; i < P; i++) {
W4 += W[i];
}
puts("FO = W0 + W1 + ...");
FO = W0 + W1 + W2 + W3 + W4;
// Adicionando a FO
puts("Adicionando a FO");
modelo.add(IloMinimize(env, FO));
W0.end();
W1.end();
W2.end();
W3.end();
W4.end();
//---------------------------------------- Fim da criacao da Função Objetivo (FO)----------------------------------------------//
//--------------------------------------------------RESTRICOES INICIO----------------------------------------------//
// Restricoes 4
puts("Restricao 4");
for (int k=0; k < V; k++) {
IloExpr temp(env);
for (int j = 0; j < (P/2)+1; j++) {
temp += x[garagemInicial[k]][j][k];//xˆk_g-,j
}
modelo.add(temp == 1);
temp.end();
}
// Restricoes 5
puts("Restricao 5");
for(int k=0; k < V; k++) {
IloExpr temp(env);
temp += x[garagemInicial[k]][garagemFinal[k]][k];
for (int i = P/2; i < P; i++) {
temp += x[i][garagemFinal[k]][k];//xˆk_i,g+
}
modelo.add(temp == 1);
temp.end();
}
// Restricoes 6
puts("Restricao 6");
for (int i = 1; i < P/2; i++) {
IloExpr temp(env);
for (int k=0; k < V; k++) {
for (int j = 1; j < P; j++) {
if (i!=j) temp += x[i][j][k];//xˆk_i,j
}
}
modelo.add(temp == 1);
temp.end();
}
//Restricao 7
puts("Restricao 7");
for (int k=0; k<V; k++) {
for (int i = 1; i < P/2 ; i++) {//g- fora
IloExpr temp(env);
for (int j = 1; j < P; j++) {
if (i!=j) temp += x[i][j][k];//xˆk_i,j
}
IloExpr temp2(env);
for (int j = 0; j < P; j++) {
if(i!=j && j!=(P/2)+i) temp2+= x[(P/2)+i][j][k];
}
modelo.add(temp - temp2 == 0);
temp.end();
temp2.end();
}
}
//Restricao 8
puts("Restricao 8");
for (int k=0; k<V; k++) {
for (int i = 1; i < P/2 ; i++) {//g- fora
IloExpr temp(env);
for (int j = 0; j < P; j++) {
if(i!=j && j!=(P/2)+i) temp+= x[i][j][k];
}
IloExpr temp2(env);
for (int j = 1; j < P; j++) {
if(i!=j) temp2+= x[i][j][k];
}
modelo.add(temp - temp2 == 0);
temp.end();
temp2.end();
}
}
//Restricao 9
puts("Restricao 9");
for (int k=0; k<V; k++) {
for (int i = P/2; i < P ; i++) {//g- fora
IloExpr temp(env);
for (int j = 1; j < P; j++) {
if (i!=j) temp += x[i][j][k];//xˆk_i,j
}
IloExpr temp2(env);
for (int j = 0; j < P; j++) {// j E g+
if(i!=j && j!=(P/2)-i) temp2+= x[i][j][k];
}
modelo.add(temp - temp2 == 0);
temp.end();
temp2.end();
}
}
//Restricao 10
puts("Restricao 10");
for(int i = 0; i < P ; i++) {
for (int j = 0; j < P; j++) {
IloExpr temp(env);
IloExpr temp2(env);
if(i!=j){
temp = (B[i] + tempServPonto[i] + distancias[i][j]/20 + W[j]);
for (int k=0; k<V; k++) {
temp2 += x[i][j][k];
}
modelo.add(B[j] == temp*temp2);
}
temp.end();
temp2.end();
}
}
//Restricao 11
puts("Restricao 11");
for(int i = 0; i < P ; i++) {
for (int j = 0; j < P; j++) {
IloExpr temp(env);
if(i!=j)
temp = (Q[i] + cargaCliente[i]);
IloExpr temp2(env);
for (int k=0; k<V; k++) {
temp2 += x[i][j][k];
}
modelo.add(B[j] == temp*temp2);
temp.end();
temp2.end();
}
}
//Restricao 12
puts("Restricao 12");
for(int i = 0; i < P ; i++) { //{PuUuGˆ+}
modelo.add(A[i] == B[i]- W[i]);
}
//Restricao 13
puts("Restricao 13");
for(int i = 0; i < P ; i++) { //{PuUuGˆ-}
modelo.add(D[i] == B[i] + tempServPonto[i]);
}
//Restricao 14
puts("Restricao 14");
for(int i = 1; i < P/2 ; i++) {
modelo.add(R[i] == B[(P/2)+i] - D[i]);
}
//RESTRICAO 3.58
puts("RESTRICAO 3.58");
for (int k = 0; k < V; k++) {
IloExpr temp(env);
temp = B[garagemFinal[k]] - D[garagemFinal[k]];
modelo.add(temp <= tempMaxRotaV[k]);
temp.end();
}
//RESTRICAO 3.59
puts("RESTRICAO 3.59");
for(int i = 1; i < P/2; i++) {
IloExpr temp(env);
temp = R[i];
modelo.add(temp<= R[i]);
temp.end();
}
//RESTRICAO 3.60
puts("RESTRICAO 3.60");
for(int i = 1; i < P; i++) {
IloExpr temp(env);
temp = W[i];
modelo.add(temp<= W[i]);
temp.end();
}
//RESTRICAO 3.61
puts("RESTRICAO 3.61");
for(int i = 1; i < P; i++) {
for (int k = 0; k < V; k++) {
IloExpr temp(env);
temp = Q[i];
modelo.add(temp<= Q[k]);
temp.end();
}
}
//RESTRICAO 3.62
puts("RESTRICAO 3.62");
for(int i = 0; i < P; i++) {
IloExpr temp(env);
temp = B[i];
modelo.add(inicioJanela[i] <= temp);
modelo.add(temp <= fimJanela[i]);
temp.end();
}
puts("Fim das restrições");
//--------------------------------------------------RESTRICOES FIM--------------------------------------------//
puts("IloCplex DARP(modelo)");
IloCplex DARP(modelo);
puts("DARP.exportModel(DARP.lp)");
DARP.exportModel("DARP.lp");
puts("DARP.solve()");
DARP.solve();//cplex.solve();
puts("Saída dos resultados");
int max = 0;
int count = 0;
int sum = 0;
for (int i = 0; i < P; i++) {
for (int j = 0; j < P; j++) {
for (int k = 0; k < V; k++) {
if(DARP.getValue(x[i][j][k])>0)
cout << "X(" << i << "," << j << "): " << DARP.getValue(x[i][j][k]) << endl;
}
}
}
cout << "FO: " << DARP.getValue(FO) << endl;
env.end();
}
#CPLEXOptimizers#DecisionOptimization