Pergunta

Eu uso Python 2.5.

Eu estou passando limites para o cobyla de otimização:

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)

Com base nos valores iniciais Initial e como per/dentro dos limites b1 para b10 os valores são passados para opt().Mas os valores são divergentes, especialmente com b9.Esta é uma importante condição delimitadora para o meu problema!

"O valor de x[2] passou para a minha função opt() em cada iteração deve ser sempre maior do que x[3]"-- Como é possível conseguir isso?

Não há nada de errado em meus limites (b1 para b9) definição ?

Ou existe uma forma melhor de definir meus limites?

Por favor me ajude.

Foi útil?

Solução

fmin_cobyla() não é um método de ponto interior.Que é, ele vai passar os pontos que estão fora dos limites ("inviável" pontos) para a função, durante o curso do optmization executar.

Em coisa que você precisa corrigir, é que b9 e b10 não estão na forma que fmin_cobyla() espera.O limite funções precisa retornar um número positivo, se eles estão dentro do limite, 0.0, se eles estão exatamente no limite, e um número negativo, se eles estão fora dos limites.Idealmente, estas funções devem ser suaves. fmin_cobyla() vai tentar levar a numéricos derivados dessas funções, a fim de deixá-lo saber como voltar para a região viável.

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

Eu não tenho certeza de como implementar b10 de uma forma que fmin_cobyla() será capaz de usar, apesar de tudo.

Outras dicas

para b10, uma possível opção poderia ser:

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

onde d é um delta maior que a mínima diferença que você deseja entre as variáveis (p.g 0.001)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top