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.