Parameteroptimierung für System



  • Hallo zusammen 🙂

    Folgendes Problem:
    Es gibt ein System, dass ist quasi ein Programm, das eine Black-Box für mich darstellt. Ich geb was rein und bekomm was raus. Genauer: Ich kann verschiedene Parameter des Systems VOR Programmstart ändern, es dann durchlaufen lassen und erhalte dann einen Ergebniswert Y. Diese Eingabeparameter haben feste Grenzen, z.B. kann da ein bool bei sein oder ein Integer der von 15 bis 22 variiert werden kann. Oder auch ein Float, der von 0.0 bis 10.0 variiert werden kann:

    http://img9.abload.de/img/a2ps5.png

    Für den Ergebniswert Y gibt es einen Idealwert (z.B. die 1). Mit welchen (mathematischen) Ansätzen kann ich die Parameter nun möglichst effizient optimieren, um mich dem Idealwert von Y anzunähern. Alle Kombinationen durchprobieren ist zu zeitaufwendig.

    ------------------------

    Eigentlich erhalte ich sogar 2 Ergebniswerte:
    http://www.abload.de/img/bzqz6.png

    Aber aus Gründen der Einfachheit reicht auch erstmal eine Optimierung nach einem der Ergebnisse. 😋



  • Nachtrag: falls es schon irgendwo eine C++-Bibliothek kann, die dafür Algorithmen anbietet, würde ich definitiv auch bereits vorhandenes schon verwenden wollen 🙂



  • Gesucht ist also a,b,c mit f(a,b,c) = 1. Wobei es Einschraenkungen an a, b, c gibt. Tja, was besseres als Hill climbing faellt mir nicht ein, da f alles sein kann. Von linear bis boese nichtlinear oder gar nicht stetig. Ich wuerde ein grobes Gitter ueber den Definitionsbereich legen und vielversprechende Stellen mit hoeherer Aufloesung neu untersuchen.



  • Wenn du kein genaueres Modell der Blackbox hast, ist alles möglich, und du musst alle Kombinationen durchprobieren.


  • Mod

    Wobei "genaueres Modell" nicht viel heißen muss. Schon wenig Information wie dass das Ergebnis halbwegs stetig ist, würde viel helfen.



  • knivil schrieb:

    Gesucht ist also a,b,c mit f(a,b,c) = 1. Wobei es Einschraenkungen an a, b, c gibt. Tja, was besseres als Hill climbing faellt mir nicht ein, da f alles sein kann. Von linear bis boese nichtlinear oder gar nicht stetig. Ich wuerde ein grobes Gitter ueber den Definitionsbereich legen und vielversprechende Stellen mit hoeherer Aufloesung neu untersuchen.

    Naja... wie die Ausgangsdaten von den Eingangsdaten abhängen, kann man ja zur Not noch "sehen". Also ob einigermaßen stetig oder differenzierbar.

    Falls die Eingangsdaten einigermaßen glatt von den Ausgangsdaten abhängen, kannst du eines der Newton-Verfahren verwenden (angenommen, du bis nahe genug am Optimum dran).

    Ist dein Zielwert nur eine einzelne Zahl kannst du unter Umständen Bisektion verwenden.



  • Ist das System denn stetig? Dann versuchs mit einem Gradienten-Verfahren. Ansonsten koenntest du's mit Genetischen Algorithmen versuchen.



  • Ok, erstmal danke euch allen. Das Thema ruhte ein wenig, ist jetzt aber wieder aktuell.

    Blue-Tiger schrieb:

    Ist das System denn stetig? Dann versuchs mit einem Gradienten-Verfahren. Ansonsten koenntest du's mit Genetischen Algorithmen versuchen.

    Da ich wirklich wenig über den internen Ablauf weiß, hab ich mal ein wenig recherchiert. Dein Vorschlag mit den genetischen Algorithmen erscheint mir auch sehr geeignet. Deswegen hab ich das ganze Mal für f(x) und f(x,y) implementiert, sprich Population erzeugen, kreuzen, mutieren usw. Hier eines meiner Ergebnisse:

    http://www.abload.de/img/resultj3s9.png (Nahezu die gesamte Population befindet sich auf dem Berg (maximum, der schlecht sichtbare rote Punkt oben))

    http://www.abload.de/img/verlaufe029.png (Generationenverlauf, unten die aktuelle Generation, man sieht dass konsequent das beste Individuum vom Anfang mit einer Fitness von ca. ~3.5 beibehalten wurde. Bei einer durchschnittlichen Fitness von >7 habe ich abgebrochen)

    --------------------

    Ich komme mit den genetischen Algorithmen, abhängig von einigen Werten, richtig schnell und auch performant zu dem globalen Maximum.

    Bis jetzt konnte ich aber kaum Informationen bzgl. mehrdimensionaler Funktionen finden. Wie werden da die Parameter (hier: x,y) idealerweise kodiert? Ich hab einfach x und y in Binärzahlen gewandelt und als ein Genotypen gesehen, z.B.

    Individuum I: 0010.1100|1101.0011

    Wie wird da üblicherweise gekreuzt? Wirklich schöne Literatur ist da leider selten, bin für jeden weiteren Tipp dankbar 🙂


Anmelden zum Antworten