AW: Schleifen wiederholen
Zitat:
|
AW: Schleifen wiederholen
Zitat:
|
AW: Schleifen wiederholen
[***H***|***H***|***H***]
Joar, wenn der Balken grade ist und sich nicht biegt, dann passt es ja. Bei Biegen müsstest du aber an den |-Stellen ein Gelenk einbauen*1, da sich die dort zusammenlaufenden Biegungen gegenseitig beeinflussen*2, aber das lässt sich bestimmt auch direkt berechnen, ohne Schleifchen. *1 um diesen Effekt zu eliminieren *2 sich durch das gegenläufige Biegemoment hochheben, während die Enden weiter runter hängen, die äußeren H als Drehpunkt nutzen und die Mitte bissl "leichter" wird. :freak: Kommt blos nicht auf die Idee ein gerades Regal bauen zu wollen, der für eure CNC berechnen zu wollen wie weit sich der Querträger in der Mitte durchbiegen würde. |
AW: Schleifen wiederholen
Ich weiß, spezifischer Ratschlag (oder gar Code) kommt immer besser an, als allgemeiner, aber ich probiere es mal :angel2:
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:
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 ^^
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; 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. |
AW: Schleifen wiederholen
Zitat:
|
AW: Schleifen wiederholen
Also ich bin mir nicht mehr ganz sicher, wie ich weiterkommen soll. Ich will mein Problem mal so beschreiben.
Der Sachverhalt lautete wie folgt: Es gibt n Elemente, die auf k Stellen platziert werden können. Bedingung ist, dass sich alles der Reihe nach bewegen muss, also Elemente 1 wird niemals vor Element 2 sein. Hier ein Beispiel mit 5 Elementen und 7 Stellen. *****--- ****-*-- ****--*- ****---* ***-**-- ***-*-*- ***-*--* **-***-- **-**-*- **-**--* *-****-- *-***-*- *-***--* -*****-- -****-*- -****--* -***-**- -***-*-* -**-***- -**-**-* -*-****- -*-***-* usw. Von mir aus, packe ich die Längen auch alle in Arrays rein, aber bezüglich der Kombination bin ich mir unsicher. Um das mal Verbal zu beschreiben: Am Anfang sind alle Halterungen im Abstand von 0,1 m voneinander entfernt. Dann geht die letzte Halterung bis ganz nach außen. Ist sie dort angekommen, dann rück die Vorletzte nach und die letzte Halterung ist wieder 0,1 m von der Vorletzten entfernt und bewegt sich nun nochmal bis ganz nach außen. Dann rückt die Vorvorletzte nach... Leider bekomme ich es nicht hin, dieses logisch Problem zu verpacken... |
AW: Schleifen wiederholen
Zitat:
ich interpretiere mal, dass das mehrere Beispiele waren und in meinem Quote das erste Beispiel zu sehen ist. Dann ist das m.E. ein einfacheres Problem und auch ich würde hier einen (dynamischen) array vorschlagen. Länge des arrays ist dann die Anzahl der Stellplätze. Jeder einzelne Wert ist dann das "Objekt" (oder was auch immer da liegt) Auf das Beispiel von dir bezogen:
Delphi-Quellcode:
Dann hättest du die Vorgabe dafür und musst nur noch eine Routine schreiben, welche die Items (Bei mir die Integer 1-5) beginnend mit dem letztmöglichen verschiebt.
SetLength(myArray, 8);
myArray[0] := 1; myArray[1] := 2; myArray[2] := 3; myArray[3] := 4; myArray[4] := 5; myArray[5] := 0; myArray[6] := 0; myArray[7] := 0; Zumindest, wenn ich deine Aufgabe verstanden habe :) |
AW: Schleifen wiederholen
Zitat:
Da ich vom Fach bin, habe ich mir dazu mal ein paar Gedanken gemacht. Wie wäre es mit einem anderen Lösungsansatz: Du verteilst die Auflager zunächst gleichmäßig unter dem Balken. Damit hast du schon man eine Ausgangslage an Unterschieden in den Auflagerkräften. Dann verschiebst du die Auflager nur noch iterativ, bis alle in etwa die gleiche Auflagerkraft bekommen. Das Auflager mit der geringeren Auflagerkraft rückt näher an das benachbarte Auflager ran. Dann schaust du dir das nächste Feld an und so weiter. Ist die Belastung eigentlich gleichmäßig verteilt? Dann kannst du die Verschiebungen ja gleich symetrisch durchführen. Ich bin mir nicht sicher, ob das in allen Fällen funktioniert, insbesondere bei nicht gleichmäßg verteilter Belastung. Aber vielleicht ist das ein Denkanstoß. |
AW: Schleifen wiederholen
Hi du,
ich würde im ersten Schritt nur die Positionen beachten und die Längen außen vor lassen. Ich würde die Elemente auch nicht positionieren, sondern nur Elemente verteilen und am Ende sagen "das Element ganz links ist Element 1, das daneben 2, ...", damit du die Problematik erstmal aus dem Kopf bekommst. Es bietet sich halt ein Array an mit der angegebenen Länge. Dann halt eine Funktion, welche ein Element platziert. Zunächst muss das erste Element im Bereich 0 bis L-N platziert werden. Nur L-N, da du ja wenigstens Platz für die verbleibenden Elemente benötigst. Danach wechselnd die verbleibenden Elemente aufteilen. Unterm Strich also eine Liste mit allen Möchlichkeiten und dort dann je eine Liste mit den verwendeten Elementen. "Array of Array of Boolean" vielleicht!? Funktion könnte für jeden Durchgang die Liste selbst erweitern, oder du errechnest zuerst die Anzahl der Möglichkeiten und setzt die Listenlänge zuerst. Letztes müsstest du machen, falls du zu viele Variationen hast und du sonst zu oft die Listenlänge neu setzen würdest ... das müsste dann aber schon echt oft sein ... merkst du, wenn dein Programm zu lange braucht ... Arraylängen neu setzen (=Arrays umkopieren) dauert auf dem PC noch mit am Längsten. Im Gegensatz zu meinem Vorgänger wäre das die "einfachere" Brute-Force-Methode. Nur so als Denkanstoß. Ich hoffe das hilft bei der Lösungsfindung. MfG Incocnito |
AW: Schleifen wiederholen
Zitat:
Wenn es so wie bei den Beispielen aussehen soll, könnte ich mir vorstellen dass man Binärzahlen hochzählt. Dann hätte man auch alle Positionen und würde sich so verhalten von rechts nach links. Weiß nicht ob das weiterhilft. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz