Generated on Tue Apr 18 10:21:29 2017 for Gecode by doxygen 1.6.3

graph-color.cpp

Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
00002 /*
00003  *  Main authors:
00004  *     Christian Schulte <schulte@gecode.org>
00005  *
00006  *  Contributing authors:
00007  *     Stefano Gualandi <stefano.gualandi@gmail.com>
00008  *
00009  *  Copyright:
00010  *     Christian Schulte, 2004
00011  *     Stefano Gualandi, 2013
00012  *
00013  *  Last modified:
00014  *     $Date: 2017-02-22 04:53:03 +0100 (Wed, 22 Feb 2017) $ by $Author: schulte $
00015  *     $Revision: 15469 $
00016  *
00017  *  This file is part of Gecode, the generic constraint
00018  *  development environment:
00019  *     http://www.gecode.org
00020  *
00021  *  Permission is hereby granted, free of charge, to any person obtaining
00022  *  a copy of this software and associated documentation files (the
00023  *  "Software"), to deal in the Software without restriction, including
00024  *  without limitation the rights to use, copy, modify, merge, publish,
00025  *  distribute, sublicense, and/or sell copies of the Software, and to
00026  *  permit persons to whom the Software is furnished to do so, subject to
00027  *  the following conditions:
00028  *
00029  *  The above copyright notice and this permission notice shall be
00030  *  included in all copies or substantial portions of the Software.
00031  *
00032  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00033  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00034  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00035  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00036  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00037  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00038  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00039  *
00040  */
00041 
00042 #include <gecode/driver.hh>
00043 #include <gecode/int.hh>
00044 
00045 using namespace Gecode;
00046 
00059 
00060 class GraphColorSpec {
00061 public:
00062   const int  n_v; 
00063   const int* e;   
00064   const int* c;   
00065   GraphColorSpec(const int n_v0, const int* e0, const int* c0)
00066     : n_v(n_v0), e(e0), c(c0) {}
00067 };
00068 
00070 const int g1_e[] = {
00071   160,184,  192,199,  0,129,  20,80,  8,29,  93,171,
00072   101,165,  124,193,  2,100,  66,173,  151,191,  164,187,
00073   3,130,  118,176,  121,184,  25,106,  159,193,  121,123,
00074   5,62,  97,101,  6,143,  123,163,  19,125,  17,108,
00075   122,168,  181,184,  25,41,  62,70,  29,103,  48,67,
00076   46,160,  79,170,  143,152,  38,184,  2,40,  191,195,
00077   7,196,  62,199,  76,141,  82,166,  36,80,  51,189,
00078   13,97,  3,192,  90,180,  47,176,  13,172,  92,121,
00079   50,64,  65,113,  108,123,  26,106,  34,153,  90,123,
00080   34,39,  116,178,  22,179,  50,61,  84,105,  84,93,
00081   19,108,  29,59,  63,185,  119,129,  50,177,  80,194,
00082   13,36,  46,56,  38,144,  82,193,  72,93,  49,95,
00083   42,155,  117,140,  109,189,  19,35,  31,125,  118,191,
00084   163,169,  40,167,  91,127,  3,121,  124,149,  40,174,
00085   30,175,  19,132,  18,165,  34,93,  37,63,  10,55,
00086   88,95,  76,122,  7,91,  25,141,  29,173,  139,173,
00087   8,130,  110,158,  81,174,  113,114,  95,182,  136,149,
00088   5,199,  56,106,  36,120,  133,187,  111,172,  19,34,
00089   96,197,  32,108,  27,63,  50,188,  20,116,  50,118,
00090   10,50,  24,172,  86,138,  35,50,  141,153,  98,132,
00091   70,143,  1,97,  8,160,  37,170,  4,73,  1,94,
00092   88,146,  59,61,  104,156,  62,172,  117,139,  66,189,
00093   33,134,  122,169,  95,163,  95,152,  83,140,  110,189,
00094   147,159,  22,147,  59,173,  30,41,  33,183,  181,187,
00095   88,105,  93,151,  6,130,  24,30,  84,130,  72,120,
00096   118,159,  147,189,  122,149,  24,175,  39,169,  164,186,
00097   93,187,  13,156,  119,176,  73,91,  174,178,  71,198,
00098   10,134,  30,101,  79,93,  180,187,  1,50,  51,59,
00099   18,169,  73,153,  1,198,  137,154,  61,106,  80,113,
00100   48,142,  100,111,  97,133,  82,97,  136,170,  53,134,
00101   65,177,  7,80,  73,137,  6,70,  115,166,  72,196,
00102   40,109,  91,101,  2,177,  120,185,  55,65,  72,166,
00103   104,165,  173,187,  54,71,  3,61,  52,56,  120,149,
00104   64,72,  42,43,  75,185,  62,68,  108,147,  30,111,
00105   25,58,  39,93,  75,117,  61,194,  140,153,  80,121,
00106   93,102,  9,177,  7,163,  17,70,  5,168,  63,178,
00107   74,160,  148,158,  9,84,  30,76,  63,80,  68,99,
00108   20,152,  7,182,  7,22,  71,134,  32,100,  107,164,
00109   23,62,  5,98,  130,192,  65,144,  139,161,  24,124,
00110   31,47,  29,140,  61,153,  53,109,  20,26,  143,160,
00111   47,195,  171,172,  185,193,  128,173,  38,96,  14,171,
00112   176,199,  111,139,  21,54,  80,171,  116,185,  184,199,
00113   37,88,  62,133,  3,150,  48,109,  46,176,  24,178,
00114   59,172,  180,198,  64,109,  110,111,  101,146,  66,164,
00115   5,117,  144,179,  71,126,  166,169,  107,151,  46,85,
00116   106,139,  27,153,  97,148,  68,185,  17,179,  10,142,
00117   168,169,  4,46,  113,152,  52,176,  6,38,  22,48,
00118   20,120,  2,84,  71,85,  91,116,  0,189,  116,197,
00119   142,147,  33,165,  86,198,  146,149,  152,187,  44,62,
00120   48,175,  56,150,  63,161,  71,164,  17,171,  19,66,       -1,-1};
00122 const int g1_c[] = {
00123   30,  6,11,14,25,40,42,48,53,61,76,80,87,89,92,108,115,120,131,132,137,145,159,162,163,164,168,172,173,176,182,
00124   30,  3,15,16,31,34,35,37,38,49,58,67,78,86,91,100,110,114,123,129,132,133,140,143,154,167,168,174,175,193,197,
00125   25,  3,10,33,38,43,45,48,51,65,66,82,88,90,93,94,103,107,128,131,141,152,155,168,185,199,
00126   25,  0,4,7,26,28,33,36,58,61,72,79,81,90,99,105,114,115,124,135,152,159,161,173,181,192,
00127   25,  12,15,28,39,43,44,45,66,83,84,85,99,102,108,112,115,120,126,131,152,157,163,171,182,183,
00128   25,  13,14,15,38,55,66,76,78,87,91,95,99,109,110,125,130,134,137,148,153,159,169,181,185,195,
00129   25,  3,4,31,35,41,42,57,60,65,66,72,74,84,86,90,91,94,96,110,139,140,141,165,179,199,
00130   25,  0,4,5,9,28,31,42,49,54,63,65,72,74,75,76,82,91,99,107,109,140,147,154,169,182,
00131   25,  4,5,10,17,41,43,48,58,65,85,92,97,107,112,114,129,131,146,150,153,158,169,176,184,191,
00132   25,  4,8,15,16,20,21,37,55,68,84,87,104,109,112,117,119,122,123,126,133,142,164,167,180,195,
00133   25,  5,6,10,11,28,30,43,46,53,60,66,79,82,105,114,116,119,124,127,147,157,171,184,195,196,
00134   20,  15,16,30,35,36,56,66,78,81,84,99,126,128,129,138,151,152,153,166,190,
00135   20,  5,21,23,29,39,40,49,69,88,114,122,127,128,142,148,155,161,171,188,190,
00136   20,  0,3,15,23,31,41,57,60,69,76,89,107,109,128,153,155,161,169,174,183,
00137   20,  9,33,43,61,64,69,85,98,100,101,114,120,138,144,172,182,184,187,188,198,
00138   20,  4,6,8,10,23,27,45,57,66,68,71,93,110,122,139,146,150,155,156,188,
00139   20,  4,14,18,22,63,77,78,83,94,98,104,114,150,166,172,177,183,186,196,199,
00140   20,  22,35,46,47,63,64,70,78,87,99,102,112,116,119,125,131,152,165,174,186,
00141   20,  1,3,13,15,19,26,46,51,65,73,76,110,114,149,152,163,166,170,178,186,
00142   20,  9,29,33,40,50,54,102,105,111,112,119,120,124,128,136,138,144,175,190,199,
00143   20,  39,75,79,102,106,112,123,125,138,145,154,155,159,162,165,168,175,181,189,196,
00144   20,  0,11,12,23,42,63,68,71,79,83,89,98,113,117,121,141,156,176,177,193,
00145   20,  10,17,31,56,77,89,102,115,116,117,118,120,136,157,163,168,172,182,193,196,
00146   20,  9,34,35,43,44,57,60,64,79,87,88,94,103,133,156,157,166,171,174,189,
00147   20,  13,21,22,31,41,45,66,67,79,86,112,116,119,146,160,171,175,181,192,195,
00148   20,  11,24,26,45,57,91,99,102,122,123,135,141,144,146,154,156,167,191,194,199,
00149   15,  17,44,53,61,82,90,95,103,107,122,124,145,169,186,190,
00150   15,  2,14,26,37,58,61,75,95,103,109,115,116,141,154,199,
00151   15,  5,13,21,28,61,64,65,73,105,115,119,132,148,154,185,
00152   15,  10,20,38,45,61,75,109,111,115,143,150,157,163,179,186,
00153   15,  9,45,48,49,51,52,57,64,70,128,158,163,182,183,192,
00154   15,  47,55,57,64,79,80,105,131,152,163,172,180,186,190,197,
00155   15,  16,36,69,84,99,113,118,121,126,137,160,162,165,177,196,
00156   15,  16,44,50,53,54,65,69,80,96,112,125,139,150,153,193,
00157   15,  6,54,72,76,86,95,96,144,145,148,151,164,168,180,183,
00158   15,  10,18,19,37,65,85,90,104,112,128,147,158,164,192,198,
00159   15,  20,21,36,50,53,74,90,96,99,124,129,140,163,171,183,
00160   15,  13,20,27,53,65,77,86,98,110,125,133,139,147,188,196,
00161   15,  23,41,43,49,58,74,77,86,111,126,150,168,173,185,189,
00162   15,  11,35,62,89,125,132,134,141,149,163,166,167,171,194,196,
00163   15,  14,28,30,52,114,115,122,125,132,135,172,177,179,181,195,
00164   15,  0,8,9,20,23,53,77,93,121,136,141,147,150,191,199,
00165   15,  3,21,47,49,91,102,106,113,124,136,140,143,177,178,194,
00166   15,  44,46,52,53,68,82,89,90,120,128,144,147,175,178,192,
00167   15,  8,16,19,21,67,72,79,82,86,90,115,116,149,152,199,
00168   15,  12,30,78,80,97,120,122,123,143,146,151,165,173,177,178,
00169   15,  9,19,39,46,91,109,128,130,131,146,148,150,178,185,198,
00170   10,  29,44,69,74,96,115,122,126,189,199,
00171   10,  22,42,52,53,97,113,146,151,160,195,
00172   10,  19,20,32,77,81,133,134,138,147,177,
00173   10,  0,4,56,59,107,109,144,149,158,167,
00174   10,  6,69,99,104,110,114,118,134,152,172,
00175   5,  25,76,126,140,143,
00176   5,  4,54,67,116,142,
00177   5,  47,52,124,151,192,
00178   5,  32,55,61,64,73,
00179   5,  11,65,128,134,190,
00180   5,  45,48,63,131,139,
00181   5,  34,55,82,108,151,
00182   5,  24,34,54,112,156,
00183   5,  12,47,72,148,163,
00184   5,  74,126,145,162,170,
00185   5,  73,78,104,175,192,
00186   5,  19,83,127,130,166,
00187   5,  20,90,98,137,165,
00188   5,  22,24,29,49,132,
00189   5,  82,92,116,134,184,
00190   -1};
00191 
00193 const GraphColorSpec g1(200, g1_e, g1_c);
00194 
00196 const int g2_e[] = {
00197   63,97,  67,85,  18,180,  2,143,  55,156,  28,105,
00198   37,196,  26,33,  88,199,  175,179,  45,46,  62,70,
00199   53,58,  49,177,  91,178,  52,129,  147,165,  83,95,
00200   68,172,  66,150,  7,112,  71,92,  97,150,  114,116,
00201   56,86,  154,188,  95,97,  159,199,  68,119,  11,81,
00202   79,116,  64,74,  88,89,  99,114,  70,73,  87,162,
00203   24,119,  9,25,  174,188,  11,80,  47,198,  86,145,
00204   7,70,  37,170,  138,180,  66,199,  98,153,  70,142,
00205   84,196,  78,185,  7,131,  54,76,  69,82,  53,166,
00206   25,178,  3,36,  128,197,  59,96,  122,137,  54,124,
00207   157,162,  3,146,  72,198,  2,94,  137,158,  64,131,
00208   2,79,  18,119,  22,38,  92,136,  7,108,  179,194,
00209   68,166,  10,84,  28,192,  103,104,  28,75,  8,43,
00210   153,164,  59,119,  88,177,  36,70,  59,154,  57,75,
00211   109,174,  155,184,  16,74,  99,148,  77,121,  54,177,
00212   38,172,  138,174,  7,16,  28,146,  18,192,  4,154,
00213   17,31,  56,57,  174,177,  81,122,  101,175,  21,155,
00214   48,96,  124,154,  129,130,  58,169,  19,57,  115,165,
00215   40,117,  34,181,  28,32,  32,176,  19,119,  20,93,
00216   137,172,  55,135,  92,95,  34,51,  5,81,  63,118,
00217   72,94,  157,181,  15,68,  41,90,  35,73,  159,183,
00218   115,128,  28,183,  34,45,  149,177,  74,137,  51,110,
00219   25,170,  43,123,  53,109,  4,26,  68,80,  53,171,
00220   48,159,  0,28,  67,176,  87,163,  75,165,  137,162,
00221   150,199,  57,153,  32,93,  25,92,  13,88,  115,167,
00222   16,192,  113,157,  90,125,  104,188,  148,171,  96,101,
00223   22,68,  25,62,  89,161,  24,158,  66,190,  31,34,
00224   106,133,  51,102,  146,163,  31,154,  56,129,  66,157,
00225   38,93,  73,166,  117,174,  93,161,  3,95,  86,181,
00226   131,139,  5,182,  30,66,  0,11,  88,107,  54,101,
00227   36,66,  25,176,  8,38,  31,177,  78,195,  122,179,
00228   42,60,  83,112,  149,161,  184,188,  65,126,  74,198,
00229   38,80,  135,172,  43,156,  148,151,  135,195,  111,184,
00230   10,14,  97,152,       -1,-1};
00232 const int g2_c[] = {
00233   30,  10,11,17,20,24,29,33,40,45,50,51,76,77,85,88,101,114,120,122,127,129,136,144,147,148,157,169,180,184,193,
00234   30,  0,2,14,21,38,40,44,51,72,82,91,99,106,109,119,123,126,136,141,154,157,161,163,165,166,171,175,182,183,196,
00235   30,  2,17,20,30,35,36,37,39,46,56,61,72,75,77,80,84,85,96,97,100,107,112,123,156,160,163,175,181,182,195,
00236   25,  11,19,36,41,44,59,60,73,74,89,93,94,108,109,113,130,132,153,163,167,182,186,193,196,199,
00237   25,  2,11,25,30,31,41,49,51,52,53,85,86,93,101,105,108,111,130,135,144,150,183,185,191,194,
00238   25,  1,6,9,11,12,13,19,21,33,49,51,77,124,128,130,131,140,146,147,161,171,180,181,185,198,
00239   25,  3,5,31,39,42,57,59,61,90,93,98,102,106,121,129,132,140,160,165,166,168,185,187,193,194,
00240   25,  9,12,16,23,33,41,44,61,68,73,85,93,96,113,118,122,125,127,129,133,139,146,181,186,199,
00241   25,  6,23,35,42,45,57,65,67,70,77,80,96,100,105,114,119,129,145,146,152,157,160,166,190,195,
00242   25,  8,18,19,27,36,40,49,52,60,65,75,84,85,96,97,107,109,110,120,122,132,154,155,172,189,
00243   25,  1,25,27,37,39,45,56,61,69,70,80,87,89,102,111,115,120,126,134,146,156,169,173,175,192,
00244   20,  8,14,20,21,32,39,50,55,88,91,102,120,126,142,159,165,171,175,184,186,
00245   20,  10,15,35,43,50,52,60,77,80,81,85,87,106,120,145,151,155,159,176,196,
00246   20,  10,17,20,33,46,55,60,68,95,96,103,112,117,118,120,123,127,141,147,179,
00247   20,  9,34,41,52,56,72,73,100,102,116,124,131,138,155,157,158,172,173,182,183,
00248   20,  0,14,16,27,29,44,70,95,101,104,115,127,140,158,161,168,170,173,181,189,
00249   20,  6,14,17,18,23,27,50,51,83,84,93,107,108,116,122,136,154,159,172,185,
00250   20,  11,16,17,21,32,38,45,49,55,56,84,88,102,123,126,133,173,189,195,198,
00251   20,  0,14,21,29,30,40,63,67,93,98,116,122,131,140,150,152,174,178,183,190,
00252   20,  8,14,28,36,44,65,72,79,84,111,114,124,130,134,140,158,182,185,193,197,
00253   20,  9,10,12,17,28,42,46,50,57,62,90,117,132,149,168,176,178,182,187,188,
00254   20,  2,4,22,27,31,32,65,74,108,117,132,142,153,159,160,178,180,187,192,195,
00255   20,  2,4,7,21,56,64,67,100,103,130,135,140,147,151,156,161,167,191,193,196,
00256   20,  6,18,24,30,50,51,67,82,84,88,93,95,106,113,138,146,168,187,190,198,
00257   20,  28,37,44,98,99,107,112,119,129,132,135,151,156,167,168,179,182,190,198,199,
00258   15,  4,37,61,64,67,77,93,103,105,118,136,159,169,177,193,
00259   15,  17,44,53,61,82,90,95,103,107,122,124,145,169,186,190,
00260   15,  21,54,80,100,110,120,126,127,132,142,149,150,162,181,186,
00261   15,  3,7,21,22,40,41,82,94,96,98,126,140,143,147,152,
00262   15,  4,14,58,66,80,100,107,111,126,133,140,141,148,155,167,
00263   15,  31,38,44,48,59,74,75,77,100,105,139,168,171,182,187,
00264   15,  0,5,55,62,66,67,74,84,92,128,160,163,188,189,195,
00265   15,  0,36,55,73,80,96,121,133,167,173,190,191,193,195,198,
00266   15,  21,33,41,43,52,62,69,77,88,110,114,118,139,142,187,
00267   15,  12,14,23,29,44,58,67,74,124,149,150,156,167,171,183,
00268   15,  22,33,36,48,60,63,90,92,107,108,137,140,144,165,193,
00269   15,  11,24,40,45,49,59,72,123,125,132,151,161,167,179,184,
00270   15,  4,19,20,48,61,76,98,106,136,147,155,177,183,191,192,
00271   15,  17,22,28,35,55,74,86,90,98,106,121,138,168,190,195,
00272   15,  24,30,35,44,55,63,80,120,128,130,148,160,163,166,192,
00273   15,  20,30,59,64,69,94,104,106,139,140,144,147,156,161,199,
00274   15,  13,30,38,49,54,61,86,95,103,105,131,148,156,162,180,
00275   15,  2,25,34,41,46,63,69,81,91,113,139,159,186,188,190,
00276   15,  1,6,14,35,47,50,66,81,90,136,137,152,156,168,195,
00277   15,  34,37,47,52,94,100,104,105,107,131,147,171,186,191,192,
00278   15,  9,14,29,37,109,125,137,142,145,147,151,159,167,178,192,
00279   15,  13,45,60,62,78,99,104,118,142,143,156,179,189,191,197,
00280   15,  3,15,23,33,66,71,82,89,99,110,113,135,143,158,171,
00281   15,  27,39,101,102,118,133,134,138,141,144,145,148,165,169,189,
00282   15,  12,18,20,36,50,51,53,76,86,120,141,176,178,186,198,
00283   10,  6,8,17,77,109,112,115,124,129,193,
00284   10,  21,31,51,58,86,112,117,126,127,143,
00285   10,  10,74,87,108,123,134,157,180,186,190,
00286   10,  13,14,15,44,67,118,133,142,146,193,
00287   10,  40,44,46,66,73,128,141,161,174,192,
00288   5,  25,117,163,165,192,
00289   5,  40,46,105,121,134,
00290   5,  3,12,56,90,126,
00291   5,  13,95,98,120,188,
00292   5,  3,98,111,128,194,
00293   5,  4,21,51,65,73,
00294   5,  36,106,124,132,197,
00295   5,  5,35,57,91,144,
00296   5,  0,19,122,177,190,
00297   5,  85,98,111,113,134,
00298   5,  49,85,107,139,149,
00299   5,  54,88,102,111,172,
00300   5,  41,74,115,170,184,
00301   5,  33,70,123,151,159,
00302   5,  50,82,117,123,163,
00303   -1};
00304 
00306 const GraphColorSpec g2(200, g2_e, g2_c);
00308 
00315 class GraphColor : public IntMinimizeScript {
00316 private:
00317   const GraphColorSpec& g;
00319   IntVarArray v;
00321   IntVar m;
00322 public:
00324   enum {
00325     MODEL_NONE,  
00326     MODEL_CLIQUE 
00327   };
00329   enum {
00330     BRANCH_DEGREE,         
00331     BRANCH_SIZE,           
00332     BRANCH_DEGREE_SIZE,    
00333     BRANCH_AFC_SIZE,       
00334     BRANCH_ACTION_SIZE  
00335   };
00337   enum {
00338     SYMMETRY_NONE,      
00339     SYMMETRY_LDSB       
00340   };
00342   GraphColor(const SizeOptions& opt)
00343     : IntMinimizeScript(opt),
00344       g(opt.size() == 1 ? g2 : g1),
00345       v(*this,g.n_v,0,g.n_v-1),
00346       m(*this,0,g.n_v-1) {
00347     rel(*this, v, IRT_LQ, m);
00348     for (int i = 0; g.e[i] != -1; i += 2)
00349       rel(*this, v[g.e[i]], IRT_NQ, v[g.e[i+1]]);
00350 
00351     const int* c = g.c;
00352     for (int i = *c++; i--; c++)
00353       rel(*this, v[*c], IRT_EQ, i);
00354     while (*c != -1) {
00355       int n = *c;
00356       IntVarArgs x(n); c++;
00357       for (int i = n; i--; c++)
00358         x[i] = v[*c];
00359       distinct(*this, x, opt.ipl());
00360       if (opt.model() == MODEL_CLIQUE)
00361         rel(*this, m, IRT_GQ, n-1);
00362     }
00363     // Branching on the number of colors
00364     branch(*this, m, INT_VAL_MIN());
00365     if (opt.symmetry() == SYMMETRY_NONE) {
00366       // Branching without symmetry breaking
00367       switch (opt.branching()) {
00368       case BRANCH_SIZE:
00369         branch(*this, v, INT_VAR_SIZE_MIN(), INT_VAL_MIN());
00370         break;
00371       case BRANCH_DEGREE:
00372         branch(*this, v, tiebreak(INT_VAR_DEGREE_MAX(),INT_VAR_SIZE_MIN()),
00373                INT_VAL_MIN());
00374         break;
00375       case BRANCH_DEGREE_SIZE:
00376         branch(*this, v, INT_VAR_DEGREE_SIZE_MAX(), INT_VAL_MIN());
00377         break;
00378       case BRANCH_AFC_SIZE:
00379         branch(*this, v, INT_VAR_AFC_SIZE_MAX(opt.decay()), INT_VAL_MIN());
00380         break;
00381       case BRANCH_ACTION_SIZE:
00382         branch(*this, v, INT_VAR_ACTION_SIZE_MAX(opt.decay()), INT_VAL_MIN());
00383         break;
00384       }
00385     } else { // opt.symmetry() == SYMMETRY_LDSB
00386       // Branching while considering value symmetry breaking
00387       // (every permutation of color values gives equivalent solutions)
00388       Symmetries syms;
00389       syms << ValueSymmetry(IntArgs::create(g.n_v,0));
00390       switch (opt.branching()) {
00391       case BRANCH_SIZE:
00392         branch(*this, v, INT_VAR_SIZE_MIN(), INT_VAL_MIN(), syms);
00393         break;
00394       case BRANCH_DEGREE:
00395         branch(*this, v, tiebreak(INT_VAR_DEGREE_MAX(),
00396                                   INT_VAR_SIZE_MIN()),
00397                INT_VAL_MIN(), syms);
00398         break;
00399       case BRANCH_DEGREE_SIZE:
00400         branch(*this, v, INT_VAR_DEGREE_SIZE_MAX(), INT_VAL_MIN(), syms);
00401         break;
00402       case BRANCH_AFC_SIZE:
00403         branch(*this, v, INT_VAR_AFC_SIZE_MAX(opt.decay()),
00404                INT_VAL_MIN(), syms);
00405         break;
00406       case BRANCH_ACTION_SIZE:
00407         branch(*this, v, INT_VAR_ACTION_SIZE_MAX(opt.decay()),
00408                INT_VAL_MIN(), syms);
00409         break;
00410       }
00411     }
00412   }
00414   virtual IntVar cost(void) const {
00415     return m;
00416   }
00418   GraphColor(bool share, GraphColor& s) : IntMinimizeScript(share,s), g(s.g) {
00419     v.update(*this, share, s.v);
00420     m.update(*this, share, s.m);
00421   }
00423   virtual Space*
00424   copy(bool share) {
00425     return new GraphColor(share,*this);
00426   }
00428   virtual void
00429   print(std::ostream& os) const {
00430     os << "\tm = " << m << std::endl
00431        << "\tv[] = {";
00432     for (int i = 0; i < v.size(); i++) {
00433       os << v[i] << ", ";
00434       if ((i+1) % 15 == 0)
00435         os << std::endl << "\t       ";
00436     }
00437     os << "};" << std::endl;
00438   }
00439 };
00440 
00441 
00445 int
00446 main(int argc, char* argv[]) {
00447   SizeOptions opt("GraphColor");
00448   opt.ipl(IPL_DOM);
00449   opt.solutions(0);
00450 
00451   opt.model(GraphColor::MODEL_NONE);
00452   opt.model(GraphColor::MODEL_NONE, "none",
00453             "no lower bound");
00454   opt.model(GraphColor::MODEL_CLIQUE, "clique",
00455             "use maximal clique size as lower bound");
00456 
00457   opt.branching(GraphColor::BRANCH_DEGREE);
00458   opt.branching(GraphColor::BRANCH_DEGREE,      "degree");
00459   opt.branching(GraphColor::BRANCH_SIZE,        "size");
00460   opt.branching(GraphColor::BRANCH_DEGREE_SIZE, "degree-size");
00461   opt.branching(GraphColor::BRANCH_AFC_SIZE,    "afc-size");
00462   opt.branching(GraphColor::BRANCH_ACTION_SIZE, "action-size");
00463 
00464   opt.symmetry(GraphColor::SYMMETRY_NONE);
00465   opt.symmetry(GraphColor::SYMMETRY_NONE, "none");
00466   opt.symmetry(GraphColor::SYMMETRY_LDSB, "ldsb",
00467                "use value symmetry breaking");
00468 
00469   opt.parse(argc,argv);
00470   Script::run<GraphColor,BAB,SizeOptions>(opt);
00471   return 0;
00472 }
00473 
00474 // STATISTICS: example-any
00475