Originally posted by: Ximenes
Thank you for your considerate reply. I've found the source error. I had not define the bound of t
][. To your suggestion of input of the data, I am sure it has no problem.
Now another problem arises. I can easily know the optimal value since the data is very simple since I take it for checking. But when I debug the revised code, the optimal is 0.
Can you help me?
Thank you in advance.
////////////////////////////////////////////////////////////////////////////////////////////////////
#include <ilcplex/ilocplex.h>
ILOSTLBEGIN
typedef IloArray<IloBoolVarArray> BoolVarMatrix;
typedef IloArray<IloIntVarArray> IntVarMatrix;
int main(int argc, char** argv) {
IloEnv env;
try {
IloInt i, j, k;
IloInt nOrder;
const char* filename;
if (argc > 1)
filename = argv[1];
else
filename = "C:\\Users\\Ximenes\\Desktop\\5月31\\try.dat";
ifstream f(filename, ios::in);
if (!f) {
cerr << "No such file: " << filename << endl;
throw(1);
}
//C:\Users\Ximenes\Desktop\5月31
IloNum T;
IloNumArray P1(env);
IloNumArray P2(env);
IloNumArray R(env);
f >> T;
f >> P1;
f >> P2;
f >> R;
nOrder = R.getSize();
IloModel model(env);
// Create start variables
BoolVarMatrix x(env, nOrder);
for (i = 0; i < nOrder; i++) {
x[i] = IloBoolVarArray(env, nOrder);
}
BoolVarMatrix z(env, nOrder);
for (i = 0; i < nOrder; i++) {
z[i] = IloBoolVarArray(env, nOrder);
}
IntVarMatrix t(env, nOrder);
for (i = 0; i < nOrder; i++) {
t[i] = IloIntVarArray(env, nOrder,0,1);
}
IloBoolVarArray y(env,nOrder);
IloNumVarArray W(env,nOrder,0.0,T);
IloNumVarArray I(env,nOrder-1,0.0,T);
// 第1个约束
for (i = 0; i < nOrder; i++) {
IloExpr expr(env);
for(j=0;j<i;j++)
expr+=x[i][j];
for(j=i+1;j<nOrder;j++)
expr+=x[i][j];
model.add(expr==y[i]);
expr.end();
}
//第2个约束
for (j = 0; j < nOrder; j++) {
IloExpr expr(env);
for(i=0;i<j;i++)
expr+=x[i][j];
for(i=j+1;i<nOrder;i++)
expr+=x[i][j];
model.add(expr==y[j]);
expr.end();
}
for(i=0;i<nOrder;i++){
for(j=0;j<nOrder;j++)
model.add(t[j][k]==(z[j][k]+y[j]/2));
}
//时间约束
IloInt last=nOrder-1;
IloExpr expr(env);
for(j=0;j<last;j++) {
expr+=t[j][0]*P1[j];
expr+=I[j];
expr+=P2[j]*y[j];
}
expr+=t
last[0]*P1
last;
expr+=P2
last*y
last;
model.add(expr<=T);
expr.end();
//W.I约束
for(k=0;k<last;k++){
IloExpr expr(env);
for(j=0;j<nOrder;j++){
expr+=t[j][k]*P2[j];
expr-=t[j]
k+1*P1[j];
}
expr+=W[k];
expr-=W
k+1;
expr+=I[k];
model.add(expr==0);
expr.end();
}
//Z加和等于1约束
for(j=0;j<nOrder;j++){
IloExpr expr(env);
for(k=0;k<nOrder;k++)
expr+=z[j][k];
model.add(expr==1);
expr.end();
}
for(k=0;k<nOrder;k++){
IloExpr expr(env);
for(j=0;j<nOrder;j++)
expr+=z[j][k];
model.add(expr==1);
expr.end();
}
// 最大化目标函数
IloExpr profitSum(env);
for (j = 0; j < nOrder; j++) {
profitSum +=R[j]*y[j];
}
model.add(IloMaximize(env, profitSum));
profitSum.end();
//计算及输出
IloCplex cplex(env);
cplex.extract(model);
cplex.setParam(IloCplex::MIPEmphasis, 4);
if (cplex.solve()) {
cout << " Optimal Value = " << cplex.getObjValue() << endl;
}
}
catch (IloException& ex) {
cerr << "Error: " << ex << endl;
}
catch (...) {
cerr << "Error" << endl;
}
env.end();
system("pause");
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////////
The data is listed as follow.
10
2, 3, 5 1, 3, 2 3,6, 7#CPLEXOptimizers#DecisionOptimization