IBM ILOG Solver User's Manual > More on Solving > Setting Filter Levels: Coloring Graphs > Complete program

The complete graph coloring program follows. The results will vary depending on platform, machine, configuration, and so on. You can also view it online in the file YourSolverHome/examples/src/graph.cpp.

#include <ilsolver/ilosolverint.h>
ILOSTLBEGIN
 
IloInt createClique(IloInt i, IloInt j, IloInt n){
  if (j >= i) return (i*n-i*(i+1)/2+j-i);
  else return createClique(j,i-1,n);
}
 
void testGraph(IloInt nTest)
{
  IloEnv env;
  try {
    IloModel model(env);
    IloInt n = (nTest%2)?nTest+1:nTest;
    env.out() << "--------------------------------------" << endl;
    IloInt nbNodes = n*(n-1)/2;
    IloInt nbColors = n-1;
    IloInt i, j;
    IloIntVarArray vars(env,nbNodes,0,nbColors-1);
    for(i = 0; i < n-2; i++){
      model.add(vars[i] < vars[i+1]);
    }
    for(i = 0; i < n; i++){
      IloIntVarArray clique(env,n-1);
      for(j = 0; j < n-1; j++){
            clique[j] = vars[createClique(i,j, n)];
      }
      model.add(IloAllDiff(env,clique));
    }
    IloSolver solver(model);
    IloTimer timer(env);
    // IloExtendedLevel
    solver.setDefaultFilterLevel(IloAllDiffCt,IloExtendedLevel);
    timer.start();
    if (!solver.solve(IloGenerate(env,vars,IloChooseMinSizeInt)))
      solver.out() << "No solution" << endl;
    solver.out() << "IloExtendedLevel \t clique size:" << nTest;
    solver.out() << "\t#fails:\t" << solver.getNumberOfFails() << "\t";
    solver.out() << "cpu time: " << timer.getTime() << " s" << endl;
    // Redundant constraint for other levels
    IloIntVarArray cards(env,nbColors,nbNodes/nbColors,
                         nbNodes/nbColors);
    IloConstraint distribute=IloDistribute(env,cards,vars);
    model.add(distribute);
    // IloMediumLevel
    solver.setDefaultFilterLevel(IloAllDiffCt,IloMediumLevel);
    timer.restart();
    if (! solver.solve(IloGenerate(env,vars,IloChooseMinSizeInt)))
       solver.out() << "No solution" << endl;
    solver.out() << "IloMediumLevel \t \t clique size:" << nTest;
    solver.out() << "\t#fails:\t" << solver.getNumberOfFails() << "\t";
    solver.out() << "cpu time: " <<  timer.getTime() << " s" << endl;
    // IloBasicLevel
    solver.setDefaultFilterLevel(IloAllDiffCt,IloBasicLevel);
    timer.restart();
    if (! solver.solve(IloGenerate(env,vars,IloChooseMinSizeInt)))
      solver.out() << "No solution" << endl;
    solver.out() << "IloBasicLevel \t \t clique size:" << nTest;
    solver.out() << "\t#fails:\t" << solver.getNumberOfFails() << "\t";
    solver.out() << "cpu time: " << timer.getTime() << " s" << endl;
    solver.out() << endl;
  }
  catch (IloException& ex) {
    cerr << "Error: " << ex << endl;
  }
  env.end();
}
int main(int argc, char** argv){
  IloInt b1=(argc>1)?atoi(argv[1]):27;
  IloInt b2=(argc>2)?atoi(argv[2]):b1+4;
  for(IloInt nTest = b1; nTest < b2+1; nTest+=2){
    testGraph(nTest);
  }
  return 0;
}
 
 

Results

Results: cliques of size 27, 29, and 31

--------------------------------------
IloExtendedLevel      clique size:27 #fails: 0       cpu time: 0.651 s
IloMediumLevel        clique size:27 #fails: 1       cpu time: 0.09 s
IloBasicLevel         clique size:27 #fails: 1       cpu time: 0.05 s
 
--------------------------------------
IloExtendedLevel      clique size:29 #fails: 4       cpu time: 0.541 s
IloMediumLevel        clique size:29 #fails: 7       cpu time: 0.11 s
IloBasicLevel         clique size:29 #fails: 23      cpu time: 0.07 s
 
--------------------------------------
IloExtendedLevel      clique size:31 #fails: 4       cpu time: 0.751 s
IloMediumLevel        clique size:31 #fails: 49      cpu time: 0.16 s
IloBasicLevel         clique size:31 #fails: 65      cpu time: 0.11 s
 
 

Results

Results: cliques of size 51, 53, and 55

 
--------------------------------------
IloExtendedLevel      clique size:51 #fails: 501     cpu time: 9.754 s
IloMediumLevel        clique size:51 #fails: 10906   cpu time: 13.299 s
IloBasicLevel         clique size:51 #fails: 24512   cpu time: 19.578 s
 
--------------------------------------
IloExtendedLevel      clique size:53 #fails: 2       cpu time: 10.896 s
IloMediumLevel        clique size:53 #fails: 368     cpu time: 1.121 s
IloBasicLevel         clique size:53 #fails: 13159   cpu time: 9.063 s
 
--------------------------------------
IloExtendedLevel      clique size:55 #fails: 2       cpu time: 13.35 s
IloMediumLevel        clique size:55 #fails: 27      cpu time: 1.221 s
IloBasicLevel         clique size:55 #fails: 94      cpu time: 0.892 s
 
 

Results

Results: cliques of size 61

 
--------------------------------------
IloExtendedLevel      clique size:61 #fails: 5       cpu time: 22.502 s
IloMediumLevel        clique size:61 #fails: 120408491       cpu time: 172926 s
 

Results

Results: cliques of size 71

 
--------------------------------------
IloExtendedLevel      clique size:71 #fails: 5       cpu time: 49.471 s
IloMediumLevel        clique size:71 #fails: 586     cpu time: 5.217 s
IloBasicLevel         clique size:71 #fails: 1167    cpu time: 4.977 s