AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi optimieren einer Prozedur die ein Sudoku lösen kann
Thema durchsuchen
Ansicht
Themen-Optionen

optimieren einer Prozedur die ein Sudoku lösen kann

Ein Thema von Melvyn · begonnen am 11. Mai 2009 · letzter Beitrag vom 12. Mai 2009
Antwort Antwort
Seite 2 von 2     12   
Melvyn

Registriert seit: 10. Mai 2009
13 Beiträge
 
#11

Re: optimieren einer Prozedur die ein Sudoku lösen kann

  Alt 11. Mai 2009, 20:23
mmh das kann sein. ich bin sehr ungeduldig... allerdings kann es auch sein das mein rechner dafür zu lahm ist.
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#12

Re: optimieren einer Prozedur die ein Sudoku lösen kann

  Alt 11. Mai 2009, 20:28
Okay, ich hab mir den Wikipediaeintrag jetzt nicht ganz durchgelesen. Aber wäre es nicht grundsätzlich besser, das Problem auf lineare Gleichungssysteme zu bringen (jedes leere Feld ist eine Variable) und dann einen Gaußalgorithmus zur Lösung zu verwenden. Ich denke, das sollte deutlich schneller gehen als 30-40 Minuten
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#13

Re: optimieren einer Prozedur die ein Sudoku lösen kann

  Alt 11. Mai 2009, 20:34
Also mein Brute-Force Algorithmus klappt bei sehr vielen Rätseln - und auch recht schnell (bis auf einige ausnahmen). Das Programm (ist schon vier Jahre alt) findet sich hier. Der Quelltext ist recht gut kommentiert. Vielleicht hilft es ja bei der Lösung des Problems:

http://www.delphipraxis.net/internal...ct.php?t=70493

Edit:
Normalerweise würde ich heutzutage das Rätsel über einen binären Baum lösen.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#14

Re: optimieren einer Prozedur die ein Sudoku lösen kann

  Alt 11. Mai 2009, 22:06
Meine Variante besitzt zwei unterschiedliche Lösungsalgorithmen klick
  Mit Zitat antworten Zitat
Gravitar

Registriert seit: 8. Okt 2006
94 Beiträge
 
Delphi 7 Enterprise
 
#15

Re: optimieren einer Prozedur die ein Sudoku lösen kann

  Alt 12. Mai 2009, 14:56
Zitat von Melvyn:
mmh das kann sein. ich bin sehr ungeduldig... allerdings kann es auch sein das mein rechner dafür zu lahm ist.
So wie ich das sehe gehst du Feld für Feld von links oben nach rechts unten vor und versuchst über Brute-Force/Backtracking eine Lösung zu finden.

Das kann in der Tat sehr lang dauern.

Ich habe ebenfalls einen Brute-Force-Algorithmus entwickelt, der allerdings nicht stumpf die Felder von links nach rechts abarbeitet, sondern sich in der jeweiligen Rekursionsstufe immer das Feld sucht, in dem die geringsten Antwortmöglichkeiten existieren.

Wenn man so vorgeht, liegt die Antwortzeit im Millisekundenbereich. Meine längste Lösungszeit lag glaube ich bei 197 Millisekunden. I.d.R. liegt die Lösung allerdings in 18 Millisekunden vor.

Das müßte auch für ungeduldige ausreichen

Gruß, Andreas
  Mit Zitat antworten Zitat
Melvyn

Registriert seit: 10. Mai 2009
13 Beiträge
 
#16

Re: optimieren einer Prozedur die ein Sudoku lösen kann

  Alt 12. Mai 2009, 19:10
hmm es funktioniert schon so wie ich es hatte ich hatte bloß ein sehr schweres Sudoku genommen für das er sehr lange gebraucht hätte. mit einem einfachen is die lösung auch innerhalb von ms da.

weil ich dieselbe prozedur auch für ein Mojidoku möchte, hab ich die ausgabe zeile verändert:
StringGrid1.Cells[x,y]:=chr(ord(S[SIndex(x,y)].a)+26); allerdings müsste ich dann ja immernoch zahlen eingeben. ich möchte aber auch buchstaben eingeben können.
Müsste das dann so lauten? :
StringGrid1.Cells[x,y]:=chr(ord(S[SIndex(x,y)].a)-26); meine frage ist jetzt wo ich diese zeile platzieren müsste.
die prozedur ist:
Delphi-Quellcode:
procedure TForm1.BitBtn6Click(Sender: TObject);
var x,y,bes:integer;
    n:string;
    function SIndex(x,y:integer):integer; begin result:= (x+(y*9))+1; end;
begin
 Start();
 for y:=0 to 8 do
  for x:=0 to 8 do
   begin
    bes:=Bestaetigen(StringGrid1.Cells[x,y]);
    if bes>0 then
     begin
      if WertSetzen(SIndex(x,y), bes) then
       begin
        S[SIndex(x,y)].a:=bes;
        S[SIndex(x,y)].b:=false;
       end else
       begin
        MessageBox(self.Handle, 'Falsche Eingabe!','Bitte erneut eingeben', mb_iconerror);
        exit;
       end;
     end else
      if bes<0 then
       begin
        n:='Ungültige Eingabe:' + StringGrid1.Cells[x,y];
        MessageBox(self.Handle, pchar(n), 'Fehler', mb_iconerror);
        exit;
       end;
   end;
 Loesen();
 for y:=0 to 8 do
  for x:=0 to 8 do
   StringGrid1.Cells[x,y]:=chr(ord(S[SIndex(x,y)].a)+26);
end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz