Einzelnen Beitrag anzeigen

Kegasetu

Registriert seit: 26. Sep 2013
85 Beiträge
 
#4

AW: Alle Kombinationen ausgeben

  Alt 10. Nov 2020, 11:53
Hallo K

in https://www.delphipraxis.net/1476191-post36.html

habe ich dir gezeigt wie du ohne tief greifende Kombinatorik alle möglichen Kombinationen durchlaufen kannst und dabei gleich noch eine beste (oder wenn du willst auch alle) Lösung finden kannst.

Du kannst das rekursiv tun. Nimm an, du hast n Positionen und k Dinge die du reinhängen willst.
Du gehst alle möglichen (Brett-)Positionen von links nach rechts durch. Bei jeder Position gibt es genau zwei Möglichkeiten: Du machst entweder nix oder du hängst was rein. Du gehst eine Position weiter - und wieder das gleiche Spiel: nix tun oder was tun. und so weiter...

Wann brichst du ab? Es gibt zwei Abbruchkriterien:
Fall 1: Sobald du k Mal was getan hast bist du fertig und bewertest diese Kombination.
Fall 2: Du brichst ab sobald du weisst, dass du noch i Mal was tun müsstest, aber nur noch p<i Positionen frei sind.

Natürlich gibt es schönere Wege alle Kombinationen aufzuzählen. Aber dieser Weg ist für dich sicher nachvollziehbar.

Probier's mal aus...

Gruss
M
Danke für den Code, aber ich komme nicht so ganz damit klar...

Ich würde jetzt gerne die Stelle aufzeigen, aber es sind so viele.

Was beduetet z.B. record? Oder wie genau funktionert das:

Delphi-Quellcode:
 TRes = record
      br : TBrett;
      bew : TBewertungstyp;
     end;
Ich habe schon den Anspruch zu verstehen was ich da mache aber so ganz tief bin ich nicht in der Materie. Ich versuche es so einfach wie möglich zu machen, damit ich immer erklären kann was da passiert. Und die Hoffung des es irgendwie mit einem simplen Array funktionert ist nach wie vor da

Hier mal meine Überlegung, die so noch nicht funktionert:

Delphi-Quellcode:
var i, q, durch : integer;
variation [0..200]: Array of Integer; //Array definieren, maximaler Bereich von 200

begin

for i:= 0 to strtoint(edit1.Text) do // Anzahl der Halterungen
 variation [i] := i; //Hier das Array füllen


for q:= strtoint(edit1.Text) to strtoint(edit2.Text) do //Hier wird die Bereichgröße (edit2) eingegeben (später ist das in der Rechnung integriert und richtet sich nach der Länge des Balkens)
 begin
   variation [strtoint(edit1.Text)] := variation [strtoint(edit1.Text)+q] //der Letzte Wert wird hochgezählt und dann ausporbiert.Hier bin ich momentan und komme nicht weiter. Die Vorgehensweise ist auch falsch.
 end;
end;
Um es Verbal zu beschreiben , in der zweiten for Schleife sollen dann alle Kombinationen erstellt und im Anschluss ausprobiert werden.
  Mit Zitat antworten Zitat