Decision Optimization

Decision Optimization

Delivers prescriptive analytics capabilities and decision intelligence to improve decision-making.


#Analytics
#DecisionOptimization
#DecisionOptimization
 View Only
  • 1.  DARP modeling - 'IloAlgorithm::CannotExtractException'

    Posted 02/14/11 09:52 PM

    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


  • 2.  Re: DARP modeling - 'IloAlgorithm::CannotExtractException'

    Posted 02/15/11 01:58 AM

    Originally posted by: SystemAdmin


    What is the line that triggers the exception? Does the exception name the extractable on which the problem occurs?

    Two reasons for this exception come to my mind immediately
    • CPLEX does not support multiple instances of IloObjective in one model (you have to use CPO for models like that). As far as I can see you only add one such instance.
    • You may be using some expressions or modeling stuff that is not supported by CPLEX, for example non-linear, non-quadratic expressions. Are you using anything like that?
    What is the constraint that is generated by these lines:
    B[j] == temp*temp2
    

    Is it possible that this is non-linear, non-quadratic? What if you (temporarily) remove these lines?
    If nothing else helps you can iterate over the model, print out all extractables and look for something suspicious in the output:
    for (IloModel::Iterator it(model); it.ok(); ++it)
             std::cout << *it << std::endl;
    

    #CPLEXOptimizers
    #DecisionOptimization