2008.09.21 ========== * Bugfix in DiagonalSolver.java: Initialisierung der Diagonalen von initialize() nach createField() verschoben (super.initialize() ruft addSolvers() auf, welche von einer fertigen Initialisierung ausgeht) => Danke an iceblox für den Fehlerbericht! (java -jar pms.jar -v -e -t dia 020080900610000070000060040008002003052000097700056100030070000000003004005024010) 2006.04.15 ========== * AbstractSolver.java kann nun auch mit vollstaendigen oder partiellen Killer-Sudokus umgehen (die Werte festgelegter Gruppen von Elementen muessen eine vorgegebene Summe bilden) => neue Kommandozeilenoption (--killer) zur Eingabe solcher Gruppen und deren Summe => TreborTable.java beruecksichtigt nun auch die Summen-Gruppen, in denen ein Element evtl. enthalten ist, bei der Expansion einer Annahme 2006.04.11 ========== * die Umstellung von LinkedHashSet auf BitSets als Verwaltungsstruktur der Implikationen einer Annahme (in Assertion.java) liefert bis zu 25%-50% Zeitersparnis (je nach Problemschwierigkeit) => neue Klasse AssertionFactory.java uebernimmt die Erstellung und Verwaltung aller Aussagen => viele damit einhergehende Aenderungen in TreborTable.java * neue SolverGroup: FastTreborTable.java (schnelle Variante von TreborTable.java, findet aber evtl. keine Loesung, da Expansion von Annahmen staerker beschraenkt ist) 2006.04.09 ========== * --explain: Unterstuetzung von LockedCandidates.java, NakedSubset.java und HiddenSubset.java ergaenzt * Umbenennungen: NakedPair.java => NakedSubset.java; HiddenPair.java => HiddenSubset.java 2006.04.07 ========== * --verbose: liefert nun auch die benoetigte Zeit zum Loesen des Problems * --explain: Unterstuetzung von Single.java und HiddenSingle.java ergaenzt, TreborTable.java vervollstaendigt (Invarianten bzgl. allen positiven Aussagen einer Gruppe) => dafuer wurden alle SolverTypes um eine HashMap zur Bezeichnung der Gruppen eines Feldes erweitert * Rundenstatistiken in solve() werden nur nach erfolgreichen Runden angezeigt * die Umstellung von TreeSet auf LinkedHashSet als Verwaltungsstruktur der Implikationen einer Annahme (in Assertion.java) fuehrt in einigen Faellen bis zu einer Halbierung der benoetigten Loesungszeit * durch einen kleinen Bugfix ist TrialError.java nach den Trebor's Tables die dritte SolverGroup, die ohne Hilfe der anderen eigenstaendig jedes Sudoku loesen kann (dank einem Hinweis von iceblox) 2006.04.03 ========== * die bisher straeflich vernachlaessigten Trebor's Tables mit Contradictions wurden ueberarbeitet und in den restlichen Analyseverlauf eingegliedert * als Standard werden nur noch Trebor's Tables mit Contradictions verwendet, die Variante ohne laesst sich wie bisher auch per --groups auswaehlen 2006.04.02 ========== * TreborTable.java verwendet als Grundlage eine neue Datenstruktur: Assertion.java * Assertion.java speichert eine Annahme und die sich daraus ergebenden Folgerungen in Form eines ausbalancierten Baumes => zusammen mit den entsprechenden Anpassungen in TreborTable.java ergibt sich ein enormer Geschwindigkeitsvorteil, vorallem durch Einsparung unnoetiger Expansionsschritte 2006.03.31 ========== * neue Kommandozeilenoption (--explain): SolverGroups geben ausfuehrliche Informationen ueber ihre Arbeitsweise; bisher nur fuer TreborTable.java implementiert * Unmengen von Fehlerkorrekturen und Optimierungen in TreborTable.java 2006.03.29 ========== * neue SolverGroup: TreborTable.java (Annahmen ueber die Werte von Elementen fuehren zu Implikationen und diese zu Invarianten oder Widerspruechen) * neue SolverGroup: TreborTableLight.java (wie TreborTable.java, nur ohne Auswertung der Widersprueche) 2006.03.27 ========== * weitreichende Umstrukturierung der SolverGroups: - alle BitSets zur Implementierung der Zuordnung "Zahl -> freie Felder in einer Zeile/Spalte/Unterbereich" wurden aus den SolverGroups entfernt und zentral als HashMap in AbstractSolver.java integriert - AbstractSolver.java uebernimmt auch die Erstellung und Aktualisierung jener BitSets und implementiert hierzu die Observer-Schnittstelle - die einzelnen SolverGroups erhalten per Konstruktor Referenzen auf die sie betreffenden BitSets - AbstractUniqueGroup.java wurde somit ueberfluessig und geloescht - AbstractIndependentGroup.java stellt fuer die meisten SolverGroups die Oberklasse dar und wurde in AbstractGroup.java umbenannt => viele SolverGroups konnten somit verkuerzt und auf ihren eigentlichen Kern - solve() - vereinfacht werden, zusaetzlich werden unnoetige Mehrfachaktualisierungen der BitSets vermieden 2006.03.25 ========== * neue SolverGroup: Colors.java (Ketten von je zwei moeglichen Positionen pro Gruppe fuer einen Wert suchen) * neue SolverGroup: MultiColors.java (Kombination mehrerer "unabhaengiger" Ketten fuer einen Wert) 2006.03.24 ========== * neue SolverGroup: YWing.java (Verallgemeinerung von Naked Triples) * neue Kommandozeilenoption (--dimension, Standard ist 4): beschraenkt mengenbasierte Solver (NakedPair, HiddenPair und XWing) * --verbose erweitert: solve() gibt erfolgreiche Schritte als Kleinbuchstaben und Rekursionen mittels "<" und ">" aus 2006.03.12 ========== * Statistiken sind nun auch bei Problemen mit Trial & Error korrekt (Zaehlerstaende werden auf einem Stack gesichert) * getField() in SimpleSolver.java verwendet nur noch Leerzeichen, falls diese wirklich noetig sind 2006.03.11 ========== * SimpleSolver.java um die Faehigkeit zur Ein/Ausgabe von Buchstaben als Werte erweitert, somit sind die Buchstaben-Sudokus in der neuen P.M. ebenfalls loesbar 2006.03.09 ========== * neuen Solver implementiert: SamuraiSolver.java (fuenf ueberlappende Standardfelder) * neuen Solver implementiert: DiagonalSolver.java (Standard + Haupt-/Nebendiagonale eineindeutig) * neuer Kommandozeilenparameter --check ermoeglicht die Feldausgabe als Zahlenkolone 2006.03.08 ========== * neue Kommandozeilenparameter zur Angabe von Groesse und Typ des Sudokus * Hilfetexte und Erklaerungen fuer die Kommandozeile angelegt * Bugfix in SimpleSolver.java 2006.03.07 ========== * Verwendung von GNU getopt zum Einlesen der Kommandozeilenparameter * SimpleSolver.java prueft uebergebene Strings genauer, bevor daraus ein Feld erzeugt wird * AbstractSolver.java enthaelt die feldunabhaengigen Teile von SimpleSolver.java (hauptsaechlich SolverGroups); ausserdem lassen sich die verwendeten SolverGroups leicht anpassen * Element.java wurde um einige Fehler bereinigt (kein checkLock() in forbid(), denn dafuer ist Single.java zustaendig; throw new UnsolveableException(), falls Unloesbarkeit festgestellt wird; beim Setzen einer Zahl auf Gueltigkeit testen und anschliessend die gueltigen Werte anpassen) * AbstractUniqueGroup.java verbietet keine Werte mehr automatisch, denn dafuer ist UniqueGroup.java zustaendig * SolverGroup.java & Co: solve() liefert nun einen int (Anzahl Aenderungen) statt boolean * neue SolverGroup: TrialError.java (Loesung mittels Backtracking) * neue SolverGroup: UniqueGroup.java (implementiert die Eindeutigkeitsregel von Sudoku) * PMS.java wurde auf Beachtung von Kommandozeilenparameter vorbereitet und kann eine Statistik ausgeben * SimpleSolver.java enthaelt keine feldunabhaengigen Funktionen mehr und kann das Feld nun aus einem String generieren bzw. als String ausgeben 2006.03.01 ========== * neue Loesungsverfahren: AlignedPairExclusion und XWing/SwordFish * SimpleSolver verwendet nun Listen anstelle von Mengen fuer die Zeilen/Spalten/Unterbereiche (zum Erhalt der Reihenfolge) * die Loesungsklassen werden in zusaetzlichen Listen weiter gruppiert und nach Komplexitaet sortiert angewandt * SolverGroups aufgesplittet, sodass jedes der folgenden Verfahren in einer eigenen Klasse implementiert ist: Singles, Hidden Singles, Locked Candidates, Naked Pairs (Triples, Quads, ...), Hidden Pairs (Triples, Quads, ...) und ForbiddenValues * Konstruktor von SimpleSolver aufgeraeumt: die Erstellung des Feldes und das Anlegen der Loesungsgruppen ist nun getrennt und auf zwei Funktionen ausgelagert * die Aufrufe von Locked Candidates wurden um den zweiten Typ ergaenzt und generieren sich nun automatisch aus den Schnittmengen von Zeile/Spalte mit den Unterbereichen * SimpleSolver.solve() springt immer wieder zu den einfacheren Loesungsverfahren zurueck, bevor die schwierigeren verwendet werden * Import in Subversion