Spezifizierung von Randbedingungen für fmin_cobyla in scipy
-
20-09-2019 - |
Frage
Ich verwende Python 2.5.
Ich bin Grenzen der cobyla Optimierung übergeben:
import numpy
from numpy import asarray
Initial = numpy.asarray [2, 4, 5, 3] # Initial values to start with
#bounding limits (lower,upper) - for visualizing
#bounds = [(1, 5000), (1, 6000), (2, 100000), (1, 50000)]
# actual passed bounds
b1 = lambda x: 5000 - x[0] # lambda x: bounds[0][1] - Initial[0]
b2 = lambda x: x[0] - 2.0 # lambda x: Initial[0] - bounds[0][0]
b3 = lambda x: 6000 - x[1] # same as above
b4 = lambda x: x[1] - 4.0
b5 = lambda x: 100000 - x[2]
b6 = lambda x: x[2] - 5.0
b7 = lambda x: 50000 - x[3]
b8 = lambda x: x[3] - 3.0
b9 = lambda x: x[2] > x[3] # very important condition for my problem!
opt= optimize.fmin_cobyla(func,Initial,cons=[b1,b2,b3,b4,b5,b6,b7,b8,b9,b10],maxfun=1500000)
Auf der Grundlage der Anfangswerte Initial
und nach / innerhalb der Grenzen b1
die Werte b10
an opt()
weitergegeben. Aber die Werte sind abweichend, insbesondere mit b9
. Dies ist eine sehr wichtige Begrenzungsbedingung für mein Problem!
„Der Wert von x[2]
meine Funktion opt()
bei jeder Iteration übergeben muss immer größer als x[3]
?“ - Wie ist es möglich, dies zu erreichen
Gibt es etwas falsch in meinen Grenzen (b1
zu b9
) Definition?
Oder gibt es einen besseren Weg, meine Grenzen zu definieren?
Bitte helfen Sie mir.
Lösung
fmin_cobyla()
ist keine innere Punkt-Methode. Das heißt, es werden die Punkte übergeben, die außerhalb der Grenzen ( „undurchführbar Punkte“), um die Funktion im Verlauf des Feld-Optimierung Lauf sind.
Auf Sache, die Sie korrigieren müssen, ist, dass b9
und b10
ist nicht in der Form, dass fmin_cobyla()
erwartet. Die gebundenen Funktionen müssen eine positive Zahl zurück, wenn sie innerhalb der Grenze, 0.0 sind, wenn sie genau auf der gebunden und eine negative Zahl sind, wenn sie außerhalb der Grenzen. Idealerweise sollten diese Funktionen glatt sein. fmin_cobyla()
wird versucht numerische Ableitungen dieser Funktionen zu ergreifen, um sie wissen zu lassen, wie man den realisierbaren Bereich kommen.
b9 = lambda x: x[2] - x[3]
Ich bin mir nicht sicher, wie b10
in einer Art und Weise zu implementieren, dass fmin_cobyla()
Gebrauch der Lage sein wird, though.
Andere Tipps
für b10, könnte eine mögliche Option sein:
b10 = lambda x: min(abs(i-j)-d for i,j in itertools.combinations(x,2))
Dabei steht d ist ein Delta größer als die minimale Differenz zwischen Sie Ihre Variablen wollen (zum Beispiel 0.001)