examples/sat.mod
changeset 1 c445c931472f
equal deleted inserted replaced
-1:000000000000 0:313153d2b82b
       
     1 /* SAT, Satisfiability Problem */
       
     2 
       
     3 /* Written in GNU MathProg by Andrew Makhorin <mao@gnu.org> */
       
     4 
       
     5 param m, integer, > 0;
       
     6 /* number of clauses */
       
     7 
       
     8 param n, integer, > 0;
       
     9 /* number of variables */
       
    10 
       
    11 set C{1..m};
       
    12 /* clauses; each clause C[i], i = 1, ..., m, is disjunction of some
       
    13    variables or their negations; in the data section each clause is
       
    14    coded as a set of indices of corresponding variables, where negative
       
    15    indices mean negation; for example, the clause (x3 or not x7 or x11)
       
    16    is coded as the set { 3, -7, 11 } */
       
    17 
       
    18 var x{1..n}, binary;
       
    19 /* main variables */
       
    20 
       
    21 /* To solve the satisfiability problem means to determine all variables
       
    22    x[j] such that conjunction of all clauses C[1] and ... and C[m] takes
       
    23    on the value true, i.e. all clauses are satisfied.
       
    24 
       
    25    Let the clause C[i] be (t or t' or ... or t''), where t, t', ..., t''
       
    26    are either variables or their negations. The condition of satisfying
       
    27    C[i] can be most naturally written as:
       
    28 
       
    29       t + t' + ... + t'' >= 1,                                       (1)
       
    30 
       
    31    where t, t', t'' have to be replaced by either x[j] or (1 - x[j]).
       
    32    The formulation (1) leads to the mip problem with no objective, i.e.
       
    33    to a feasibility problem.
       
    34 
       
    35    Another, more practical way is to write the condition for C[i] as:
       
    36 
       
    37       t + t' + ... + t'' + y[i] >= 1,                                (2)
       
    38 
       
    39    where y[i] is an auxiliary binary variable, and minimize the sum of
       
    40    y[i]. If the sum is zero, all y[i] are also zero, and therefore all
       
    41    clauses are satisfied. If the sum is minimal but non-zero, its value
       
    42    shows the number of clauses which cannot be satisfied. */
       
    43 
       
    44 var y{1..m}, binary, >= 0;
       
    45 /* auxiliary variables */
       
    46 
       
    47 s.t. c{i in 1..m}:
       
    48       sum{j in C[i]} (if j > 0 then x[j] else (1 - x[-j])) + y[i] >= 1;
       
    49 /* the condition (2) */
       
    50 
       
    51 minimize unsat: sum{i in 1..m} y[i];
       
    52 /* number of unsatisfied clauses */
       
    53 
       
    54 data;
       
    55 
       
    56 /* These data correspond to the instance hole6 (pigeon hole problem for
       
    57    6 holes) from SATLIB, the Satisfiability Library, which is part of
       
    58    the collection at the Forschungsinstitut fuer anwendungsorientierte
       
    59    Wissensverarbeitung in Ulm Germany */
       
    60 
       
    61 /* The optimal solution is 1 (one clause cannot be satisfied) */
       
    62 
       
    63 param m := 133;
       
    64 
       
    65 param n := 42;
       
    66 
       
    67 set C[1] := -1 -7;
       
    68 set C[2] := -1 -13;
       
    69 set C[3] := -1 -19;
       
    70 set C[4] := -1 -25;
       
    71 set C[5] := -1 -31;
       
    72 set C[6] := -1 -37;
       
    73 set C[7] := -7 -13;
       
    74 set C[8] := -7 -19;
       
    75 set C[9] := -7 -25;
       
    76 set C[10] := -7 -31;
       
    77 set C[11] := -7 -37;
       
    78 set C[12] := -13 -19;
       
    79 set C[13] := -13 -25;
       
    80 set C[14] := -13 -31;
       
    81 set C[15] := -13 -37;
       
    82 set C[16] := -19 -25;
       
    83 set C[17] := -19 -31;
       
    84 set C[18] := -19 -37;
       
    85 set C[19] := -25 -31;
       
    86 set C[20] := -25 -37;
       
    87 set C[21] := -31 -37;
       
    88 set C[22] := -2 -8;
       
    89 set C[23] := -2 -14;
       
    90 set C[24] := -2 -20;
       
    91 set C[25] := -2 -26;
       
    92 set C[26] := -2 -32;
       
    93 set C[27] := -2 -38;
       
    94 set C[28] := -8 -14;
       
    95 set C[29] := -8 -20;
       
    96 set C[30] := -8 -26;
       
    97 set C[31] := -8 -32;
       
    98 set C[32] := -8 -38;
       
    99 set C[33] := -14 -20;
       
   100 set C[34] := -14 -26;
       
   101 set C[35] := -14 -32;
       
   102 set C[36] := -14 -38;
       
   103 set C[37] := -20 -26;
       
   104 set C[38] := -20 -32;
       
   105 set C[39] := -20 -38;
       
   106 set C[40] := -26 -32;
       
   107 set C[41] := -26 -38;
       
   108 set C[42] := -32 -38;
       
   109 set C[43] := -3 -9;
       
   110 set C[44] := -3 -15;
       
   111 set C[45] := -3 -21;
       
   112 set C[46] := -3 -27;
       
   113 set C[47] := -3 -33;
       
   114 set C[48] := -3 -39;
       
   115 set C[49] := -9 -15;
       
   116 set C[50] := -9 -21;
       
   117 set C[51] := -9 -27;
       
   118 set C[52] := -9 -33;
       
   119 set C[53] := -9 -39;
       
   120 set C[54] := -15 -21;
       
   121 set C[55] := -15 -27;
       
   122 set C[56] := -15 -33;
       
   123 set C[57] := -15 -39;
       
   124 set C[58] := -21 -27;
       
   125 set C[59] := -21 -33;
       
   126 set C[60] := -21 -39;
       
   127 set C[61] := -27 -33;
       
   128 set C[62] := -27 -39;
       
   129 set C[63] := -33 -39;
       
   130 set C[64] := -4 -10;
       
   131 set C[65] := -4 -16;
       
   132 set C[66] := -4 -22;
       
   133 set C[67] := -4 -28;
       
   134 set C[68] := -4 -34;
       
   135 set C[69] := -4 -40;
       
   136 set C[70] := -10 -16;
       
   137 set C[71] := -10 -22;
       
   138 set C[72] := -10 -28;
       
   139 set C[73] := -10 -34;
       
   140 set C[74] := -10 -40;
       
   141 set C[75] := -16 -22;
       
   142 set C[76] := -16 -28;
       
   143 set C[77] := -16 -34;
       
   144 set C[78] := -16 -40;
       
   145 set C[79] := -22 -28;
       
   146 set C[80] := -22 -34;
       
   147 set C[81] := -22 -40;
       
   148 set C[82] := -28 -34;
       
   149 set C[83] := -28 -40;
       
   150 set C[84] := -34 -40;
       
   151 set C[85] := -5 -11;
       
   152 set C[86] := -5 -17;
       
   153 set C[87] := -5 -23;
       
   154 set C[88] := -5 -29;
       
   155 set C[89] := -5 -35;
       
   156 set C[90] := -5 -41;
       
   157 set C[91] := -11 -17;
       
   158 set C[92] := -11 -23;
       
   159 set C[93] := -11 -29;
       
   160 set C[94] := -11 -35;
       
   161 set C[95] := -11 -41;
       
   162 set C[96] := -17 -23;
       
   163 set C[97] := -17 -29;
       
   164 set C[98] := -17 -35;
       
   165 set C[99] := -17 -41;
       
   166 set C[100] := -23 -29;
       
   167 set C[101] := -23 -35;
       
   168 set C[102] := -23 -41;
       
   169 set C[103] := -29 -35;
       
   170 set C[104] := -29 -41;
       
   171 set C[105] := -35 -41;
       
   172 set C[106] := -6 -12;
       
   173 set C[107] := -6 -18;
       
   174 set C[108] := -6 -24;
       
   175 set C[109] := -6 -30;
       
   176 set C[110] := -6 -36;
       
   177 set C[111] := -6 -42;
       
   178 set C[112] := -12 -18;
       
   179 set C[113] := -12 -24;
       
   180 set C[114] := -12 -30;
       
   181 set C[115] := -12 -36;
       
   182 set C[116] := -12 -42;
       
   183 set C[117] := -18 -24;
       
   184 set C[118] := -18 -30;
       
   185 set C[119] := -18 -36;
       
   186 set C[120] := -18 -42;
       
   187 set C[121] := -24 -30;
       
   188 set C[122] := -24 -36;
       
   189 set C[123] := -24 -42;
       
   190 set C[124] := -30 -36;
       
   191 set C[125] := -30 -42;
       
   192 set C[126] := -36 -42;
       
   193 set C[127] := 6 5 4 3 2 1;
       
   194 set C[128] := 12 11 10 9 8 7;
       
   195 set C[129] := 18 17 16 15 14 13;
       
   196 set C[130] := 24 23 22 21 20 19;
       
   197 set C[131] := 30 29 28 27 26 25;
       
   198 set C[132] := 36 35 34 33 32 31;
       
   199 set C[133] := 42 41 40 39 38 37;
       
   200 
       
   201 end;