Algorithmus für Sudoku

Status
Nicht offen für weitere Antworten.

spidermobile

Bekanntes Mitglied
Hallo zusammen,

ich würde gerne zu Übungszwecken ein Sudoku bauen. Da ich nie die Mathe-Leistungsstufe :wink: besucht habe, werde ich bestimmt am Algorithmus für das Setzen der Zahlen scheitern. Bin bei google leider nicht fündig geworden. Kennt jemand einen Link für den Quelltext dieses Algorithmus (also nicht das ganze Spiel, das möchte ich ja selber proggen).

Wäre schön! Danke!
 

McLane

Mitglied
Also ein Spezieller Algorithmus der das Sudokuproblem löst ist mir nicht bekannt.

Jedoch habe ich das Problem vor einiger Zeit recht effizient (10 ms Berechnungszeit) mit dem "Backtracking-Algorithmus" gelöst. Vielleicht hilft der dir auch.

Einfach mal googlen und du findest unendlich viele Links (Sogar bei Wikipedia). Leider kann ich dir keine speziellen Linkempfehlungen geben :(
 

spidermobile

Bekanntes Mitglied
Hi McLane,

ja das bei WiKi hab ich schon gesehen. Danke! So wie ich das lesen, ist wohl der "Backtracking-Algorithmus" der Schlüssel zum Erfolg. Hab mir überhaupt keine Ahnung, was das ist. Na dann werde ich jetzt mal goggle bemühen!

Hab mal gesucht. Es gibt wohl auch noch die "Brute-Force Methode". Aber das aind alles Bömische Dörfer für mich. Hier im Forum habe ich auch leider nichts passendes gefunden.

Gibt es da gar keine Lösungsansätze im Quellcode?
 

lin

Top Contributor
Naja Brute-Force ist halt einfach die Methode, dass du alle Möglichkeiten durchprobierst, ist aber nicht sonderlich elegant.

Gibt es da gar keine Lösungsansätze im Quellcode?
Hm, ich denke mal da muss man nicht sonderlich viel von Mathematik verstehen, nur n'bisserl was überlegen. Kannst ja zuerst mal nen Algorithmus schreiben, der ein einfaches Sudoku lösen kann.
 

spidermobile

Bekanntes Mitglied
Hallo Lin,

hört sich leichter an, als es für mich ist. Bin eigentlich kein Entwickler sondern lerne nur nebenher etwas Java. Hab auch schon kleinere Projekte gemacht, aber diese Form na ich will mal sagen von "KI" ist mir ganz ganz fremd. Dehlab wollte ich mal zur Anregung einen Codeschnipsel mit dem ich mich dan auseinander setzen kann!

Ich erwarte keine fertige Lösung!
 

McLane

Mitglied
Ich dachte eigentlich immer der Backtracking Algorithmus ist auch eine Brute-Force Methode, weil er sich zur Not alle Lösungswege anschaut, wenn er vorher keinen passenden gefunden hat.
Hierzu habe in meinen Sudoku eine kleine Optimierung eingebaut: Ich prüfe direkt nach dem Einfügen einer neuen Zahl, ob sie da stehen darf oder ob schon ein Widerspruch vorhanden ist. Ohne dieser "Zwischenabfrage" rechnet mein Programm ein Vielfaches länger (nämlich mehrere Minuten statt 10 Millisekunden)

Ich gebe dir mal hier meine Hauptmethode zur Lösung des Sudokus. Ich weiss zwar nicht, ob das sehr verständlich ist, weil ich es damals nur reingehackt habe, aber es ist besser als nichts :wink:

Code:
	private static boolean solveSudoku(
			int[][] problem, int nextX, int nextY) {
		
		boolean result = false;
		int x = nextX;
		int y = nextY;
		
		//Find next free field
		while (y < 9) {
			while (x < 9) {
				if (problem[y][x] != 0) {
					x++;
				}
				else {
					break;
				}				
			}
			if (x >= 9) {
				x = 0;
				y++;				
			}
			else if (problem[y][x] == 0) {
				break;
			}
		}
		
		//If Square is filled, check if it is correctly filled
		if ((nextY == 9) || (y == 9)) {
			return isLegalResult(problem);
		}

		for (int i = 1; i <= free[y].getSize(); i++) {
			int item = free[y].removeNth(i);
			
			problem[y][x] = item;
			
			if ((verticalsOK(x, problem)) && (squareOK(x, y, problem))) {
				if (x == 8) {
					result = solveSudoku(problem, 0, y + 1);								
				}
				else {
					result = solveSudoku(problem, x + 1, y);
				}
				if (result) {
					return true;
				}
				else {
					problem[y][x] = 0;
					free[y].add(item);
				}
			}
			else {
				problem[y][x] = 0;
				free[y].add(item);
			}
		}
		return false;
	}

Weiter ist noch zu erwähnen, dass die Variable free eine Sortierte Liste ist (musste ich selber implementieren), in der die Zahlen stehen, die noch in Zeile i eingefügt werden müssen.

Falls du willst schicke ich dir auch gerne mein ganzes Sudoku-Programm. Dann musst du mir nur deine eMail-Adresse per PN mitteilen
 

McLane

Mitglied
Da unerwarteterweise ziemlich viele Leute sich für meine Sudokulösung interessieren habe ich sie vorerst online gestellt.

Hier könnt ihr das Programm herunterladen:

www.informatik.uni-kiel.de/~dik/sudoku/Sudoku.zip

Eventuell werde ich es nach 2-3 Wochen löschen müssen, weil ich den Webspace für ein Praktikum bei uns an der Uni brauche, aber bis dahin könnt ihr es euch ersteinmal saugen.

Viel Spaß damit
McLane
 

McLane

Mitglied
SnooP hat gesagt.:
ich glaube das Problem ist np-vollständig ;)

