2009-08-26 16 views
1

J'utilise Python 2.5.Spécification de contraintes pour fmin_cobyla dans scipy

Je passe des bornes à 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) 

Sur la base des valeurs initiales Initial et comme par/dans les limites b1 à b10 les valeurs sont transmises à opt(). Mais les valeurs sont déviantes, en particulier avec b9. C'est une condition limite très importante 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 a-t-il quelque chose qui ne va pas dans mes limites (b1 à b9) définition?

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

S'il vous plaît aidez-moi.

+0

Je réviserait le titre indique qu'il s'agit d'une question sur la façon de spécifier des contraintes pour la fonction fmin_cobyla de scipy, et non sur la manière dont lambdas est spécifié en général. –

Répondre

3

fmin_cobyla() n'est pas une méthode de point intérieur. C'est-à-dire, il passera des points qui sont en dehors des limites ("points infaisables") à la fonction au cours de la course d'optmisation. Sur la chose que vous devrez corriger est que b9 et b10 ne sont pas dans la forme que fmin_cobyla() attend. Les fonctions liées doivent retourner un nombre positif si elles sont dans la limite, 0.0 si elles sont exactement sur la borne, et un nombre négatif si elles sont hors limites. Idéalement, ces fonctions devraient être fluides. fmin_cobyla() va essayer de prendre des dérivés numériques de ces fonctions afin de lui faire savoir comment revenir à la région possible.

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.

+0

'max (x) - min (x)' pourrait fonctionner - il est raisonnablement lisse,> 0 plus "dans les limites" x est, == 0 quand "exactement sur la borne" (je ne vois pas comment être " à l'extérieur "une borne 1-D avec un point 4-D ;-). –

+0

x [2] -x [3]> 0 et x [2]> x [3] sont des conditions équivalentes – fortran

+0

Merci, c'est mieux avec lambda x: x [2] - x [3], mais je reçois l'étape où la valeur de x [2] & x [3] sont les mêmes, mais si je veux passer b9 = lambda x: x [2]> x [3] "la valeur de x [2] doit être toujours plus grande que x [3] valeur ". Pour cela, quel changement devrais-je faire? s'il vous plaît voir le code édité. –

2

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érieure à la différence minimale que vous voulez entre vos variables (par exemple 0,001)

+0

Excellente idée! malheureusement, je n'utilise que python 2.5, le problème principal est opt ​​() devrait coller fermement à b9 = lambda x: x [2]> x [3], x [2] doit toujours être supérieur à x [3] cette condition est très importante pour mon problème. Comment coder la condition b9? –