Decision Optimization

Decision Optimization

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

 View Only
  • 1.  Infeasible column error

    Posted Wed April 18, 2018 07:39 AM

    Originally posted by: JoeBen


    I create a cplex C++ program to resolve a  mathematical issue :

     

    #include <ilcplex/ilocplex.h>
    
    ILOSTLBEGIN
    
    int main(int, char**)
    {
       IloEnv env;
       try {
          IloInt i;
          IloInt NbTime=4;
    
          IloNum Epv=0.9;
          IloNum Ewt=0.9;
          IloNum Ebc=0.9;
          IloNum Ebd=0.8;
          IloNum Eg=0.9;
          IloNum Eex=0.9;
          IloNum Einv=0.9;
    
          IloNum Cpv_coef=0.9;
          IloNum Cwt_coef=0.9;
          IloNum Cg_coef=0.9;
          IloNum Cb_coef=0.9;
          IloNum Cl_coef=0.9;
    
          IloNumVarArray Cpv(env, NbTime, 0.0, IloInfinity);
          IloNumVarArray Cwt(env, NbTime, 0.0, IloInfinity);
          IloNumVarArray Cg(env, NbTime, 0.0, IloInfinity);
          IloNumVarArray Cb(env, NbTime, 0.0, IloInfinity);
          IloNumVarArray Cl(env, NbTime, 0.0, IloInfinity);
    
          IloModel model(env);
          IloNum Ppv_max =10.0;
          IloNum Pwt_max =20.0;
          IloNum Pb_max =30.0;
          IloNum Plac_max =40.0;
          IloNum Pldc_max =35.0;
          IloNum Pg_max =25.0;
          IloNum Pex_max =16.0;
    
    
          IloNum Ppv_lim [] = { 16, 2, 77, 40, 121 };
          IloNum Pwt_lim [] = { 36, 23, 33, 40, 34 };
          IloNum Pb_lim [] = { 16.0, 2.0, 46, 55, 13 };
          IloNum Plac_lim [] = { 16, 2, 33, 40, 34 };
          IloNum Pldc_lim [] = { 16, 2,56, 66, 12 };
          IloNum Pg_lim [] = { 16, 2, 76, 12, 34 };
          IloNum Pex_lim [] = { 16, 2, 88, 13, 45 };
    
          IloFloatVarArray Pp;
    
          IloFloatVarArray Ppv;
          IloFloatVarArray Pwt;
          IloFloatVarArray Pb;
          IloFloatVarArray Plac;
          IloFloatVarArray Pldc;
          IloFloatVarArray Pl;
          IloFloatVarArray Pg_buy;
          IloFloatVarArray Pg_sell;
          IloFloatVarArray Pex;
    
          Ppv = IloFloatVarArray(env, NbTime, 0.00, Ppv_max);
          Pwt = IloFloatVarArray(env, NbTime, 0.00, Pwt_max);
          Pb = IloFloatVarArray(env, NbTime, 0.00, Pb_max);
          Plac = IloFloatVarArray(env, NbTime, 0.00, Plac_max);
          Pldc = IloFloatVarArray(env, NbTime, 0.00, Pldc_max);
          Pl = IloFloatVarArray(env, NbTime, 0.00, Plac_max + Pldc_max);
          Pg_buy = IloFloatVarArray(env, NbTime, 0.00, Pg_max);
          Pg_sell = IloFloatVarArray(env, NbTime, 0.00, Pg_max);
          Pex = IloFloatVarArray(env, NbTime, 0.00, Pex_max);
    
          IloNum Pp_lim [NbTime];
          IloNum Pl_lim [NbTime];
    
    
    
    for (i=0;i<NbTime;i++){
            model.add(Eg*Pg_buy[i]==Plac[i]+Eex*Pex[i]-Pwt[i]);
            model.add(Eex*Pex[i]==(Pwt[i]+Ppv[i])-Pldc[i]+Ebc*Pb[i]);
            model.add(Pl[i]==Pldc[i]+ Plac[i]);
    }
    
    for (i=0;i<NbTime;i++){
            Pp_lim[i]=(Epv*Ppv_lim[i]+Ewt*Pwt_lim[i])/Einv;
            Pl_lim[i]=Plac_lim[i]+Pldc_lim[i];
    }
    
    for (i=0;i<NbTime;i++){
    if(Pp_lim[i]>Pl_lim[i]){
            model.add(Pb[i]/Ebd==Pb_lim[0]+(Pp_lim[i]-Pl_lim[i]));
            model.add(Pg_sell[i]/Ebc==Eg/(3600*Ebd)*(Pb_lim[i+1]-Pb_max));
            Pg_buy[i].setUB(0);
    }
    if(Pp_lim[i]==Pl_lim[i]){
            Pg_sell[i].setUB(0);
            Pg_buy[i].setUB(0);
            model.add(Pb[i-1]==Pb[i]);
    }
    
    if(Pp_lim[i]<Pl_lim[i]){
            Pg_sell[i].setUB(0);
            Pg_buy[i].setUB(0);
            model.add(Pb[i]/Ebd==Pb_lim[0]+(Pl_lim[i]-Pp_lim[i]));
    }
    
    }
    
    IloExpr Cost_pv = IloExpr(env);
    IloExpr Cost_wt = IloExpr(env);
    IloExpr Cost_l = IloExpr(env);
    IloExpr Cost_g = IloExpr(env);
    IloExpr Cost_b = IloExpr(env);
    
    
    for (i=0;i<NbTime;i++){
    
            Cost_pv+=1/3600*(Cpv[i]*Ppv[i]);
            Cost_wt+=1/3600*(Cwt[i]*Pwt[i]);
            Cost_l+=1/3600*(Cl[i]*Pl[i]);
            Cost_g+=1/3600*(Cg[i]*Pg_sell[i]);
            Cost_b+=1/3600*(Cb[i]*Pb[i]);
    
    }
    model.add(IloMinimize(env,Cost_pv+Cost_wt+Cost_l+Cost_g+Cost_b));
    // Optimize
          IloCplex cplex(model);
          cplex.solve();
    
          for (i=0;i<NbTime;i++){
                   env.out() << i << ") " << cplex.getValue(Cost_pv+Cost_wt+Cost_l+Cost_g+Cost_b) << endl;
          }
       }
       catch (IloException& ex) {
          cerr << "Error: " << ex << endl;
       }
       catch (...) {
          cerr << "Error" << endl;
       }
       env.end();
       return 0;
    }
    
    

    I get this error or no solution exist :

    CPXPARAM_MIP_Strategy_CallbackReducedLP          0
    Infeasible column 'x31'.
    Presolve time = 0.00 sec. (0.00 ticks)
    0) 0
    1) 0
    2) 0
    3) 0
    

     

     




    #CPLEXOptimizers
    #DecisionOptimization


  • 2.  Re: Infeasible column error

    Posted Thu April 19, 2018 09:03 AM

    So what is your question? Your model is infeasible, that is why no solution exists. You may want to use the conflict refiner to figure out why CPLEX thinks your model is infeasible.


    #CPLEXOptimizers
    #DecisionOptimization


  • 3.  Re: Infeasible column error

    Posted Thu April 19, 2018 09:08 AM

    by the way, conflict refiner says that this constraint is infeasible because variable x33 is non-negative:

    c14: 1.11111111111111 x33  = -0.00875

    If you assign names to your variables and constraints then it will be easier to track down the conflict.


    #CPLEXOptimizers
    #DecisionOptimization