void kMST_ILP::solve() { try { // initialize CPLEX env = IloEnv(); model = IloModel( env ); Variables *vars; // add model-specific constraints if( model_type == "scf" ) vars = modelSCF(); else if( model_type == "mcf" ) vars = modelMCF(); else if( model_type == "mtz" ) vars = modelMTZ(); else { cerr << "No existing model chosen\n"; exit( -1 ); } // build model cplex = IloCplex( model ); // export model to a text file //cplex.exportModel( "model.lp" ); // set parameters setCPLEXParameters(); // solve model cout << "Calling CPLEX solve ...\n"; cplex.solve(); cout << "CPLEX finished.\n\n"; cout << "CPLEX status: " << cplex.getStatus() << "\n"; cout << "Branch-and-Bound nodes: " << cplex.getNnodes() << "\n"; cout << "Objective value: " << cplex.getObjValue() << "\n"; cout << "CPU time: " << Tools::CPUtime() << "\n\n"; // vars->print(cplex); delete vars; } catch( IloException& e ) { cerr << "kMST_ILP: exception " << e << "\n"; exit( -1 ); } catch( ... ) { cerr << "kMST_ILP: unknown exception.\n"; exit( -1 ); } }
void kMST_ILP::solve() { try { // initialize CPLEX env = IloEnv(); model = IloModel( env ); addTreeConstraints(); // call first, initialises edges // add model-specific constraints if( model_type == "scf" ) modelSCF(); else if( model_type == "mcf" ) modelMCF(); else if( model_type == "mtz" ) modelMTZ(); else { cerr << "No existing model chosen\n"; exit( -1 ); } addObjectiveFunction(); // build model cplex = IloCplex( model ); // export model to a text file //cplex.exportModel( "model.lp" ); // set parameters setCPLEXParameters(); // solve model cout << "Calling CPLEX solve ...\n"; cplex.solve(); cout << "CPLEX finished.\n\n"; cout << "CPLEX status: " << cplex.getStatus() << "\n"; cout << "Branch-and-Bound nodes: " << cplex.getNnodes() << "\n"; cout << "Objective value: " << cplex.getObjValue() << "\n"; cout << "CPU time: " << Tools::CPUtime() << "\n\n"; // show result IloNumArray edgesSelected(env, edges.getSize()), flowRes(env, edges.getSize()), uRes(env, instance.n_nodes); cplex.getValues(edgesSelected, edges); if (model_type == "scf") { cplex.getValues(flowRes, flow_scf); } else if (model_type == "mtz") { try { cplex.getValues(uRes, u); } catch ( IloException& e ) { cerr << "Exception while extracting u: " << e << endl; uRes = IloNumArray(env, 0); } } cout << "Edges:\n"; for (unsigned int i=0; i<edges.getSize(); i++) { // skip unused ones if (((int)edgesSelected[i]) == 0 ) { continue; } if (i == instance.n_edges) { cout << endl; } bool direction = ( i >= instance.n_edges); cout << " " << setw(4) << i << ": " << ((int)edgesSelected[i]) << " "; // flow if (model_type == "scf") { cout << "f: " << setw(2) << (flowRes[i]); } else if (model_type == "mtz") { if (uRes.getSize() != 0) { cout << "u: " ; if (i < instance.n_edges) { //cout << setw(2) << instance.edges[i % instance.n_edges].v1 << ": "; cout << setw(2) <<((int)uRes[ instance.edges[i % instance.n_edges].v1]) << " "; //cout << setw(2) << instance.edges[i % instance.n_edges].v2 << ": "; cout << setw(2) << ((int)uRes[ instance.edges[i % instance.n_edges].v2]) ; } else { //cout << setw(2) << instance.edges[i % instance.n_edges].v2 << ": "; cout << setw(2) <<((int)uRes[ instance.edges[i % instance.n_edges].v2]) << " "; //cout << setw(2) << instance.edges[i % instance.n_edges].v1 << ": "; cout << setw(2) <<((int)uRes[ instance.edges[i % instance.n_edges].v1]) ; } } } cout << " " << Tools::edgeToString(instance.edges[i % instance.n_edges], direction) ; cout << endl; } } catch (IloAlgorithm::CannotExtractException& e) { cerr << "CannotExtractException: " << e << endl ; IloExtractableArray failed = e.getExtractables(); for (IloInt i = 0; i < failed.getSize(); ++i) { cerr << "\t" << failed[i] << std::endl; } } catch( IloException& e ) { cerr << "kMST_ILP: exception " << e << "\n"; exit( -1 ); } catch( ... ) { cerr << "kMST_ILP: unknown exception.\n"; exit( -1 ); } }