So spontan haette ich das Gegenteil vermutet. Jedenfalls wenn man davon ausgeht, dass das Feld n*n Felder gross ist. Ich habe es mir allerdings nicht genau ueberlegt oder ausgerechnet.

Aber mich wuerde interessieren, worauf du mit deiner Aussage Bezug nimmst.
 

SnooP

Top Contributor
Das hat mein halb-blindes Informatikerauge mir verraten... - und ich kenne mich mit Sudoku auch nicht soo aus... aber nen google-link verrät dann auch mehr und bestätigt mein Auge ;)

http://www.americanscientist.org/template/AssetDetail/assetid/48550?&print=yes#48707

demnach ist das Backtracking nicht wirklich optimal... was ja aber auch nicht verwunderlich ist - gibt halt immer ne bessere Möglichkeit als Backtracking eigentlich ;)

und am obigen Algorithmusstücken kann man das auch schon ahnen... zum einen sind da ein quadratischer und ein linearer Bestandteil in dem if-Teil drinne (verticalsOK und squareOK) und danach wird das ganze rekursiv aufgerufen... abhängig von der Größe der Tabelle... - das stinkt ganz gewaltig nach np-hart *g*

und noch nen bissel hübscher stehts in diesem Paper:
http://www-imai.is.s.u-tokyo.ac.jp/~yato/data2/SIGAL87-2.pdf

hab damit übrigens überhaupt nicht bezug nehmen wollen, wollte nur verdeutlichen, dass es mehr oder weniger egal ist, wie der Algorithmus aussieht, es kann keinen geben, der wirklich effizient (sprich polynomial) ist...
 

McLane

Mitglied
Danke für die Links.

Die belegen wirklich, dass meine Vermutung falsch ist und das Problem NP-Vollständig ist.

Aber das Sudoku ist ja, jedenfalls bei 9 Ziffern, so klein, dass es schnell ausgerechnet werden kann.

Dennoch habe ich eine kleine Korrektur: verticalsOK und squareOK arbeiten bei mir beide linear (Ich weiß es tut nichts zur Sache, aber ich wollte es noch mal erwähnen).

Also nochmals vielen Dank für den Link und die zügige Antwort.
 

