Ich weiß, spezifischer Ratschlag (oder gar Code) kommt immer besser an, als allgemeiner, aber ich probiere es mal
Ein passendes Sprichwort: "In der Informatik gibt es nur drei sinnvolle Maße: 0, 1 oder beliebig viele" (
https://de.wikipedia.org/wiki/Zero_One_Infinity)
Insofern solltest du hier versuchen, beliebig viele Halterungen zuzulassen. Fassen wir also die Aufgabenstellung zusammen:
- Es gibt 1 Brett der Länge l
- Es gibt n Halterungen an n Stellen
Für letzteres solltest du ein dynamisches Array verwenden.
Dann kannst du in deiner Rechnung jeden Punkt separat verschieben. Eine Möglichkeit wäre z.B. sowas:
Delphi-Quellcode:
procedure Vary(Brettdaten: TBrettData; Punkte: Array of Double, idx: Integer);
var
AlterWert: Double;
begin
if (idx > Length(Punkte)) begin
Solve(Brettdaten, Punkte)
end
// Variiere nur einen Punkt hier
AlterWert := Punkte[idx];
Punkte[idx] := AlterWert - 0.1;
Vary(Brettdaten, Punkte, idx + 1);
Punkte[idx] := AlterWert;
Vary(Brettdaten, Punkte, idx + 1);
Punkte[idx] := AlterWert + 0.1;
Vary(Brettdaten, Punkte, idx + 1);
end;
Nebenbei möchte ich aber anmerken, dass du da ein relativ schlechtes Verfahren implementierst. Du machst noch nicht mal gradient descent, sondern zuppelst jede Dimension um 0.1 (Woher der Wert kommt ....
) und hoffst, dass du damit was erwischst ^^
Ein besseres Verfahren ist
gradient descent, wo du für deinen Vektor (also alle n Lager) eine Ableitung berechnest (also
wie stark Richtung Optimum bringen mich hier 0.1 ?) und dann in Richtung dieses Gradienten läufst.
Und
noch besser wird das ganze, wenn du dein Problem in eine gängige Matrix-form bringen kannst, weil dann kannst du auf ungemein viele und gute Löser zurückgreifen.