Browse Source

added DhNextCellChooser

master
Robin Thoni 7 years ago
parent
commit
2400112ca3

+ 1
- 0
README.md View File

26
     - '0': Empty sudoku
26
     - '0': Empty sudoku
27
     - filename: load from the specified file
27
     - filename: load from the specified file
28
 - Next cell chooser: The way to select next cell to fill. Possible values:
28
 - Next cell chooser: The way to select next cell to fill. Possible values:
29
+    - 'mrv-dh': Use the Minimum remaining values strategy then Degree heuristic strategy if multiple cells match
29
     - 'mrv' (default): Use the Minimum remaining values strategy
30
     - 'mrv' (default): Use the Minimum remaining values strategy
30
     - 'dh': Use the Degree heuristic strategy
31
     - 'dh': Use the Degree heuristic strategy
31
     - 'basic': Select the first blank value, from up to down and left to right
32
     - 'basic': Select the first blank value, from up to down and left to right

+ 16
- 0
uqac-ia-sudoku-csp/Board.cs View File

156
         {
156
         {
157
             return GetNeighboors(x, y).Where(pair => GetNumber(x, y) == null);
157
             return GetNeighboors(x, y).Where(pair => GetNumber(x, y) == null);
158
         }
158
         }
159
+
160
+        public IEnumerable<KeyValuePair<int, int>> GetEmptyCells()
161
+        {
162
+            var list = new List<KeyValuePair<int, int>>();
163
+            for (var y = 0; y < Size; ++y)
164
+            {
165
+                for (var x = 0; x < Size; ++x)
166
+                {
167
+                    if (GetNumber(x, y) == null)
168
+                    {
169
+                        list.Add(new KeyValuePair<int, int>(x, y));
170
+                    }
171
+                }
172
+            }
173
+            return list;
174
+        }
159
     }
175
     }
160
 }
176
 }

+ 6
- 2
uqac-ia-sudoku-csp/Program.cs View File

59
             board.Print(Console.Out);
59
             board.Print(Console.Out);
60
 
60
 
61
             INextCellChooser nextCellChooser = null;
61
             INextCellChooser nextCellChooser = null;
62
-            if (valueChooser == "mrv")
62
+            if (valueChooser == "mrv-dh")
63
             {
63
             {
64
-                nextCellChooser = new MrvNextCellChooser();
64
+                nextCellChooser = new MrvNextCellChooser(new DhNextCellChooser());
65
+            }
66
+            else if (valueChooser == "mrv")
67
+            {
68
+                nextCellChooser = new MrvNextCellChooser(null);
65
             }
69
             }
66
             else if (valueChooser == "dh")
70
             else if (valueChooser == "dh")
67
             {
71
             {

+ 28
- 1
uqac-ia-sudoku-csp/Solver/NextCellChoosers/DhNextCellChooser.cs View File

1
 using System.Collections.Generic;
1
 using System.Collections.Generic;
2
+using System.Linq;
2
 using uqac_ia_sudoku_csp.Interfaces;
3
 using uqac_ia_sudoku_csp.Interfaces;
3
 
4
 
4
 namespace uqac_ia_sudoku_csp.Solver.NextValueChoosers
5
 namespace uqac_ia_sudoku_csp.Solver.NextValueChoosers
7
     {
8
     {
8
         public void SelectVariable(Board board, out int x, out int y, IList<IConstraint> constraints)
9
         public void SelectVariable(Board board, out int x, out int y, IList<IConstraint> constraints)
9
         {
10
         {
10
-            throw new System.NotImplementedException();
11
+            var dict = new Dictionary<KeyValuePair<int, int>, int>();
12
+            for (var yy = 0; yy < board.Size; ++yy)
13
+            {
14
+                for (var xx = 0; xx < board.Size; ++xx)
15
+                {
16
+                    if (board.GetNumber(xx, yy) == null)
17
+                    {
18
+                        var k = new KeyValuePair<int, int>(xx, yy);
19
+                        if (!dict.ContainsKey(k))
20
+                        {
21
+                            dict.Add(k, 0);
22
+                        }
23
+                        ++dict[k];
24
+                    }
25
+                }
26
+            }
27
+            if (!dict.Any())
28
+            {
29
+                x = -1;
30
+                y = -1;
31
+            }
32
+            else
33
+            {
34
+                var k = dict.OrderByDescending(pair => pair.Value).First().Key;
35
+                x = k.Key;
36
+                y = k.Value;
37
+            }
11
         }
38
         }
12
     }
39
     }
13
 }
40
 }

+ 24
- 6
uqac-ia-sudoku-csp/Solver/NextCellChoosers/MrvNextCellChooser.cs View File

5
 {
5
 {
6
     public class MrvNextCellChooser : INextCellChooser
6
     public class MrvNextCellChooser : INextCellChooser
7
     {
7
     {
8
+        private readonly INextCellChooser _nextCellChooser;
9
+
10
+        public MrvNextCellChooser(INextCellChooser nextCellChooser)
11
+        {
12
+            _nextCellChooser = nextCellChooser;
13
+        }
14
+
8
         public void SelectVariable(Board board, out int x, out int y, IList<IConstraint> constraints)
15
         public void SelectVariable(Board board, out int x, out int y, IList<IConstraint> constraints)
9
         {
16
         {
10
             var avail = 1;
17
             var avail = 1;
11
-            while (avail <= board.Size)
18
+            var vars = new List<KeyValuePair<int, int>>();
19
+            while (avail <= board.Size && vars.Count == 0)
12
             {
20
             {
13
                 for (var xx = 0; xx < board.Size; ++xx)
21
                 for (var xx = 0; xx < board.Size; ++xx)
14
                 {
22
                 {
19
                             var remaining = GetRemainingValue(board, xx, yy, constraints);
27
                             var remaining = GetRemainingValue(board, xx, yy, constraints);
20
                             if (remaining == avail)
28
                             if (remaining == avail)
21
                             {
29
                             {
22
-                                x = xx;
23
-                                y = yy;
24
-                                return;
30
+                                vars.Add(new KeyValuePair<int, int>(xx, yy));
25
                             }
31
                             }
26
                         }
32
                         }
27
                     }
33
                     }
28
                 }
34
                 }
29
                 ++avail;
35
                 ++avail;
30
             }
36
             }
31
-            x = -1;
32
-            y = -1;
37
+            if (vars.Count == 0)
38
+            {
39
+                x = -1;
40
+                y = -1;
41
+            }
42
+            else if (vars.Count == 1 || _nextCellChooser == null)
43
+            {
44
+                x = vars[0].Key;
45
+                y = vars[0].Value;
46
+            }
47
+            else
48
+            {
49
+                _nextCellChooser.SelectVariable(board, out x, out y, constraints);
50
+            }
33
         }
51
         }
34
 
52
 
35
         protected int GetRemainingValue(Board board, int x, int y, IList<IConstraint> constraints)
53
         protected int GetRemainingValue(Board board, int x, int y, IList<IConstraint> constraints)

Loading…
Cancel
Save