Ich versuche eine Zielfunktion zu optimieren, die mehrere Eingabevariablen hat (zwischen 24 und 30). Diese Variablen sind Stichproben von drei verschiedenen statistischen Variablen und Zielfunktionswerte sind T-Test-Wahrscheinlichkeitswerte. Eine Fehlerfunktion repräsentiert den Fehler (Summe der Quadrate der Differenzen) zwischen den gewünschten und den tatsächlichen t-Testwahrscheinlichkeiten. Ich kann nur Lösungen akzeptieren, bei denen der Fehler für alle drei t-Tests weniger als 1e-8 ist.
Ich habe scipy.optimize.fmin
benutzt und es hat super funktioniert. Es gibt viele Lösungen, bei denen die Zielfunktion Null wurde.
Das Problem ist, dass ich eine Lösung finden muss, bei der die Variablen zwischen 0 und 10.0 liegen und ganze Zahlen sind oder nicht mehr als einen Bruchteil von Ziffern haben. Beispiele für gültige Werte sind 0 10 3 5.5 6.8
. Beispiele für ungültige Werte: -3 2.23 30
oder 0.16666667
.
Ich weiß zufällig, dass es mindestens eine Lösung gibt, weil die Zielwerte aus tatsächlichen Messdaten stammen. Die ursprünglichen Daten gingen verloren, und meine Aufgabe ist es, sie zu finden. Aber ich weiß nicht wie. Die Verwendung von Versuch / Irrtum ist keine Option, da es für jede Variable ungefähr 100 mögliche Werte gibt, und angesichts der Anzahl der Variablen wäre die Anzahl möglicher Fälle 100 ** 30, was zu viel ist. Die Verwendung von fmin ist großartig, funktioniert jedoch nicht mit diskreten Werten.
Gibt es eine Möglichkeit, das zu lösen? Es ist kein Problem, wenn ich ein Programm für viele Stunden ausführen muss, um eine Lösung zu finden. Aber ich muss innerhalb weniger Tage Lösungen für etwa 10 Zielwerte finden, und mir fehlen neue Ideen.
Hier ist ein Beispiel für MWE:
%Vor%Was du versuchst zu tun (wenn ich dein Setup verstanden habe) heißt Ganzzahlprogrammierung und es ist NP-schwer; Ссылка . Ich weiß, dass Sie nicht nach ganzzahligen Lösungen suchen, aber wenn Sie alle Eingaben mit 10 multiplizieren und die Zielfunktion durch 100 teilen, erhalten Sie ein äquivalentes Problem, bei dem die Eingaben alle Ganzzahlen sind. Der Punkt ist, Ihre Eingaben sind diskret.
Die Zielfunktion, mit der Sie arbeiten, ist eine konvexe, quadratische Funktion, und es gibt gut eingeschränkte Optimierungsalgorithmen, die sie schnell für reellwertige Eingaben im Intervall [0, 10] lösen. Von diesem können Sie versuchen, alle akzeptablen Punkte in der Nähe zu runden oder zu überprüfen, aber es gibt 2 ^ n davon, wobei n die Anzahl der Eingaben ist. Selbst wenn Sie dies tun, ist die optimale Lösung nicht einer dieser Punkte.
Es gibt Approximationsalgorithmen für ganzzahlige Programmierprobleme, und Sie können feststellen, dass manchmal einer von ihnen gut genug funktioniert, um Sie zu einem optimalen Punkt zu bringen. Es gibt eine Liste von Dingen, die Sie in dem Wikipedia-Artikel, den ich zitiert habe, versuchen könnten, aber ich weiß nicht, dass Sie glücklich sein werden, wenn Sie versuchen, dieses Problem zu lösen.
Tags und Links python math numpy scipy discrete-mathematics