You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

201 lines
5.1 KiB

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