Question

J'utilise Python 2.5.

Je passe des limites à l'optimisation de cobyla:

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)

basée sur les valeurs initiale et Initial selon les / aux bornes b1 à b10 les valeurs sont transmises à opt(). Mais les valeurs dévient, en particulier avec b9. Ceci est une condition de délimitation très important pour mon problème!

« La valeur de x[2] passé à ma fonction opt() à chaque itération doit être toujours supérieure à x[3] » - Comment est-il possible d'y parvenir

Y at-il quelque chose de mal dans mes limites (b1 à b9) définition?

Ou est-il une meilleure façon de définir mes limites?

S'il vous plaît aidez-moi.

Était-ce utile?

La solution

fmin_cobyla() ne constitue pas une méthode de point intérieur. Autrement dit, il passera des points qui sont en dehors des limites ( « points infaisables ») à la fonction au cours de la course de optmization.

Une chose que vous aurez besoin de fixer est que b9 et b10 ne sont pas sous la forme que fmin_cobyla() attend. Les fonctions liées doivent retourner un nombre positif si elles sont à la limite, 0.0 si elles sont exactement sur la limite, et un nombre négatif si elles sont en dehors des limites. Idéalement, ces fonctions doivent être lisses. fmin_cobyla() va essayer de prendre des dérivés numériques de ces fonctions afin de le faire savoir comment revenir à la région réalisable.

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

Je ne suis pas sûr de savoir comment mettre en œuvre b10 d'une manière qui fmin_cobyla() sera en mesure d'utiliser, cependant.

Autres conseils

pour B10, une option possible pourrait être:

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

d est un delta supérieur à la différence minimale que vous voulez entre vos variables (par exemple 0,001)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top