SnooP

Top Contributor
richtig - kleinere Sudokus sind noch relativ schnell zu berechnen - aber die Größe des Teils ist ja gerade das n - wenn das zunimmt wirds immer komplexer das zu berechnen.

und ich denke doch, dass squareOK quadratisch ist, oder? also O(n^2):
Code:
		for (int y1 = lty; y1 < (lty + 3); y1++) {
			for (int x1 = ltx; x1 < (ltx + 3); x1++) {
				int value = problem[y1][x1];
//...

aber das ist tatsächlich relativ egal - die Komplexität kommt alleine schon wegen der Rekursion zustande...
 

McLane

Mitglied
Auch wenn es egal ist, möchte ich die Linearität begünden (ich gebe allerdings zu, das es auf den ersten Blick nach quadratischer Laufzeit aussieht)

Wir haben ein Sudoku mit n Ziffern, daraus ergibt sich, dass ein einzelnes Quadrat Wurzel(n) lang ist und auch Wurzel(n) breit ist (im 9*9 Sudoku also Wurzel(9) = 3). Das muss auch so sein, weil in einem Quadrat n Ziffern stehen müssen (Das ist halt die Regel, die squareOK überprüft).
Da die beiden for-Schleifen Höhe mal Breite Schritte rechnen ergibt sich eine Laufzeit von

O(Wurzel(n) * Wurzel(n)) = O(Quadrat(Wurzel(n))) = O(n) - (Also lineare Laufzeit)

Wie schon gesagt es ist wirklich egal und tut nicht zur Sache, was die NP-Vollständigkeit angeht, aber ich habe gerne Recht :D
 

spidermobile

Bekanntes Mitglied
Hi Lin,

Hm, ich denke mal da muss man nicht sonderlich viel von Mathematik verstehen, nur n'bisserl was überlegen. Kannst ja zuerst mal nen Algorithmus schreiben, der ein einfaches Sudoku lösen kann.

ich kann es mir nicht verkneifen :wink: . Wenn das nichts mit höherer Mathematik zu tun hat, fresse ich einen Besen!
 

SnooP

Top Contributor
;) ... aber ich gebe gerne zu, dass du recht hast.. ich hatte nur nen oberflächlichen Blick auf den Code geworfen und nicht gesehen, wie sich die Grenzen der for-schleifen berechnen ;)... hast also gewonnen!

Aber Komplexitätsbetrachtung bei Algorithmen ist doch ganz prima on-topic oder? ;)
 

Bleiglanz

Gesperrter Benutzer
hmm

n = Anzahl der freien Felder

dann ist bei Backtracking die "Komplexität" doch O(9^n), weil das ja nix anderes ist als alle Möglichkeiten durchprobieren

aber weil man den Suchbaum bei diesem Problem wunderbar zusammenschlagen kann (wegen der "Einschränkungen") würde es mich nicht sooo stark wundern, wenn das doch polynomial wäre???

hat doch bestimmt schon jemand gelöst die Frage??

