在这里插入代码片@TOC
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
ILOSTLBEGIN
typedef IloArray<IloIntArray> IntMatrix;
typedef IloArray<IloIntVarArray> IntVarMatrix;
typedef IloArray<IloNumArray> NumMatrix;
typedef IloArray<NumMatrix> NumMatrix3d;
typedef IloArray<IloNumVarArray> NumVarMatrix;
typedef IloArray<NumVarMatrix> NumVarMatrix3d;
typedef IloArray<IntVarMatrix> IntVarMatrix3d;
typedef IloArray<IloArray<IloArray<IloNumVarArray>>> NumVarArray4;//四维变量
//======================================================================
#define largeNum 10000 //A large constant value
#define smallNum 0.01 //A small constant value
#define myTiLim 9000 //limit time
#define nbNode 6 //Number of nodes in network
#define nbTask 1 //Number of tasks
#define nbTer 4 //多模式终端
#define nbDes 1 //终点
#define Ch 3 //每条公路的单位成本
#define Cr 1 //每条铁路的单位成本
#define Cs 1 //转运的单位成本
int nubTest = 1;
int Numth;
int nettruck[nbNode][nbNode];//truck node
int nettrain[nbNode][nbNode];//train node
int netterminal[nbTer];//terminal cost
int nbmerTask[nbTask];//number of tasks
int taskDestina[nbDes];//destination node
const char* resultDir = "D:\\cplex\\Data\\no1.txt"; //output results
ofstream resufile(resultDir, ios::app); //open input results files
void initialize()
{
int i, j, s;
char* FNstr;//txt file name
FNstr = "D:\\cplex\\Data\\wlb.txt";
ifstream infile(FNstr, ios::in);//open your data file
if (!infile) {
cerr << "Open error:" << endl;
exit(1);
}
//input your original data
for (i = 0; i < nbNode; i++)
for (j = 0; j < nbNode; j++)
infile >> nettruck[i][j];
for (i = 0; i < nbNode; i++)
for (j = 0; j < nbNode; j++)
infile >> nettrain[i][j];
for (s = 0; s < nbTer; s++)
infile >> netterminal[s];
for (i = 0; i < nbTask; i++)
infile >> taskDestina[i];
infile.close();
return;
}
int FindoptCLRP()
{
int i, j, s, k, n, m;
IloEnv env;
try
{
IloModel model(env);
//======Decision Variables Definition ==========//
NumVarMatrix F(env, nbTask); //lane reservation variable
NumVarMatrix Y(env, nbTask);
for (k = 0; k < nbTask; k++)
F[k] = IloNumVarArray(env, nbTer, 0, 1, ILOFLOAT); //FLOAT INT
Y[k] = IloNumVarArray(env, nbTer, 0, 1, ILOINT); //FLOAT INT
NumVarMatrix3d X1(env, nbTask);//through road 部分
NumVarMatrix3d X2(env, nbTask);//through rail 部分
NumVarMatrix3d W(env, nbTask);//through road variable
NumVarMatrix3d V(env, nbTask);//through rail variable
for (k = 0; k < nbTask; k++)
{
X1[k] = NumVarMatrix(env, nbNode);
X2[k] = NumVarMatrix(env, nbNode);
W[k] = NumVarMatrix(env, nbNode);
V[k] = NumVarMatrix(env, nbNode);
for (i = 0; i < nbNode; i++)
{
X1[k][i] = IloNumVarArray(env, nbNode, 0, 1, ILOFLOAT); //FLOAT INT
X2[k][i] = IloNumVarArray(env, nbNode, 0, 1, ILOFLOAT); //FLOAT INT
W[k][i] = IloNumVarArray(env, nbNode, 0, 1, ILOINT); //FLOAT INT
V[k][i] = IloNumVarArray(env, nbNode, 0, 1, ILOINT); //FLOAT INT
}
}
//=====================formulation ======================//
IloExpr obj(env); //objective constraint
IloExpr sum1(env);
for (k = 0; k < nbTask; k++)
for (s = 0; s < nbTer; s++)
sum1 += Cs * F[k][s];
IloExpr sum2(env);
for (k = 0; k < nbTask; k++)
for (i = 0; i < nbNode; i++)
for (j = 0; j < nbNode; j++)
{
if (nettruck[i][j] == 1)sum2 += Ch * X1[k][i][j];
}
IloExpr sum3(env);//
for (k = 0; k < nbTask; k++)
for (i = 0; i < nbNode; i++)
for (j = 0; j < nbNode; j++)
{
if (nettrain[i][j] == 1)sum3 += Cr * X2[k][i][j];
}
obj = sum1 + sum2 + sum3;
model.add(IloMinimize(env, obj));
//=====================约束 ======================//
IloExpr sumOri(env);//from origin node
IloExpr sumDes(env);//from destination node
IloExpr sumMid(env);//from 其他 node
for (k = 0; k < nbTask; k++)//约束1
{
for (i = 0; i < nbNode; i++)
for (m = 0; m < nbNode; m++)
{
if (nettruck[0][i] == 1)sumOri += X1[k][0][i] - X1[k][i][0];
if (nettruck[i][taskDestina[k]] == 1)sumDes += X1[k][i][taskDestina[k]] - X1[k][taskDestina[k]][i];
//if (nettruck[i][m] == 1)sumMid += X1[k][i][m] - X1[k][m][i];
}
model.add(sumOri == 1);
model.add(sumDes == -1);
//model.add(sumMid == 0);
sumOri.clear();
sumDes.clear();
sumMid.clear();
}
IloExpr sumOrito(env);//约束2
IloExpr sumDesto(env);
for (k = 0; k < nbTask; k++)
for (i = 0; i < nbNode; i++)
for (j = 0; j < nbNode; j++)
{
if (nettruck[0][i] == 1)sumOrito += X1[k][0][i];
if (nettruck[j][taskDestina[k]] == 1)sumDesto += X1[k][j][taskDestina[k]];
}
model.add(sumOrito - sumDesto == 0);
for (k = 0; k < nbTask; k++)//约束3和5
for (i = 0; i < nbNode; i++)
for (j = 0; j < nbNode; k++)
if (nettruck[i][j] == 1)
{
model.add(X1[k][i][j] <= W[k][i][j]);
model.add(X1[k][i][j] + W[k][j][i] <= 1);
}
for (k = 0; k < nbTask; k++)//约束4
for (i = 0; i < nbNode; i++)
for (j = 0; j < nbNode; k++)
if (nettrain[i][j] == 1)
{
model.add(X2[k][i][j] <= V[k][i][j]);
}
IloExpr sumOrito1(env);//约束6
IloExpr sumOrito2(env);
for (k = 0; k < nbTask; k++)
{
for (i = 0; i < nbNode; i++)
{
if (nettruck[0][i] == 1)sumOrito1 += X1[k][0][i], sumOrito2 += X1[k][i][0];
}
model.add(sumOrito1 >= sumOrito2 * largeNum);
}
IloExpr sumMid1(env);//约束7
IloExpr sumMid2(env);
for (k = 0; k < nbTask; k++)
{
for (i = 0; i < nbNode; i++)
for (n = 0; n < nbNode; n++)
if (nettrain[i][n] == 1)sumMid1 += X2[k][i][n], sumMid2 += X2[k][n][i];
model.add(sumMid1 - sumMid2 == 0);
}
IloExpr sumMidto1(env);//约束8
IloExpr sumMidto2(env);
for (k = 0; k < nbTask; k++)
{
for (s = 0; s < nbTer; s++)
for (m = 0; m < nbNode; m++)
for (n = 0; n < nbNode; n++)
{
if (nettruck[s][m] == 1)sumMidto1 += X1[k][s][m] - X1[k][m][s];
if (nettruck[s][n] == 1)sumMidto2 += X2[k][s][n] - X2[k][n][s];
}
model.add(sumMidto1 - sumMidto2 == 0);
}
IloExpr sumS1(env);//约束9
for (k = 0; k < nbTask; k++)
{
for (s = 0; s < nbTer; s++)
for (n = 0; n < nbNode; n++)
if (nettruck[s][n] == 1)sumS1 += X2[k][s][n] - X2[k][n][s];
model.add(-largeNum * Y[k][s] <= sumS1 <= largeNum * Y[k][s]);
}
IloExpr sumS2(env);//约束10
for (k = 0; k < nbTask; k++)
{
for (s = 0; s < nbTer; s++)
for (n = 0; n < nbNode; n++)
if (nettruck[s][n] == 1)sumS2 += X1[k][s][n] - X1[k][n][s];
model.add(-F[k][s] <= sumS2 <= F[k][s]);
}
//=====solve the model and parameter setting====//
IloCplex cplex(model); // or IloCplex cplex(env); cplex.extract(model);
cplex.setParam(IloCplex::TiLim, myTiLim);
cplex.setParam(IloCplex::ClockType, 1);
cplex.setParam(IloCplex::WorkMem, 512);
//cplex.setParam(IloCplex::TreLim, 1024);
cplex.setParam(IloCplex::NodeFileInd, 2);//to aviod out of memory
cplex.setParam(IloCplex::Symmetry, 2);
//cplex.exportModel("CLRP.lp");
cplex.solve();
if (!cplex.solve())
{
cout << "Cplex_solve error!" << endl;
throw(-1);
}
//=====record the result====//
resufile << "\nbest UB: " << cplex.getObjValue() << " best LB: " << cplex.getBestObjValue() << endl;
cout << "\nbest UB: " << cplex.getObjValue() << " best LB: " << cplex.getBestObjValue() << endl;
resufile << "status: " << cplex.getStatus() << " " << "number of BinVars: " << cplex.getNbinVars() << " " << "number of variables:" << cplex.getNcols() << " " << "number of constraints: " << cplex.getNrows() << endl;
resufile << "iterations: " << cplex.getNiterations() << " " << "searched nodes: " << cplex.getNnodes() << endl;
cout << "终点是" << taskDestina[k] << "经过的路径为:";
resufile << endl;
}
catch (IloException & e) { cerr << " ERROR: " << e << endl; }
catch (...) { cerr << " ERROR" << endl; }
env.end();
return 0;
}
int main()
{
int i;
double timeCPU;
double timeCPU_average = 0;
resufile << "\n\n=========The original model is solved===========" << endl;
for (i = 0; i < nubTest; i++)
{
Numth = i;
if (!resufile)
{
cerr << "open result file error!";
exit(-1);
}
IloEnv env;
IloTimer timer(env);
timer.start();
initialize();
clock_t start, end;
start = clock();
FindoptCLRP();
end = clock();
timeCPU = timer.getTime();
timeCPU_average += timeCPU;
resufile << "CPU_time is: " << timeCPU << "\t";
resufile << "Clock_t_time is: " << (end - start) / double(CLK_TCK) << endl;
cout << "\nCPU_time is: " << timeCPU << endl;
cout << "Clock_t_time is: " << (end - start) / double(CLK_TCK) << endl;
getchar();
}
resufile << "The average CPU_time of five instances is: " << timeCPU_average / nubTest;
resufile.close();
return 0;
}
下面是wlb文件,
0 1 0 1 0 0
1 0 1 0 0 0
0 1 0 0 0 1
1 0 0 0 1 0
0 0 0 1 0 1
0 0 1 0 1 0
0 0 0 0 0 0
0 0 1 0 0 0
0 1 0 0 0 0
0 0 0 0 1 0
0 0 0 1 0 0
0 0 0 0 0 0
1 2 3 4
5
求求大佬帮忙,急求,谢谢!