Example #1
0
    def solve(self):
        """
        Résoudre la grille, dessiner la solution et afficher le résultat dans
        le champs de texte prévu pour. 
        """
        # Rendre la grille non modifiable une fois qu'elle a été résolue
        self.tag_unbind("cell", "<ButtonPress-1>")
        # Afficher un message des fois que la recherche d'une solution mette
        # un peu de temps
        self.solvable_textvar.set("Looking for solution...")
        # rendre solides toutes les cases qui ne sont pas dans une zone ou solides
        self.dtag("selected", "selected")
        self.addtag_withtag("selected", "blank")
        self.toggle_selection_solid()

        # Générer les clauses
        cnf = gen_cnf(
            self.dimensions[0], self.dimensions[1], self.zones, self.black_cells
        )
        # Convertir les clauses en 3-sat
        cnf = sat_3sat(cnf, self.dimensions[1], self.dimensions[0])
        # Trouver une solution
        solution = sat.solve(cnf)
        # Si une solution a été trouvée, l'afficher et mettre à jour le texte
        if not (solution == "UNSAT" or solution == "UNKNOWN"):
            self.draw_solution(solution)
            self.solvable_textvar.set("Solution found!")
        # Sinon, juste mettre a jour le texte
        else:
            self.solvable_textvar.set("No solution found!")
Example #2
0
 def export_dimacsSAT(self):
     """
     Exporte le fichier DIMACS associé à la grille.
     """
     filename = asksaveasfilename(
         initialdir=".",
         filetypes=(("DIMACS File", "*.cnf"), ("All Files", "*.*")),
         title="Choose a file.",
     )
     if filename:
         grid = self.dosun_grid.get_grid()
         sat = gen_cnf(grid["width"], grid["height"], grid["zones"],
                       grid["blacks"])
         fio.save_dimacs(sat, filename)
Example #3
0
#!venv/bin/python
from sys import argv, stderr
from lib.file_io import read_grid, save_dimacs
from lib.gen_formule import gen_cnf, sat_3sat

if __name__ == "__main__":
    # vérification du nombre d'arguments
    if len(argv) < 2:
        print("Erreur: veuillez fournir au moins une grille en argument",
              file=stderr)
        print("Usage: {} path/to/grid.json path/to/another/grid.json ....".
              format(argv[0]),
              file=stderr)
        exit(1)

    # convertir chaque grille fournie en argument et les exporter au format DIMACS
    for i in range(1, len(argv)):
        # lire la grille
        grid = read_grid(argv[i])
        # générer les clauses
        cnf = gen_cnf(grid["width"], grid["height"], grid["zones"],
                      grid["blacks"])
        # convertir les clauses en clauses 3-SAT
        cnf = sat_3sat(cnf, grid["height"], grid["width"])
        # générer le nom du fichier de sortie
        output_filename = argv[i].split(".json")[0] + ".cnf"
        # exporter au format DIMACS
        save_dimacs(cnf, output_filename)