[edit] vergesst es, hab gerade die beiden oben verlinkten Papers gesehen
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Algorithmus für Arbeit mit fehlenden Listenelementen? Allgemeine Java-Themen 1
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
L Algorithmus für kürzesten Weg mit Wegpunkten Allgemeine Java-Themen 21
L Algorithmus für Poker-Hände Allgemeine Java-Themen 7
chik 2 return werte für Greedy-Algorithmus (gelöst) Allgemeine Java-Themen 3
M Algorithmus für automatische Zeilenumbrüche Allgemeine Java-Themen 12
C Algorithmus für Array Allgemeine Java-Themen 9
F Algorithmus für Sortierung gesucht Allgemeine Java-Themen 15
D Algorithmus für die Erkennung fehlerhafter Eingaben Allgemeine Java-Themen 4
schegga_B AES-Algorithmus in javax.crypto Allgemeine Java-Themen 3
M Laufzeit des Prim Algorithmus Allgemeine Java-Themen 3
O Newton Algorithmus Java Allgemeine Java-Themen 1
CptK Backpropagation Algorithmus Allgemeine Java-Themen 6
N Google Authenticator Algorithmus (SHA1) Allgemeine Java-Themen 1
gotzi242 Schatzsuche mithilfe eines O(log n) Algorithmus Allgemeine Java-Themen 2
Zrebna Quicksort-Algorithmus - zufälliges Pivot wählen Allgemeine Java-Themen 6
B Algorithmus Warteschlange Ringpuffer wirklich fehlerfrei Allgemeine Java-Themen 8
M Probleme mit Negamax-Algorithmus Allgemeine Java-Themen 29
F Q - Learning Algorithmus Bug Allgemeine Java-Themen 4
M Salesman Problem - Bruteforce Algorithmus Allgemeine Java-Themen 23
M Minmax Algorithmus Verständnisproblem Allgemeine Java-Themen 2
H Rundreise frage (Algorithmus) Allgemeine Java-Themen 18
F KMP-Algorithmus Allgemeine Java-Themen 9
S Algorithmus welcher True-Werte in einem Array findet und auswertet. Allgemeine Java-Themen 5
U Methoden Algorithmus MergeSort String [ ] array sortieren programmieren Allgemeine Java-Themen 17
P MinMax Algorithmus Allgemeine Java-Themen 0
J Abhängigkeit zwischen Rechenzeit und Speicherbedarf in einen Algorithmus Allgemeine Java-Themen 7
K Djikstra-Algorithmus Allgemeine Java-Themen 1
T Minimax/Alphabeta Algorithmus hängt sich auf (?) Allgemeine Java-Themen 2
M Algorithmus zum Zahlen einteilen Allgemeine Java-Themen 8
O Best Practice Hilfe bei Algorithmus gesucht Allgemeine Java-Themen 10
S Algorithmus um Objekte auf einer Flaeche mit gleichem Abstand anzuordnen..? Allgemeine Java-Themen 20
S Rucksackproblem und genetischer Algorithmus Allgemeine Java-Themen 9
L Abbruch des Algorithmus Allgemeine Java-Themen 8
D Input/Output Ausgleichen chemischer Reaktionsgleichungen mit dem Gauß-Algorithmus Allgemeine Java-Themen 2
Messoras A*-Algorithmus integrieren Allgemeine Java-Themen 3
S Buchscan 3D Dewarp Algorithmus - Ansätze Allgemeine Java-Themen 1
B Verteilungs-/Vergabe-Algorithmus mit abhängigen Score-Werten Allgemeine Java-Themen 3
Androbin "Shunting Yard"-Algorithmus Allgemeine Java-Themen 6
B Algorithmus - Project Euler Problem 18 Allgemeine Java-Themen 2
N Algorithmus zum bewerten von mathematischen Funktionen Allgemeine Java-Themen 11
O Algorithmus Optimierung Allgemeine Java-Themen 3
Joew0815 Algorithmus - Zahlenfolge in 4 ähnliche Teile aufteilen Allgemeine Java-Themen 0
O Tag Cloud Algorithmus Idee gesucht Allgemeine Java-Themen 2
A Implementierung eines Algorithmus (Farthest Insertion zur Lösung des TSP) in O(n²) Allgemeine Java-Themen 2
C Eclipse Probleme bei selbst erstelltem Algorithmus Allgemeine Java-Themen 2
H Graph-Algorithmus gesucht Allgemeine Java-Themen 21
N Algorithmus durch Workflow Allgemeine Java-Themen 7
M tree-based diff Algorithmus (Code-Vergleiche) Allgemeine Java-Themen 3
S Uhrzeit Algorithmus sale Allgemeine Java-Themen 11
N A*-Algorithmus Allgemeine Java-Themen 5
A Suche Algorithmus zum Erstellen eines planaren Graphen Allgemeine Java-Themen 5
F Methoden Algorithmus zur Gegnerfindung (Turnier) Allgemeine Java-Themen 9
T Algorithmus Graph Allgemeine Java-Themen 10
J Algorithmus gesucht (Stringtransformation) Allgemeine Java-Themen 4
B Algorithmus Krankenhausbelegung Allgemeine Java-Themen 17
S Algorithmus von Dijkstra Allgemeine Java-Themen 2
alex_fairytail OOP Banknoten Algorithmus Teil 2 Allgemeine Java-Themen 13
2 ArrayList aktualisieren Algorithmus Allgemeine Java-Themen 11
alex_fairytail Methoden Banknoten Algorithmus Allgemeine Java-Themen 10
R Codehinweise: Algorithmus Größenvergleich von n Zahlen Allgemeine Java-Themen 5
SuperSeppel13 WTF?! Algorithmus-Geschwindigkeitstest Allgemeine Java-Themen 2
C Algorithmus Problem in Minesweeper Allgemeine Java-Themen 5
S Algorithmus um Labyrinth zu erzeugen Allgemeine Java-Themen 6
V Problem mit A* Pathfinder-Algorithmus Allgemeine Java-Themen 2
S Algorithmus um nächst folgende Primzahl zu berechnen Allgemeine Java-Themen 7
S Algorithmus Problem. Rechtecke effizient auf Spielfeld anordnen. Allgemeine Java-Themen 7
C Algorithmus-Hilfe Allgemeine Java-Themen 20
J Algorithmus Längenkombinationen? Allgemeine Java-Themen 7
M Kombinationen über rekursiven Algorithmus berechnen? Allgemeine Java-Themen 10
D Abstruse Probleme mit eigenem replace Algorithmus Allgemeine Java-Themen 11
P RC4 Algorithmus Allgemeine Java-Themen 3
D RSA Verfahren - Erweiterter Euklidischer Algorithmus Allgemeine Java-Themen 4
C IBAN und Bic Validieren (Algorithmus) Allgemeine Java-Themen 10
P Problem mit A*-Algorithmus Allgemeine Java-Themen 12
M Wörter Algorithmus Allgemeine Java-Themen 7
K Postleitzahlen Algorithmus Allgemeine Java-Themen 12
G Problem mit Algorithmus Allgemeine Java-Themen 3
T Hilfe bei einem Algorithmus Allgemeine Java-Themen 2
S Stemming-Algorithmus gesucht (z.B. Porter) Allgemeine Java-Themen 2
RoliMG präfix zu infix algorithmus Allgemeine Java-Themen 6
Z A*-Algorithmus - Probleme mit offener/geschlossener Liste Allgemeine Java-Themen 7
S Javaimplementierung des MD5 Algorithmus Allgemeine Java-Themen 2
E Container-Pack-Algorithmus Allgemeine Java-Themen 4
G k nearest neighbor algorithmus Allgemeine Java-Themen 7
C HASH Algorithmus 2 Strings ergeben das Selbe. Allgemeine Java-Themen 2
P Page Rank Algorithmus implementieren Allgemeine Java-Themen 7
T Problem RSA-Algorithmus in Java? Allgemeine Java-Themen 2
minzel Hash-Algorithmus Allgemeine Java-Themen 9
Y komprimierung mittels Huffman-Algorithmus, bit-shifting. Allgemeine Java-Themen 2
K Algorithmus Allgemeine Java-Themen 10
I Verschlüsselung mit Pwd. - User soll Algorithmus wählen Allgemeine Java-Themen 4
J fällt euch ein Algorithmus ein? Allgemeine Java-Themen 4
N Euklidischer Algorithmus in Java und keine Terminierung. Allgemeine Java-Themen 7
T Algorithmus verbessern Allgemeine Java-Themen 10
U Suche Algorithmus zur bestimmung des längsten Wegs Allgemeine Java-Themen 3
U Ford-Fulkerson Algorithmus gesucht Allgemeine Java-Themen 1
U Dijkstra Algorithmus gesucht Allgemeine Java-Themen 4
I hash-algorithmus Allgemeine Java-Themen 9
kodela Eingabe für TextArray bedingt sperren Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben