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.

War es hilfreich?

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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top