2009-08-26 5 views
1

Ich benutze Python 2.5.Angeben von Einschränkungen für fmin_cobyla in scipy

I Grenzen der cobyla Optimierung bin vorbei:

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) 

Basierend auf den Ausgangswerten Initial und als pro/innerhalb der Grenzen b1-b10 die Werte zu opt() geben werden. Aber die Werte sind abweichend, insbesondere mit b9. Dies ist eine sehr wichtige Randbedingung für mein Problem!

"Der Wert von x[2], der bei jeder Iteration an meine Funktion opt() übergeben wird, muss immer größer sein als x[3]" - Wie ist es möglich, dies zu erreichen?

Gibt es etwas falsch in meinen Grenzen (b1 bis b9) Definition?

Oder gibt es eine bessere Möglichkeit, meine Grenzen zu definieren?

Bitte helfen Sie mir.

+0

ich den Titel revidieren würde Dies ist eine Frage darüber, wie Constraints für die fmin_cobyla-Funktion von scipy angegeben werden und nicht, wie lambdas im Allgemeinen angegeben werden. –

Antwort

3

fmin_cobyla() ist keine interne Punktmethode. Das heißt, es werden Punkte passieren, die außerhalb der Grenzen ("nicht ausführbare Punkte") der Funktion während des Verlaufs des Optimierungslaufs liegen.

Auf Sache, die Sie beheben müssen, ist, dass b9 und b10 nicht in Form sind, dass fmin_cobyla() erwartet. Die gebundenen Funktionen müssen eine positive Zahl zurückgeben, wenn sie innerhalb der Grenze liegen, 0.0, wenn sie genau an der Grenze liegen, und eine negative Zahl, wenn sie außerhalb der Grenzen liegen. Idealerweise sollten diese Funktionen glatt sein. fmin_cobyla() wird versuchen, numerische Ableitungen dieser Funktionen zu nehmen, um es wissen zu lassen, wie man in die machbare Region zurückkommt.

b9 = lambda x: x[2] - x[3] 

Ich bin nicht sicher, wie b10 in einer Art und Weise zu implementieren, dass fmin_cobyla() der Lage sein wird, wenn auch zu verwenden.

+0

'max (x) - min (x)' könnte funktionieren - es ist einigermaßen glatt,> 0 je mehr "innerhalb der Grenzen" x ist, == 0 wenn "genau an der Grenze" (ich sehe keinen Weg zu sein " außen "ein 1-D gebunden mit einem 4-D-Punkt ;-). –

+0

x [2] -x [3]> 0 und x [2]> x [3] sind äquivalente Bedingungen – fortran

+0

Danke, es wird besser mit Lambda x: x [2] - x [3], aber ich bekomme die Stufe, wo der Wert von x [2] & x [3] gleich ist, aber wenn ich b9 = Lambda x: x [2]> x [3] übergeben will, muss der Wert von x [2] immer größer sein als x [3] Wert ". Wofür sollte ich etwas ändern? siehe den bearbeiteten Code. –

2

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)) 

wo d ein Delta größer als die minimale Differenz ist, dass Sie zwischen den Variablen wollen (zB 0.001)

+0

Ausgezeichnete Idee! leider verwende ich nur python 2.5, das hauptproblem ist opt ​​() sollte fest bei b9 = lambda x: x [2]> x [3], x [2] muss immer größer sein als x [3] diese bedingung ist sehr wichtig für mein Problem. Wie b9 Bedingung zu codieren? –

Verwandte Themen