Ich möchte einen etwas anderen Ansatz vorschlagen als die anderen Antworten, obwohl @barron indirekt dasselbe diskutiert hat.
Statt Ihre Funktion direkt zu optimieren, das heißt , indem sie bei einer Reihe von Punkten Auswertung Punkte , die (hoffentlich) Converge zu einem (lokalen) optimal, Sie das Konzept der Verwendung könnten Surrogat - Modellierung , das ist Sehr gut geeignet für Probleme der von Ihnen beschriebenen Art (hohe Kosten, glatt, begrenzt, niedrig dimensioniert, dh weniger als 20 Unbekannte).x1, x2, … , XkErsatzmodellierung
Insbesondere Surrogat Modellierung funktioniert durch eine Modellfunktion der Einrichtung Ihrer wahren Funktion f ∈ R d → R . Der Schlüssel ist, dass c zwar nicht perfekt für f steht, die Bewertung jedoch weitaus billiger ist.c ∈ Rd→ Rf∈ Rd→ Rcf
Ein typischer Optimierungsprozess wäre also:
- Bewerten Sie an einer Menge von j Anfangspunkten x 1 , x 2 , … , x j . Beachten Sie, dass keine Derivate benötigt werden. Beachten Sie auch, dass diese Punkte gleichmäßig über den Suchraum verteilt sein sollten, z. B. durch Latin Hypercube Sampling oder ein ähnliches raumfüllendes Design.fjx1, x2, … , Xj
- Basierend auf diesem ursprünglichen Daten - Set, erstellen Sie eine Modellfunktion . Sie könnten eine Kreuzvalidierung verwenden, um Ihr Modell zu validieren (dh Sie können nur eine Teilmenge der ursprünglichen j- Punkte verwenden, um c zu erstellen , und dann anhand des restlichen Datensatzes überprüfen, wie gut c diese Werte vorhersagt).cjcc
- Verwenden Sie ein Kriterium wie das Kriterium der erwarteten Verbesserung (Expected Improvement, EI), um herauszufinden, wo mehr Stichproben „eingetragen“ werden müssen, um durch Stichprobenerfassung genauer zu machen . F. Dies ist theoretisch weitaus besser untersucht, als es scheint, und das EI-Kriterium ist sehr gut erforscht. Das EI-Kriterium ist auch kein gieriges Kriterium, sodass Sie beide eine gute Gesamtverbesserung der Modellgenauigkeit erzielen und gleichzeitig die Genauigkeit in der Nähe potenzieller Optima priorisieren.cf
- Wenn Ihr Modell nicht genau genug ist, wiederholen Sie Schritt 3, oder verwenden Sie Ihre bevorzugte Optimierungsroutine, um das Optimum von zu finden , das sich sehr kostengünstig auswerten lässt (Sie können also jede beliebige Routine verwenden, auch solche, die Ableitungen erfordern, oder einfach Funktion feinmaschig auswerten).c
Im Allgemeinen ist dies mit EGO, Efficient Global Optimization, gemeint, wie von @barron vorgeschlagen. Ich möchte betonen, dass dies für Ihre Anwendung perfekt geeignet erscheint: Sie erhalten ein überraschend genaues Modell, das auf relativ wenigen Auswertungen von basiert , und können dann jeden gewünschten Optimierungsalgorithmus verwenden. Was häufig auch interessant ist, ist, dass Sie jetzt c auf einem Netz auswerten und zeichnen können, um so einen Einblick in das allgemeine Erscheinungsbild von f zu erhalten . Ein weiterer interessanter Punkt ist, dass die meisten Ersatzmodellierungstechniken auch statistische Fehlerschätzungen liefern, wodurch eine Unsicherheitsschätzung möglich wird.fcf
Wie man konstruiert, ist natürlich eine offene Frage, aber oft werden Kriging- oder sogenannte Space-Mapping-Modelle verwendet.c
Natürlich ist das alles ziemlich viel Programmierarbeit, aber viele andere Leute haben sehr gute Implementierungen gemacht. In Matlab kenne ich nur die DACE-Software-Toolbox, die DACE kostenlos ist. TOMLAB bietet möglicherweise auch ein Matlab-Paket an, kostet aber Geld - ich glaube jedoch, dass es auch in C ++ funktioniert und weitaus mehr Funktionen bietet, als DACE jemals haben wird. (Hinweis: Ich bin einer der Entwickler der neuen Version von DACE, die in Kürze veröffentlicht wird und zusätzliche Unterstützung für EGO bieten wird.)
Ich hoffe, dieser grobe Überblick hat Ihnen geholfen. Bitte stellen Sie Fragen, ob es Punkte gibt, die klarer formuliert werden können oder Dinge, die ich verpasst habe, oder ob Sie weiteres Material zu diesem Thema wünschen.