Angabe von Einschränkungen für fmin_cobyla in scipy

Ich benutze Python 2.5.

Ich gehe an die Cobyla-Optimierung 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 Anfangswerten Initial und nach / innerhalb der Grenzen b1 bis b10 die Werte an opt() . Aber die Werte sind abweichend, besonders bei b9 . Dies ist eine sehr wichtige Begrenzung für mein Problem!

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

Gibt es etwas falsch in meiner Grenze ( b1 bis b9 ) Definition?

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

Bitte hilf mir.

    2 Solutions collect form web for “Angabe von Einschränkungen für fmin_cobyla in scipy”

    fmin_cobyla() ist keine fmin_cobyla() . Das heißt, es wird Punkte, die außerhalb der Grenzen sind ("unzulässige Punkte") an die Funktion im Laufe des Optifizierungslaufs übergeben.

    Auf die Sache, die Sie reparieren müssen, ist, dass b9 und b10 nicht in der Form sind, die fmin_cobyla() erwartet. Die gebundenen Funktionen müssen eine positive Zahl zurückgeben, wenn sie innerhalb der Grenze sind, 0.0 wenn sie genau auf der Grenze sind, und eine negative Zahl, wenn sie außerhalb der Grenzen sind. 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ückkehrt.

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

    Ich bin mir nicht sicher, wie man b10 in einer Weise implementiert, die fmin_cobyla() in der Lage sein wird, aber zu verwenden.

    Für b10 könnte eine mögliche Option sein:

     b10 = lambda x: min(abs(ij)-d for i,j in itertools.combinations(x,2)) 

    Wo d ist ein Delta größer als die minimale Differenz, die Sie zwischen Ihren Variablen (zB 0,001)

    Python ist die beste Programmiersprache der Welt.