Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8858[/thread]

RDW 2007/7: Sudokulöser (Seite 2)

Leser: 2


<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten
Taulmarill
 2007-03-23 12:54
#75205 #75205
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
[quote=docsnyder,21.03.2007, 14:15]Na, ja, so ganz einfach ist bruteforce auch nicht: bis 9 Schleifen mit einem Laufindex von jeweils 362880 (wenn man das mit Permutationen von 123456789 macht) abgearbeitet sind, werden wir alt sein. Man muss sich schon überlegen, wie man die Geschichte sinnvoll abkürzt.[/quote]
Ich hab jetzt eine Brute-Force Lösung, die für das schwierigste SuDoKu, was ich finden konnte, 83 Sekunden braucht. Wobei der Algorithmus nicht stoppt, wenn eine Lösung gefunden wurde, um damit auch SuDoKus auf Lösbarkeit testen zu können. Allerdings habe ich auch mit Hilfe von Devel::DProf so weit optimiert wie es nur ging.

Ich werde nachher noch mal einen Ansatz mit RegEx testen. Mal schauen, ob ich das noch schneller bekomme...
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
docsnyder
 2007-03-23 13:23
#75206 #75206
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@Taumarill

Kannst Du bitte die Anfangsbelegung Deines schwierigen Sudokus posten?

Würde es gerne mal durch mein Script jagen.

Gruss, Doc
Taulmarill
 2007-03-23 14:27
#75207 #75207
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
5......169....7.......38....79........3.2.9........54....97.......3....768......1

Wenn jemand was mit weniger Vorgaben findet, kann er ja gerne mal posten. Ich bin übrigens überzeugt davon, dass es intelligentere Methoden, als meine gibt. Ich wollte nur gerne eine möglichst performante Brute-Force Lösung haben, um damit SuDoKus auf ihre Lösbarkeit hin zu testen. Die Idee ist halt, dass ein SuDoKu nicht lösbar ist, wenn mein Programm keine Lösung findet. Ferner sind SuDoKus nicht vollständig logisch lösbar, wenn es mehrere gültige Lösungen gibt.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
docsnyder
 2007-03-23 15:36
#75208 #75208
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@Taumarill

Gratuliere, mein Script braucht ganze 21 Minuten.

Muss da wohl noch optimieren ;o)

Gruss, Doc
Taulmarill
 2007-03-23 17:00
#75209 #75209
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Dann streng dich mal an, ich hab mich auf 65 Sekunden verbessert. Allerdings ist das natürlich auch Prozessorabhängig. Ich glaub das hier ist ein AMD 64 3700+ auf dem ich arbeite.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
topeg
 2007-03-23 17:57
#75210 #75210
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Mein halbfertiges braucht dafür eine Minute. (1GHz mit 512Mb RAM)\n\n

<!--EDIT|topeg|1174665581-->
Taulmarill
 2007-03-23 22:45
#75211 #75211
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Dann hast du dir wohl was schlaueres als Brute-Force einfallen lassen, oder? :)

Btw. bin jetzt bei 60 Sekunden...
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Taulmarill
 2007-03-27 19:08
#75212 #75212
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
So, meine Lösung ist raus und ich bin recht zufrieden. Die meisten Sudokus schafft es in unter einer Sekunde (auch das o.a.). Das einzige Sudoku, was noch länger braucht (c.a. 10 Sekunden) ist folgendes
........1.....2.3...4..5..........5......46...17.8........1...7.2.9.....5.....4..
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
docsnyder
 2007-03-30 16:29
#75213 #75213
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Bin nochmal in mich gegangen und habe eine optimierte Lösung gebastelt und eingereicht.

@Taumarill

Ich liege bei der Eingabe von

Code: (dl )
........1.....2.3...4..5..........5......46...17.8........1...7.2.9.....5.....4..

bei 11 Sekunden auf einer Sun Ultra-250 (zugegeben, ein älteres Modell) und 3 Sekunden auf einer Sun-Fire-V240. Die Performance auf einem PC habe ich noch nicht getestet, aber das Ergebnis wird irgendwo dazwischen liegen.

Alle übrigen Eingaben, die ich getestet habe, liegen (wie bei Deiner Lösung) deutlich unter einer Sekunde.

Allerdings ist der Code auch deutlich länger geworden als der meiner ersten Lösung (die hatte nur 88 Zeilen inkl. Leerzeilen).

Ich wünsche ein schönes Wochenende!

Gruss, Doc
docsnyder
 2007-03-30 21:43
#75214 #75214
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Also, hab's nochmal gebenchmarked:

Bei der Eingabe von

Code: (dl )
........1.....2.3...4..5..........5......46...17.8........1...7.2.9.....5.....4..

benötigt meine optimierte Lösung auf einem Celeron, 1,3 GHz, 512 MB nur 3 Sekunden. Alles andere von mir getestete unter 1 Sekunde.

Gruss, Doc
<< |< 1 2 3 >| >> 26 Einträge, 3 Seiten



View all threads created 2007-03-21 03:24.