Procházet zdrojové kódy

Almost finished csp_solver

Federico Amedeo Izzo před 9 roky
rodič
revize
5378b335da
1 změnil soubory, kde provedl 53 přidání a 54 odebrání
  1. 53 54
      csp_solver.py

+ 53 - 54
csp_solver.py

@@ -4,73 +4,72 @@ from sudoku import Game
 
 MAX_V = 9
 class State:
-    """Represents a state of the environment"""
 
     def __init__(self):
-        elements = [x for x in range(MAX_SIZE**2)]
-        shuffle(elements)
-        self.matrix = [[elements[x+(y*MAX_SIZE)] for x in range(MAX_SIZE)] for y in range(MAX_SIZE)]
-
-    def __iter__(self):
-        self.row = 0
-        self.col = 0
-        return self
-
-    def __next__(self):
-        if self.row == MAX_SIZE:
-            self.row = 0
-            self.col = self.col+1
-        if self.col == MAX_SIZE:
-            raise StopIteration
-        elem = self.matrix[self.col][self.row]
-        self.row = self.row + 1
-        return elem
+        resultboard = []
+        for x in range(MAX_V):
+            temprow = []
+            for y in range(MAX_V):
+                temprow.append(0)
+            resultboard.append(temprow)
+        self.resultboard = resultboard
 
-    def printState(self):
-        for i in range(MAX_SIZE):
-            print(self.matrix[i])
-        print("\n")
-        
-class Solver:
-    def __init__(self):
-        self.tree = {}
-        numbers = set()
         choicesboard = []
-        # Populate the numbers vector with values from 0 to MAX_V-1
-        for x in range(MAX_V):
-            numbers.add(str(x))
+        # Populate the numbers vector with values from 1 to MAX_V
+
         # choicesboard is a bidimensional list with numbers for every element
         for x in range(MAX_V):
             row = []
             for y in range(MAX_V):
+                numbers = set()
+                for value in range(1,10):
+                    numbers.add(value)
                 row.append(numbers)
             choicesboard.append(row)
         self.choicesboard = choicesboard
-        result = getBoard()
-
-    def actions(state):
-        actions = []
 
-        return actions
+def actions(state):
+    actions = []
+    for row in range(MAX_V):
+        for col in range(MAX_V):
+            #Value not yet assigned
+            if state.resultboard[col][row] == 0:
+                #Add possible move
+                for num in state.choicesboard[col][row]:
+                    move = {'col': col, 'row': row, 'num': num}
+                    actions.append(move)
+    return actions
 
-    #def result(state,action):
+def result(state,move):
+    state.resultboard[move['col']][move['row']] = move['num']
 
-    #def goalTest(state):
+def goalTest(state):
+    incomplete = False
+    for row in range(MAX_V):
+        for col in range(MAX_V):
+            if state.resultboard[col][row] == 0:
+                imcomplete = True
+    return incomplete
 
-    def eliminateIllValues(state):
-        for row in range(MAX_V):
-            for col in range(MAX_V):
-                if result[col][row] != 0:
-                    # Eliminate duplicates numbers in a row
-                    for x in range(MAX_V):
-                        choicesboard[x][row].remove(result[col][row])
-                        # Eliminate duplicates numbers in a column
-                    for y in range(MAX_V):
-                        choicesboard[col][y].remove(result[col][row])
-                        # Eliminate duplicates in block (working only for 9x9 cells)
-                    #for y in range(MAX_V)
-                    #    choicesboard[col][y].del(result[col][row])
+def eliminateIllValues(state):
+    for row in range(MAX_V):
+        for col in range(MAX_V):
+            if state.resultboard[col][row] != 0:
+                num = state.resultboard[col][row]
+                # Eliminate duplicates numbers in a row
+                for x in range(MAX_V):
+                    state.choicesboard[x][row].remove(num)
+                    # Eliminate duplicates numbers in a column
+                for y in range(MAX_V):
+                    state.choicesboard[col][y].remove(num)
+                    # Eliminate duplicates in block (working only for 9x9 cells)
+                #for y in range(MAX_V)
+                #    choicesboard[col][y].del(state.resultboard[col][row])
 
-#if __name__ == "__main__":
-#    while not goalTest(state):
-#        for action in actions(node):
+if __name__ == "__main__":
+    node = State()
+    while not goalTest(node):
+        move=actions(node).pop()
+        result(node,move)
+        eliminateIllValues(node)
+    print('Result found!')