Einzelnen Beitrag anzeigen

Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#24

AW: Schleifen wiederholen

  Alt 25. Okt 2020, 13:58
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.
  Mit Zitat antworten Zitat