# Optimierungen: sowohl Lernstoff als auch Hands-On Code



## sirbender (12. Nov 2014)

Hallo,

ich will mich im Bereich der Optimierung schlau machen. Dabei wuerde ich gerne bei den Grundlagen anfangen und dann anhand von konkreten Beispielen das Feld erlernen. Wie formalisiert man ein Problem am besten in Form von Datenstrukturen, wie formuliert man die Optimierungssteps am besten sodass es moeglichst wenige Steps sind, usw.

Dabei wuerde ich am liebsten gleich ein Buch haben, dass anhand einer Java-Optimierungs-Library konkrete Beispiele durchspielt. Das Glueck werde ich wohl nicht haben, oder? Ich habe viel gesucht im Web aber nichts gutes gefunden. Aber vielleicht kennt ihr ja eine gute Lese-Grundlage.

Was wuerdet ihr ansonsten vorschlagen. Gibt es eine Java-Optimierungs-Lib die ihr empfehlen koennt?


----------



## Joose (12. Nov 2014)

Was soll eine "Java-Optimierungs-Lib" sein?

Optimierung ist ein weit gefasster Begriff: Willst du auf Performance optimieren? Speicherverbrauch? Oder meinst du gänzlich die Optimierung der Entwicklung?


----------



## sirbender (12. Nov 2014)

Puhhh...ja...da habe ich mich sehr unklar ausgedrueckt. Mir geht es um mathematische Optimierung. Ich geb mal ein paar Beispiele.

Man hat unterschiedliche Objekte die eine Flaeche haben (die allerdings nicht so einfach zu berechnen ist wie die eines Rechtecks). Die Summe der Objekt-Flaechen soll einen gewissen Zielwert erreichen (also in ein groesseres Objekt passen). Nun kann man einen Parameter aendern damit alle Objekte groesser bzw. kleiner werden. Die Endsumme der Flaechen ist aber nicht so einfach ueber einen Parameter intuitiv zu bestimmen. Man muss den Parameter aendern und dann nachrechnen wie sich die Flaechensumme veraendert hat. In einem Loop passt man dann den Parameter schritt-fuer-schritt an um irgendwann abzubrechen bis eine Flaechensumme erreicht ist die man fuer optimal genug haelt.

Oder ein anderes Beispiel: zwei identische Molekuele mit unterschiedlichen Konfigurationen (Atom xyz-Werten im 3D Raum) sollen so deckungsgleich wie moeglich sein. D.h. ein Molekuel wird fixiert und das zweite Molekuel muss als Ganzes nun so verschoben und rotiert werden, dass die jeweiligen Atomdistanzen zum fixierten Molekuel minimal sind. Also z.B. zwei H20 koennte man leicht deckungsgleich bekommen. Komplexere Molekuele nicht - allerdings kann man eine Loesung finden wo zwei Molekuele sehr deckungsgleich sind.

Solche Art von Optimierungen wuerde ich gerne erlernen. Nun gibt es bestimmt Java-Libraries die dies unterstuetzen und vielleicht auch gute Buecher/Tutorials.


----------



## Joose (12. Nov 2014)

Leider verstehe ich immer noch nicht ganz:

"Flächenoptimierung": hier kann ich den mathematischen Bezug noch sehen und verstehen. Aber was hat das mit Optimierung zu tun? 
Optimierung bedeutet für mich: Ich habe einen Algorithmus X diesen kann ich nun optimieren dass:

 weniger Speicher verbraucht wird
 das Ergebnis schneller berechnet wird
 genauere/umfangreichere Resultate erreicht werden
Bei deinem Beispiel hast du einen Algorithmus welcher einfach einen Faktor X finden soll.

"Moleküle": Wo ist hier die mathematische Optimierung? Du willst ein Objekt drehen und wenden bis es deckunsgleich mit einem anderen Objekt ist. Was ist hierbei die Optimierung?


----------



## JavaMeister (12. Nov 2014)

Er hat einfach eine fachliche Optimierung. 

Wenn du ein Riesenrad hast und kennst die Baustoffe, kannst du die Dicke der Flächen optimieren. 


An der Ruhr Uni Bochum gibt es eine entsprechende Bibliothek, die eine technische Optimierung berechnet anhand gegebener Werte. Aber ist im Bereich technischer Optimierung. 

Kannst du sagen ich habe ein Balken über einem Abgrund aus Holz. Will es mit 3 Tonnen beladen. Wie dick muss das Holz sein.


----------



## Joose (12. Nov 2014)

Ach so in dieser Hinsicht "Optimierung", das klingt logisch.
Ja hier würde ich entsprechende "Forschungsinstitute" bzw. Universitäten abklappern und nachfragen ob eine entsprechende OpenSource Bibliothek zur Verfügung steht 
(Natürlich darf weltweit gesucht werden )


----------



## Ruzmanz (13. Nov 2014)

Spielt das eine Rolle? Um etwas zu optimieren braucht man ein konkretes Problem. Wenn man ein Problem hat, muss man ein konkretes Ziel setzen. Den Weg zur Erreichung des Ziels nennt man "optimieren".

Beispiel:
*Problem: *Man hat unterschiedliche Objekte die eine Flaeche haben (die allerdings nicht so einfach zu berechnen ist wie die eines Rechtecks).

*Ziel:* Die Summe der Objekt-Flaechen soll einen gewissen Zielwert erreichen (also in ein groesseres Objekt passen). 

*Lösung:* Nun kann man einen Parameter aendern damit alle Objekte groesser bzw. kleiner werden. Die Endsumme der Flaechen ist aber nicht so einfach ueber einen Parameter intuitiv zu bestimmen. Man muss den Parameter aendern und dann nachrechnen wie sich die Flaechensumme veraendert hat. In einem Loop passt man dann den Parameter schritt-fuer-schritt an um irgendwann abzubrechen bis eine Flaechensumme erreicht ist die man fuer optimal genug haelt.

Deine fachliche "Lösung" ist die Grundlage für dein Programm. Das Programm kannst du so schreiben wie du willst. Du musst lediglich die Lösungsschritte übernehmen. Den Quellcode kannst du anschließend auf "Speicher", "Geschwindigkeit", "Lesbarkeit", usw. optimieren. Das hat nichts mehr mit der Optimierung des Problems zu tun.


----------

