Decision Optimization

Decision Optimization

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

 View Only
Expand all | Collapse all

an optimization problem, c++ calling Cplex Problem, No IloModel added

  • 1.  an optimization problem, c++ calling Cplex Problem, No IloModel added

    Posted Sat August 04, 2012 12:05 AM

    Originally posted by: Ximenes


    It is a optimizatioin problem. I compiled it in C++ calling CPLEX. When I run the program, I was told——Error: trying to add to an empty handle IloModel.
    Can you help me?
    I paste the code bellow.
    
    #include <ilcplex/ilocplex.h>   ILOSTLBEGIN   typedef IloArray<IloBoolVarArray> BoolVarMatrix;       
    
    int main(
    
    int argc, char** argv) 
    { 
    
    int NN; cout<<
    "请输入 所需最大整车数"<<endl<<
    "NN="; cin>>NN; 
    
    float M; cout<<
    "请输入 整车容量"<<endl<<
    "M="; cin>>M;   
    
    float t1; cout<<
    "请输入 整车运输需要的时间"<<endl<<
    "t1="; cin>>t1;   
    
    float t2; cout<<
    "请输入 非整车运输需要的时间"<<endl<<
    "t2="; cin>>t2; 
    
    float c2; cout<<
    "请输入 非整车运输单位重量货物的成本"<<endl<<
    "c2="; cin>>c2;   
    
    float fc; cout<<
    "请输入 整车运输的固定成本"<<endl<<
    "fc="; cin>>fc;   
    
    float hd; cout<<
    "请输入 货物在始发站的单位时间存储成本"<<endl<<
    "hd="; cin>>hd;   
    
    float ht; cout<<
    "请输入 货物在终点站的单位时间存储成本"<<endl<<
    "ht="; cin>>ht;   
    
    float b; cout<<
    "请输入 迟到惩罚成本"<<endl<<
    "b="; cin>>b; 
    
    float Opt[10]=
    {10000000,10000000,10000000,10000000,100000000,10000000,10000000,10000000,10000000,10000000
    }; 
    
    float opt=10000000; 
    
    for(
    
    int N=NN;N>1;N--)
    { IloEnv env;   
    
    try 
    { 
    
    const char* filename;    
    //数据输入 
    
    if (argc > 1) filename = argv[1]; 
    
    else filename = 
    "C:\\Users\\Ximenes\\Desktop\\王悦数据.txt"; ifstream f(filename, ios::in); 
    
    if (!f) 
    { cerr << 
    "No such file: " << filename << endl; 
    
    throw(1); 
    }   IloNumArray td(env); IloNumArray tt(env); IloNumArray m(env); f >> td; f >> tt; f >> m; cout<<
    "td="<<td<<endl; cout<<
    "tt="<<tt<<endl; cout<<
    "m="<<m<<endl;   
    
    int I=m.getSize();
    //I种货物     IloModel model(env); 
    //定义变量 IloNumArray st(env,N,0,1000); IloBoolVarArray y1(env,I);
    //定义变量y1(k)=1,货物k通过整车运 IloBoolVarArray y2(env,I);
    //定义变量y2(k)=1,货物k不通过整车运 BoolVarMatrix x(env,I);
    //定义变量 
    
    for(
    
    int i=0;i<I;i++) x[i]=IloBoolVarArray(env,N);   IloBoolVarArray z1(env,I);
    //定义变量Zi1 IloBoolVarArray z2(env,I);
    //定义变量Zi2   IloBoolVarArray w11(env,I);
    //定义变量w12[i]=y1[i]*z2[i] IloBoolVarArray w12(env,I); IloBoolVarArray w21(env,I); IloBoolVarArray w22(env,I);   
    // 约束1         sum(n):xin=yi1   如果货物i通过整车,则跟某辆车走 
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr expr(env); 
    
    for(
    
    int n=0;n<N;n++)
    { expr+=x[i][n]; 
    } expr=expr-y1[i]; model.add(expr==0); expr.end(); 
    } 
    //约束2 yi1+yi2=1 
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr expr(env); expr=y1[i]+y2[i]; model.add(expr==1); expr.end(); 
    } 
    //约束3 每个整车运输的货物不超过其容量  sum(i):xin*mi<=M 
    
    for(
    
    int n=0;n<N;n++)
    { IloExpr expr(env); 
    
    for(
    
    int i=0;i<I;i++) expr+=x[i][n]*m[i]; model.add(expr<=M); expr.end(); 
    } 
    //约束4 后发的车的时刻比先发车的时刻要大  st(n)>=st(n-1) 
    
    for(
    
    int n=1;n<N;n++)
    { IloExpr expr(env); expr==st[n]-st[n-1]; model.add(expr>=0); expr.end(); 
    } 
    //约束5 货物i走的时间要在到站时间之后    yi1*[sum(n):xin*st(n)]>=td(i)*yi1 
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr expr(env); 
    
    for(
    
    int n=0;n<N;n++) expr+=x[i][n]*st[n];
    //二次 expr=(expr-td[i])*y1[i];
    //三次 model.add(expr>=0); expr.end(); 
    } 
    //约束6 Zi1+Zi2=1 
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr expr(env); expr=z1[i]+z2[i]; model.add(expr==1); expr.end(); 
    } 
    //约束7  z2[i]取1,z2[i]取0,表示不延迟 
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr expr(env); 
    
    for(
    
    int n=0;n<N;n++) expr+=st[n]*x[i][n];
    //二次 expr+=t1; expr=expr*w11[i];
    //三次 expr+=w21[i]*(t2+td[i]); expr-=tt[i]*z1[i]; model.add(expr<=0); expr.end(); 
    } 
    //z1(i)取0,z2[i]取1,表示延迟 
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr expr(env); 
    
    for(
    
    int n=0;n<N;n++) expr+=st[n]*x[i][n];
    //二次 expr+=t1; expr=expr*w12[i];
    //三次 expr+=w22[i]*(t2+td[i]); expr-=tt[i]*z2[i]; model.add(expr>=0); expr.end(); 
    }   
    //引入w后,要多加w11(i)<=y1(i),w11<=z1(i),w11>=y1(i)+z1(i)-1 的约束 
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr expr(env); expr=w11[i]-y1[i]; model.add(expr<=0); model.end(); 
    } 
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr expr(env); expr=w11[i]-z1[i]; model.add(expr<=0); model.end(); 
    } 
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr expr(env); expr=w11[i]+1-y1[i]-z1[i]; model.add(expr>=0); model.end(); 
    }   
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr expr(env); expr=w12[i]-y1[i]; model.add(expr<=0); model.end(); 
    } 
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr expr(env); expr=w12[i]-z2[i]; model.add(expr<=0); model.end(); 
    } 
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr expr(env); expr=w12[i]+1-y1[i]-z2[i]; model.add(expr>=0); model.end(); 
    } 
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr expr(env); expr=w21[i]-y2[i]; model.add(expr<=0); model.end(); 
    } 
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr expr(env); expr=w21[i]-z1[i]; model.add(expr<=0); model.end(); 
    } 
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr expr(env); expr=w21[i]+1-y2[i]-z1[i]; model.add(expr>=0); model.end(); 
    }   
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr expr(env); expr=w22[i]-y2[i]; model.add(expr<=0); model.end(); 
    } 
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr expr(env); expr=w22[i]-z2[i]; model.add(expr<=0); model.end(); 
    } 
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr expr(env); expr=w22[i]+1-y2[i]-z2[i]; model.add(expr>=0); model.end(); 
    } 
    //最小化目标函数 IloExpr Ct1(env);               
    //终点站的存储成本 
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr Ct11(env); IloExpr Ct12(env); IloExpr Ct13(env); 
    
    for(
    
    int n=0;n<N;n++) Ct11+=st[n]*x[i][n];    
    //二次 Ct12=-(Ct11+t1)*w11[i];
    //三次 Ct13=(Ct12-(td[i]+t2)*w21[i]+tt[i]*z1[i])*ht; Ct1+=Ct13; Ct11.end(); Ct12.end(); Ct13.end(); 
    }   IloExpr Ct2(env);               
    //终点站的惩罚成本 
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr Ct21(env); IloExpr Ct22(env); IloExpr Ct23(env); 
    
    for(
    
    int n=0;n<N;n++) Ct21+=st[n]*x[i][n];    
    //二次 Ct22=(Ct21+t1)*w12[i];
    //三次 Ct23=(Ct22+(td[i]+t2)*w22[i]-tt[i]*z2[i])*b; Ct2+=Ct23; Ct21.end(); Ct22.end(); Ct23.end(); 
    } IloExpr Ct3(env);              
    //运输成本 
    
    for(
    
    int i=0;i<I;i++)
    { Ct3+=y2[i]*m[i]*c2; 
    } Ct3+=N*fc; IloExpr Ct4(env);                
    //在始发站的存储成本 
    
    for(
    
    int i=0;i<I;i++)
    { IloExpr Ct41(env); IloExpr Ct42(env); 
    
    for(
    
    int n=0;n<N;n++) Ct41+=x[i][n]*st[n];  
    //两次 Ct42=(Ct41-td[i])*hd*y1[i];
    //三次      Ct4+=Ct42; Ct41.end(); Ct42.end(); 
    } IloExpr cost(env); cost=Ct1+Ct2+Ct3+Ct4;   model.add(IloMinimize(env,cost)); Ct1.end(); Ct2.end(); Ct3.end(); Ct4.end(); cost.end(); IloCplex cplex(env); cplex.extract(model); cout << model << endl; cplex.exportModel(
    "C:\\Users\\Ximenes\\Documents\\Visual Studio 2010\\Projects\\try etsp\\Model_export\\kingmoon.lp");   cplex.setParam(IloCplex::MIPEmphasis, 4); 
    
    if (cplex.solve())
    { cout << 
    " Opt["<<N<<
    "]  = " << cplex.getObjValue() << endl; Opt[N]=cplex.getObjValue(); 
    } 
    } 
    
    catch (IloException& ex) 
    { cerr << 
    "Error: " << ex << endl; 
    } 
    
    catch (...) 
    { cerr << 
    "Error" << endl; 
    } env.end(); 
    
    if(Opt[N]<opt) opt=Opt[N]; 
    
    else 
    
    continue; 
    } cout<<
    "Optimal Value = "<<opt<<endl; system(
    "pause"); 
    
    return 0; 
    }
    

    #DecisionOptimization
    #OPLusingCPLEXOptimizer


  • 2.  Re: an optimization problem, c++ calling Cplex Problem, No IloModel added

    Posted Thu August 23, 2012 07:41 AM

    Originally posted by: SystemAdmin


    If you call model.end() as in your loops, then you get an empty handle => you will get an error as soon as you try to reuse it without reinitializinng it.
    #DecisionOptimization
    #OPLusingCPLEXOptimizer