Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi optimieren einer Prozedur die ein Sudoku lösen kann (https://www.delphipraxis.net/133888-optimieren-einer-prozedur-die-ein-sudoku-loesen-kann.html)

Melvyn 11. Mai 2009 17:39


optimieren einer Prozedur die ein Sudoku lösen kann
 
Hallo Leute,

ich bin gerade dabei einen Sudokulöser mit Delphi7 zu schreiben. Er lässt sich bereits starten, aber funktioniert noch nicht obwohl Delphi keinen Fehler anzeigt. Kann mir jemand helfen den Fehler im Quelltext zu suchen?

Danke bereits im Vorraus
Melvyn

DeddyH 11. Mai 2009 17:44

Re: Hilfe gesucht!
 
Dazu kann ich nur sagen: viel Glück.

Melvyn 11. Mai 2009 17:47

Re: Hilfe gesucht!
 
was meinst du?

Mithrandir 11. Mai 2009 17:47

Re: Hilfe gesucht!
 
Und wieder einer, der den Sinn eines Internetforums nicht erkannt hat. Hängt hier irgendwo ein Schild? :gruebel:


Btw,

Willkommen :dp:

//Edit:
Smiley repariert.
:roll:

Melvyn 11. Mai 2009 17:53

Re: Hilfe gesucht!
 
Ja, ich kenne den Sinn eines Forums. Aber den ganzen Quelltext zu diskutieren hat wenig Sinn...

Aber eine Frage: Kannst du mir helfen?

shmia 11. Mai 2009 17:56

Re: Hilfe gesucht!
 
Zitat:

Zitat von Melvyn
(Ich verschicke dann Quelltext und Screen per Mail, da ich vor der Fertigstellung des Programms den Quelltext nicht veröffentlichen möchte)

So geht das nicht.
Niemand möchte ein nichtfunktionierendes Sudokuprogramm nach Fehlern durchsuchen und die Kommunikation über EMail führen.
(und auch noch seine EMail-Adresse preisgeben)
Du stellst möglichst konkrete Fragen und bietest dafür so viel Information wie nötig.
Im optimalen Fall lieferst du ein halbfertiges Programm mit Sourcecode und bekommst dafür Tipps und Hilfe.
Hier im Forum entsteht dann ein mehr oder weniger funktionierendes Programm von dem Jeder profitieren und lernen kann.
>> Aber den ganzen Quelltext zu diskutieren hat wenig Sinn
Man kann jedes Problem in Teilprobleme zerlegen und du darfst auch gerne den gesamten Sourcecode (bitte ohne DCU und ~*-Dateien) als Zip-Archiv anhängen.

Mithrandir 11. Mai 2009 17:58

Re: Hilfe gesucht!
 
Zitat:

Zitat von Melvyn
Aber eine Frage: Kannst du mir helfen?

Bestimmt. So wie viele andere hier. Stelle den Quelltext rein, warte, bis jemand (oder mehrere) Zeit und Lust gefunden hat, da mal einen Blick drauf zu werfen, und schwuppdiewuppdi ist anderen Neulingen auch geholfen. ;)

Privataudienzen gibts natürlich auch, allerdings nur gegen Gebühr. ;)

Sorry, aber auf die Art und Weise nach Hilfe fragen ist kein guter Start in einem Forum. Erstelle einen neuen Thread unter "Open-Source" mit deinem Programm.

DeddyH 11. Mai 2009 17:59

Re: Hilfe gesucht!
 
Bei der Gelegenheit könntest Du gleich den ersten Beitrag editieren und einen anderen Titel wählen, der das Problem zumindest im Ansatz beschreibt (Hilfe suchen hier so ziemlich alle ;))

Melvyn 11. Mai 2009 18:18

Re: optimieren einer Prozedur die ein Sudoku lösen kann
 
Gut dann werd ich mal konkretisieren. Die Lösen-Funktion des Sudokus funktioniert noch nicht. Beim drücken des Buttons zur laufzeit hängt sich das programm dann auf. Im moment sieht diese Prozedur jetzt so aus:

Delphi-Quellcode:
procedure TForm1.BitBtn3Click(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]:=IntToStr(S[SIndex(x,y)].a);
end;
die ausgabe hab ich dann noch für mojidoku umegebastelt, aber auch das funktioniert noch nicht
Delphi-Quellcode:
StringGrid1.Cells[x,y]:=chr(ord(S[SIndex(x,y)].a)+26);
Loesen() ist eine eigenständige Prozedur
Delphi-Quellcode:
procedure Loesen();
var
 c:integer;
begin
 c:=1;
  while c<=81 do
   begin
    if S[c].b then
     begin
      if S[c].a<9 then
       begin
        inc(S[c].a);
        if WertSetzen(c,S[c].a) then
         begin
          inc(c);
         end else
         if S[c].a=9 then
          repeat
           if S[c].b then S[c].a:=0;
           dec(c);
           if S[c].b then WertFreigeben(c,S[c].a);
          until S[c].b
         end else
         begin
          WertFreigeben(c,S[c].a);
          repeat
           if S[c].b then S[c].a:=0;
           dec(c);
           if S[c].b then WertFreigeben(c,S[c].a);
          until S[c].b
         end;
      end else inc(c);
   end;
end;
so ich hoffe ihr könnt mir helfen. ich habe anfangs eine offene schleife vermutet aber keinen anhaltspunkt dafür gefunden.

[edit=mkinzler]Code-Tags durch Delphi-Tags ersetzt Mfg, mkinzler[/edit]

shmia 11. Mai 2009 18:58

Re: optimieren einer Prozedur die ein Sudoku lösen kann
 
Das sieht für mich aus wie ein Brute-Force Algorithmus.
Dabei sind mal so ganz grob ~ 600 Mio. Lösungsschritte notwendig.
Im englischen Wikipedia wird berichtet, dass diese Lösungsstrategie ca. 30 bis 45 Min benötigt.
http://en.wikipedia.org/wiki/Algorit...y_backtracking


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:39 Uhr.
Seite 1 von 2  1 2      

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