Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Sortieren und kombinieren von Längen (https://www.delphipraxis.net/160816-sortieren-und-kombinieren-von-laengen.html)

andone68 9. Jun 2011 06:30

AW: Sortieren und kombinieren von Längen
 
@jfheins:
Danke für den Tipp. Tatsächlich ist es das Untermengen-Problem. Wäre nie darauf gekommen dass das ein berümtes Problem der Informatik ist. Leider gibt es im i-net sehr wenig Infos darüber.
Bisherige interessante Links(abgesehen von deinen) sind:
http://www.clausbrod.de/cgi-bin/view...MacroSubsetSum
http://contest.spieleprogrammierer.de/06/

@Jens
Im i-net googeln ist eins, aber Nägel mit Köpfen machen ist was anderes.
Habe bisher leider noch nix (mit Delphi) machen können ausser deinen Code zu überfliegen. Verstanden hab ich den Schleifenaufbau noch nicht ganz aber das kommt bestimmt wenn ich am Wochenende mal wieder Zeit fürs programmieren habe. Wie die Objekte aussehen sollen ist mir auch noch schleierhaft, das kommt aber nur daher weil ich mir nie selber welche definiere. Vielleicht hast du da noch einen Tipp. Dann könnte ich schneller ein Testprogramm schreiben und dir ne Rückmeldung geben.

Gruß
andone68

Jens01 9. Jun 2011 10:53

AW: Sortieren und kombinieren von Längen
 
Morgen andone68,

ich habe mein altes Programm mal auseinandergenommen, was nicht so einfach (und zeitaufwendig!) war. Es war eben noch TP 7 und ich selbst habe damals noch nicht so sauber programmiert. Es lieferte aber dieselben Ergebnisse wie ein teures Profiprogramm.
Ich habe Sonntag und Montag versucht das auf Objektlisten umzustellen, was aber nicht so einfach war. Durchdenk Dir das Problem noch mal, dann guckn wir gemeinsam.

Gruss Jens

P.S.: Der Trick daran ist, dass vorab nach Große sortiert wird, die Kombinatorik wird dadurch um ein vielfaches vereinfacht. Es kommt aber trotzdem ein gutes Ergebnis raus.

andone68 12. Jun 2011 12:55

AW: Sortieren und kombinieren von Längen
 
Konnte jetzt endlich weitermachen und hab als erstes mal die Beispielliste sortiert

Delphi-Quellcode:
unit KombiMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

type TListe = record // Teilstück
    Lg  : Integer;  // Länge
    Bez : String;   // Bezeichnung
  end;


var
  Form1: TForm1;

  // Listen der Teilstücke
  OListe: array of TListe; // Originalliste (also so wie eingegeben/unsortiert)
  SListe: array of TListe; // Sortierte Liste
 
implementation

{$R *.dfm}

Procedure ListeEinlesen;
begin
  SetLength(oListe, 1); oListe[ 0].Lg:=86; oListe[ 0].Bez:='1/1';
  SetLength(oListe, 2); oListe[ 1].Lg:=41; oListe[ 1].Bez:='2/1';
  SetLength(oListe, 3); oListe[ 2].Lg:=58; oListe[ 2].Bez:='2/2';
  SetLength(oListe, 4); oListe[ 3].Lg:=87; oListe[ 3].Bez:='2/3';
  SetLength(oListe, 5); oListe[ 4].Lg:=86; oListe[ 4].Bez:='2/4';
  SetLength(oListe, 6); oListe[ 5].Lg:=78; oListe[ 5].Bez:='2/5';
  SetLength(oListe, 7); oListe[ 6].Lg:=86; oListe[ 6].Bez:='2/6';
  SetLength(oListe, 8); oListe[ 7].Lg:=77; oListe[ 7].Bez:='2/7';
  SetLength(oListe, 9); oListe[ 8].Lg:=83; oListe[ 8].Bez:='2/8';
  SetLength(oListe,10); oListe[ 9].Lg:=90; oListe[ 9].Bez:='3/1';
  SetLength(oListe,11); oListe[10].Lg:=44; oListe[10].Bez:='3/2';
  SetLength(oListe,12); oListe[11].Lg:=57; oListe[11].Bez:='3/3';
  SetLength(oListe,13); oListe[12].Lg:=73; oListe[12].Bez:='3/4';
  SetLength(oListe,14); oListe[13].Lg:=72; oListe[13].Bez:='3/5';
  SetLength(oListe,15); oListe[14].Lg:=65; oListe[14].Bez:='3/6';
  SetLength(oListe,16); oListe[15].Lg:=65; oListe[15].Bez:='3/7';
  SetLength(oListe,17); oListe[16].Lg:=64; oListe[16].Bez:='3/8';
  SetLength(oListe,18); oListe[17].Lg:=60; oListe[17].Bez:='3/9';
  SetLength(oListe,19); oListe[18].Lg:=73; oListe[18].Bez:='3/10';
  SetLength(oListe,20); oListe[19].Lg:=72; oListe[19].Bez:='3/11';
end;

procedure SortiereListe;
var i,j,k : Integer;
   LgTemp : integer;
   BezTemp : string;
   N : Integer; // Anzahl Listeneinträge
begin

  n:=Length(oListe);
  SetLength(sListe,n);

  for i:=1 to n do begin // sliste:= oListe (kopieren)
    sListe[i-1].Lg := oListe[i-1].Lg;
    sListe[i-1].Bez := oListe[i-1].Bez;
  end;

  // BubbleSort
  For i:=0 to N-2 do begin
 
     k := i; // Position des größten Elementes initialisieren
     For j := i+1 to N-1 do // Nun wird das größte Elemente im Array [i..N-1]
       If sListe[k].Lg < sListe[j].Lg Then// gesucht und in k die Position gemerkt
         k := j; // '<' mit '>' vertauschen, wenn AUFsteigend sortiert wird.
                       // k enthält die Position des größten Elementes [i..N]

     If i <> k then Begin// Vertauschen

       LgTemp := sListe[i].lg;
       sliste[i].Lg := sliste[k].Lg;
       sliste[k].Lg := LgTemp;

       BezTemp := sListe[i].Bez;
       sliste[i].Bez := sliste[k].Bez;
       sliste[k].Bez := BezTemp;

     End;

   End;
   
end;


procedure TForm1.FormCreate(Sender: TObject);
Var s : string;
    i : Integer;
    n : Integer;
    t : String;
begin

  ListeEinlesen;

  SortiereListe; // sListe ist jetzt sortiert

  n:=Length(oListe);
  t:='';
  for i:=0 to n-1 do begin
    Str(oliste[i].Lg,s);
    t:=t+s+' - '+oListe[i].Bez+chr(10);
  end;
  Label1.Caption:=t;

  t:='';
  for i:=0 to n-1 do begin
    Str(sliste[i].Lg,s);
    t:=t+s+' - '+sListe[i].Bez+chr(10);
  end;
  Label2.Caption:=t;

end;

end.
Jetzt muss ich "nur noch" deinen Code testen
Wie er funktioniert hab ich zwar immer noch nicht ganz verstanden, werde mich aber dazu noch melden.

Jens01 12. Jun 2011 22:29

AW: Sortieren und kombinieren von Längen
 
TList oder TObjectList hat eine Sortiermethode Sort. Wie diese genau functioniert steht in einigen Forenbeiträgen drin. Welche Delphiversion benutzt Du?
http://www.delphipraxis.net/48466-tobjectlist.html

Sir Rufo 13. Jun 2011 00:30

AW: Sortieren und kombinieren von Längen
 
Zitat:

Zitat von Jens01 (Beitrag 1106009)
Welche Delphiversion benutzt Du?

Wenn man das eigene Profil entsprechend bestücken würde, dann wäre diese Frage überflüssig :roll:

andone68 13. Jun 2011 19:57

AW: Sortieren und kombinieren von Längen
 
Benutze Delphi 6PE
Profil wird ausgeüllt, Danke für den Hinweis


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:45 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz