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