4.6 Golden Search

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

4.6 Golden Search
Hey,

Darf ich in der “GoldenSearchThreaded” auf meine “GoldenSearchImpl” zugreifen - d.h. ein Objekt davon erstellen?
Bin nicht sicher, da ich das file ja selber erstellen musste :slight_smile:


Brauchst du nicht, schau dir mal das Interface zu ParallelGoldenSearch an ;).


Mal ne Frage:

bin das nur ich, oder erzeugt GoldenSearch (noch ohne Threads, also nur die Teilaufgabe a) mit dem rekursiven Algorithmus von Wikipedia (duerfen wir ja wohl verwenden, immerhin gibts den Link dazu sogar auf dem Blatt) im CIP einen StackOverflow Error?

Mit einer Iterativen Impl funzt es auch im CIP.

EDIT: noch was zur Iterativen impl: wieso funkioniert die eig nur, wenn man als golden Ratio nicht 1,6xxxxx sondern 0,6xxxxx und als ratio 2 entsprechend anstatt von 2 - 1,6xxxxx dann 1 - 0,6xxxx verwendet? Wenn ich das nicht mache, schlaegt der Test fehl.


Das klingt für mich nach der falschen Abbruchbedingung, die rekursive Variante funktioniert auch im CIP.

Ohne deinen Code zu kennen ist das wie Kaffeesatz lesen <_<.
Ich vermute du hast die iterative Variante anders gebaut als die rekursive in der Wikipedia.
Dadurch werden andere Intervalle gewählt und man findet je nach Test eben ein anderes lokales Minimum.


Ich bekomme bei den Testcases für die GoldenSearch-Implementierung:

GoldenSearch 0: solutionSequential: -1.0 result: -1.0 GoldenSearch 1: solutionSequential: 0.0 result: 0.0 GoldenSearch 2: solutionSequential: 1.0 result: -0.5

Wir sollen doch den x-Wert finden, an dem das lokale Minimum vorliegt und dann den Wert an dieser Stelle(x) zurückgeben, oder?

Ich habe den Quelltext der gegebenen Klassen und Testfälle etwas durchsucht. Die 3. Funktion (bei der der Test fehlschlägt) müsste lauten: f(x) = -x + x²/2, da es eine neue Polynom-Instanz mit Koeffizienten {0,-1,0.5} ist. Für die allgemeine Funktion f(x) = ax²+bx+c würde dem Konstruktor des Polynom-Objekts ein Array mit den Inhalten {c,b,a} übergeben. Sehe ich das falsch?

Falls dem so ist, müsste der Wert des Minimums für die 3. Funktion doch -1/2 an der Stelle x=1 sein.
Die grenzen des Intervalls sind [-5;1].

Sieht jemand meinen Denkfehler?

Danke! :slight_smile:


Hab ebenfalls den Wiki-Code genommen, der geht bei mir… Außer bei x^2, Suchintervall [-1,1] → Nullstelle bei 0/0…
wird nicht gefunden, sondern mit einem Stackoverflow beantwortet…

x^2 + 1, also Nulstelle nun bei 0/1, geht ohne Probleme…


Hast du den Hinweis auf dem Aufgabenblatt gelesen und Epsilon als Abbruchkriterium verwendet?

Der x-Wert soll zurueckgegeben werden…


Bei mir kommt es zum gleichen Problem, ich denke es liegt daran wie ich mein erstes b berechne, um den rekursion zu starten.
Habe b einfach als Mitte zwischen left und right gewählt, da ich aus der wiki-Seite diesbezüglich nicht wirklich schlau wurde.
Macht das Sinn?


Nur mal eine kurze Anmerkung meinerseits (falls diese falsch ist, bitte ich darum, mich sofort zu korrigieren):

Auf dem Blatt steht was von [quote]
“Implementieren Sie in der Klasse GoldenSearchImpl die sequentielle Berechnung eines lokalen
Minimums […]”
[/quote] - daher würde ich nicht mit einer rekursiven Methode an die Sache herangehen. :stuck_out_tongue:


glaube du verwechselst iterativ mit sequentiell?


Ach ja… an manchen Tagen sollte ich besser einfach ruhig sein.


kurze Frage, kann man den Code auf Wiki mit entsprechender anpassung verwenden oder bekommt man da probleme mit dem plagiat checker ? Uns hat man sogar gesagt das wir den verwenden duerfen aber heisst das nun komplett umschreiben oder ist auf den Bereich der checker aus ?

Thx,

Bass


Bei ThreadedGoldenSearch:
nachdem jeder Thread einen Wert berechnet hat, sollen die Werte der Threads aktualisiert werden, und dann die Threads neu gestartet werden, solange bis alle f.length (Anzahl der mitgegebenen Funktionen) Werte berechnet worden sind.
dazu habe ich im Thread eine Methode remake(…) geschrieben, die eben die Werde des Threads aktualisieren.

das ganze habe ich dann in eine for Schleife gepackt, die solange läuft, bis alle Werte berechnet sind. Diese For schleife wird aber anscheinend nie verlassen, irgendwo zickt er rum.

das ganze habe ich etwa so aufgebaut:

for(i = anzahl Threads; i < anzahl der mitgegebenen Funktionen; i++)
{
if(alle Threads einmal erneuert wurden (mit counter2 wird mitgezählt)
{
for(anzahl Threads)
{
if(Thread an stelle i lebt)
{
try{
threads[ i ].join();
}
catch(InterruptedException e)
{
System.out.println("FEHLER. ");
}
}
}
Zähler für die Threads wieder auf 0 setzen (sodass wieder alle von vorne aktualisiert und gestartet werden);
}
DerNächsteThread.remake(Werte werden aktualisiert(wie z.B. die Funktion, usw);
DerNächsteThread.start();
counter2++;
}


Vielleicht ist das nur falsch im Pseudocode, aber man kann Threads in Java nur einmal starten,
der zweite Aufruf von start() wirft eine Exception.
Dein Programm hängt wahrscheinlich weil du join auf einem noch nicht gestarteten Thread aufrufst.
Es reicht auch vollkommen die Threads einmal zu starten,
denk an syncFreePaint aus der Picasso Aufgabe.

edit:

Klar geht das, sonst wär der Link ja sinnlos ;).

Aus ist der Checker nicht, sonst könnte man ja voneinander abschreiben ;).
Komplett Umschreiben ist nicht nötig, es schaut ja nochmal ein Mensch über die Ergebnisse,
der kann das mit Wikipedia dann schon beurteilen ;).


Bei Aufgabe b)
Müssen die einzelnen Threads die Funktionen wirklich “übergeben” bekommen, oder können die Threads sich ihren Teil der Funktionen auch selbst auswählen?


Irgend eine Referenz musst du den Threads schon übergeben.
Das über Felder zu machen wäre hässlich ;).


Hallo, sollen sich die Threads die einzelnen Funktionen durch Intervalle teilen?
Wir haben ja 4 Threads und 6 Funktionen. Ich verstehe ned wie jeder thread einen gleichgroßen Teil der Funktionen zur Verarbeitung erhält.


Habe das selbe Problem, den Code von Wikipedia genommen und b einen RandomWert zwischen left und right mitgegeben → StackOverflow
Hilf mir Jebus


Die Abbruchbedingung ist nicht tau * (Math.abs(b) + Math.abs(x))
oder EPSILON * (Math.abs(b) + Math.abs(x)) sondern EPSILON.

1 Like