Mathematica Integer Linear प्रोग्रामिंग ब्रांच-एंड-बाउंड का उपयोग करते हुए
जैसा कि पहले ही उल्लेख किया गया है, पूर्णांक रैखिक प्रोग्रामिंग (जो एनपी-हार्ड है ) का उपयोग करके इस समस्या को हल किया जा सकता है । Mathematica में पहले से ही ILP बना हुआ है। "To solve an integer linear programming problem Mathematica first solves the equational constraints, reducing the problem to one containing inequality constraints only. Then it uses lattice reduction techniques to put the inequality system in a simpler form. Finally, it solves the simplified optimization problem using a branch-and-bound method."
[ Mathematica में विवश अनुकूलन ट्यूटोरियल देखें ]]
मैंने निम्नलिखित कोड लिखा है जो गणितज्ञ के आईएलपी पुस्तकालयों का उपयोग करता है। यह आश्चर्यजनक रूप से तेज है।
solveMatrixBombProblem[problem_, r_, c_] :=
Module[{},
bombEffect[x_, y_, m_, n_] :=
Table[If[(i == x || i == x - 1 || i == x + 1) && (j == y ||
j == y - 1 || j == y + 1), 1, 0], {i, 1, m}, {j, 1, n}];
bombMatrix[m_, n_] :=
Transpose[
Table[Table[
Part[bombEffect[(i - Mod[i, n])/n + 1, Mod[i, n] + 1, m,
n], (j - Mod[j, n])/n + 1, Mod[j, n] + 1], {j, 0,
m*n - 1}], {i, 0, m*n - 1}]];
X := x /@ Range[c*r];
sol = Minimize[{Total[X],
And @@ Thread[bombMatrix[r, c].X >= problem] &&
And @@ Thread[X >= 0] && Total[X] <= 10^100 &&
Element[X, Integers]}, X];
Print["Minimum required bombs = ", sol[[1]]];
Print["A possible solution = ",
MatrixForm[
Table[x[c*i + j + 1] /. sol[[2]], {i, 0, r - 1}, {j, 0,
c - 1}]]];]
समस्या में दिए गए उदाहरण के लिए:
solveMatrixBombProblem[{2, 3, 4, 7, 1, 1, 5, 2, 6, 2, 4, 3, 4, 2, 1, 2, 1, 2, 4, 1, 3, 1, 3, 4, 1, 2, 1, 4, 3, 2, 6, 9, 1, 6, 4}, 7, 5]
आउटपुट
लालची एल्गोरिथ्म के साथ इसे पढ़ने वाले किसी के लिए भी
निम्नलिखित 10x10 समस्या पर अपना कोड आज़माएं:
5 20 7 1 9 8 19 16 11 3
17 8 15 17 12 4 5 16 8 18
4 19 12 11 9 7 4 15 14 6
17 20 4 9 19 8 17 2 10 8
3 9 10 13 8 9 12 12 6 18
16 16 2 10 7 12 17 11 4 15
11 1 15 1 5 11 3 12 8 3
7 11 16 19 17 11 20 2 5 19
5 18 2 17 7 14 19 11 1 6
13 20 8 4 15 10 19 5 11 12
यहाँ यह अल्पविराम से अलग है:
5, 20, 7, 1, 9, 8, 19, 16, 11, 3, 17, 8, 15, 17, 12, 4, 5, 16, 8, 18, 4, 19, 12, 11, 9, 7, 4, 15, 14, 6, 17, 20, 4, 9, 19, 8, 17, 2, 10, 8, 3, 9, 10, 13, 8, 9, 12, 12, 6, 18, 16, 16, 2, 10, 7, 12, 17, 11, 4, 15, 11, 1, 15, 1, 5, 11, 3, 12, 8, 3, 7, 11, 16, 19, 17, 11, 20, 2, 5, 19, 5, 18, 2, 17, 7, 14, 19, 11, 1, 6, 13, 20, 8, 4, 15, 10, 19, 5, 11, 12
इस समस्या के लिए, मेरे समाधान में 208 बम हैं। यहां एक संभावित समाधान है (मैं लगभग 12 सेकंड में इसे हल करने में सक्षम था)।
मैथेमेटिका के परिणामों का परीक्षण करने के तरीके के रूप में, देखें कि क्या आपका लालची एल्गोरिथ्म किसी भी बेहतर कर सकता है।