
#include <ilcplex/ilocplex.h>

ILOSTLBEGIN


int main()

{
	
	try {

		ofstream wf;
		
		wf.open("Test_ILP.txt", ios::out | ios::app);

		IloEnv env;
			
		IloModel model(env);
		IloCplex cplex(model);

		//* Display */
		//cplex.setParam(IloCplex::SimDisplay, 0);

		IloNumVar P00(env, 0, 1, ILOFLOAT);
		IloNumVar P10(env, 0, 1, ILOFLOAT);
		IloNumVar P20(env, 0, 1, ILOFLOAT);
		IloNumVar P01(env, 0, 1, ILOFLOAT);
		IloNumVar P11(env, 0, 1, ILOFLOAT);
		IloNumVar P02(env, 0, 1, ILOFLOAT);

		/*	Constraint	*/
		model.add(2*P00 == P10);
		model.add(2*P00 + (4/3)*P20 + P01 == 3*P10);
		model.add(P10 + (19/24)*P11 == (10/3)*P20);
		model.add(P10 + (2/3)*P11 == 2*P01);
		model.add(2*P20 + P01 + (19/12)*P02 == (59/24)*P11);
		model.add(P11 == (19/12)*P02);
		model.add(P00 + P10 + P20 + P01 + P11 + P02 == 1);

		IloExpr Thsum(env);
		
		Thsum = P00 + 2*P10 + 3*P20 + 4*P01 + 5*P11 + 6*P02;
	
		model.add(IloMaximize(env, Thsum));
		Thsum.end();

		cplex.solve();

		wf << "ObjectValue: " << cplex.getObjValue() << endl;
		wf << "P00: " << cplex.getValue(P00) << endl ;
		wf << "P10: " << cplex.getValue(P10) << endl ;
		wf << "P20: " << cplex.getValue(P20) << endl ;
		wf << "P01: " << cplex.getValue(P01) << endl ;
		wf << "P11: " << cplex.getValue(P11) << endl ;
		wf << "P02: " << cplex.getValue(P02) << endl ;

		env.end();

		wf.close();

		} catch (IloException& e) {
		cerr << "Concert Exception: " << e << endl;
	} 

	
}//main

