Het oplossen van sudoku met Python en SAT
In de logica klasse, zagen we vorige week, want we moeten het oplossen van een Sudoku met behulp van SA en voor de lol, heb ik besloten om te bewijzen dit feit met Python. Het was vrij makkelijk te implementeren, en dacht dat ik had de ervaring eens teilen.Zunächst willen het soort problemen Sudoku is beschreven zien, hebben we een tafel met 9 rijen en 9 kolommen, 1 per stuk veld [i, j] (waar ik = 1. 9 en J = 1. 9) heeft ten minste een waarde (tussen 1 en 9) .2. Elk veld [i, q] (waarin i = 1. 9 en J = 1. 9) Niet meer dan een Wert.3. Er zijn geen herhaalde waarden in elke rij, kolom of 3 × 3-Gruppe.4. Sommige velden hebben een standaard Wert.Nun om dit te implementeren in de code, in het bijzonder moest een Python module op te lossen voor de uitvoering van SA. Een snelle zoekopdracht op de Debian repositories beperking logilab mij python, heb ik gevonden, met behulp van vrij goed, maar zeker maken enkele verbeteringen in snelheid könnte.Bedingungen 1 uur ’s ochtends-2 pm geen probleem als logilab. Dwang kan zeer worden gebruikt [0]. We hebben net een variabele voor elk veld (bijv. X11 X99, waar het eerste nummer van de rij en de tweede getal is de kolom) en het gebied waarin zij werken (integer waarde van 1 tot 9): waarden = groot ( 1, 10) # [1. 9] = variabelen [ "x% d% d"% (i, j), j, de waarden van i-waarden] domeinen = () voor variabele in variabelen: domeinen [variabele] = fd. FiniteDomain (waarde 4.) De regel is eenvoudig, we hoeven alleen maar coderen de waarden. Als we een lijst van de twee dimensies van Sudoku, waarvan de oorspronkelijke cijfers heeft en niet leeg zijn op alle gebieden hebben, voegen we elk van hen als een obstakel: de beperkingen = [] for i, rij lijst (Sudoku): voor j, vermeld in het veld (): indien veld is Geen: weitervariable = “x% d% d”% (i +1, j +1) beperkingen. Fd Make_expression append ((variabel), “% s ==% d”% (variabele, veld ()) nu alleen) van artikel 3 wordt, hier is in wezen maken drie soorten beperkingen: een voor de rijen een voor kolommen en een voor de 3 × 3 groepen. Mijn eerste aanvraag controleert elke rij of kolom / groep in een tijd, bijvoorbeeld voor de eerste lijn “x11! = X12! = X13! = …! X19 =” is voor de eerste kolom “x11! = X21!” =. ..! = x91 “, etc, maar dit blijkt zeer traag, en na controle van de” Performance Considerations “van de beperking van de documentatie logilab het aandeel van de rij en kolom van de voorwaarden [1] veel kleine voorwaarden belang, bijvoorbeeld, “x11! X12 = ‘,’ x11! X13 = ‘,’ x11! = X14″, enz. Hij heeft ook gewezen op de beperkingen van de leidende figuren in de top (dat was het einde van de lijst voor) beperkingen, aangezien de gemakkelijkste. Met deze veranderingen, de tijd resolutie van een paar minuten tot een paar tienden verändert.Und is. Werden toegevoegd na alle beperkingen, we hebben slechts de Solver draaien: waarborg = borg (variabelen, domeinen, beperkingen) oplossingen =) (Solver. lossen (repository) De volledige code is in RainCT Bazaar in D: ~ / + junk / sudoku-logilab SA Being compleet nieuw voor hem. Beperkingen module of het gedrag van deze kwesties helemaal niet, het kostte me ongeveer een half uur komt, waaruit blijkt hoe deze kwesties in SA is heel gemakkelijk om te schrijven. [0] Met logilab. beperkingen, gegevens kunnen worden willekeurige Python variabelen (hier geven alleen een integer, maar kan ook worden tupel variabelen of wat dan ook). Wanneer dit probleem werd gepresenteerd in de klasse met een zuivere propositielogica was een beetje ingewikkelder, omdat ik niet precies kon zeggen, “is een variabele met domein-x11 [1. 9]. Bijvoorbeeld, meestal 1″ (P111 | P112 | P113 | … | P119) en (P121 | … | P129) was …», waar “P111″ juist zou zijn als het veld [1,1] bevatten een deel, “P112″ waar is als we een twee, enz. [1] nemen niet eens de moeite van 3 × 3-beperkingen groep als de andere twee wijzigingen waren genoeg voor mij door een versnelling van verandering, die een paar milliseconden, kunt u meer heraus.PS het: Als je van een formele verklaring voor dit, een zoekopdracht op Google vond dit document: Een SA gebaseerd Sudoku Solver.In gerelateerde posten: Nee heeft meer een excuus om niet op zoek naar fragmenten van Python! reactie © Siegfried-Angel Gevatter Pujals, 2010. | Permalink | Licentie | Tags: logica, python
Geplaatst onder: Linux op 31 March 2010