代码求不出解,想请教一下各位!

在这里插入代码片@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

求求大佬帮忙,急求,谢谢!

你可能感兴趣的:(代码求不出解,想请教一下各位!)