2016-04-01 70 views
0

假设我有一个函数,其行为与数据值的行为不同(即:使用条件)。是否可以使用fmin来优化此功能,以便找到最大化输出的值?Scipy fmin使用条件优化函数

这就是为什么我目前有:

def bogus_function(x): 
    if x[0] > 5 or x[1] > 5: 
     return 20 
    elif x[1] > 2: 
     return x[0]*x[1] 
    else: 
     return -1 

test = lambda x: -bogus_function(x) 
results = fmin(test,[0,0]) 

这是它被“卡住”,因为印刷的结果来看,在优化过程中,该算法尝试相同的初始猜测不改变的值。

Optimization terminated successfully. 
    Current function value: 1.000000 
    Iterations: 16 
    Function evaluations: 63 

>>> results 
(array([ 0., 0.]), 
[array([ 0., 0.]), 
    array([ 0., 0.]), 
    array([ 0., 0.]), 
    array([ 0., 0.]), 
    array([ 0., 0.]), 
    array([ 0., 0.]), 
    array([ 0., 0.]), 
    array([ 0., 0.]), 
    array([ 0., 0.]), 
    array([ 0., 0.]), 
    array([ 0., 0.]), 
    array([ 0., 0.]), 
    array([ 0., 0.]), 
    array([ 0., 0.]), 
    array([ 0., 0.]), 
    array([ 0., 0.])]) 

在这种情况下,最佳bogus_function值为:[5,5],这使得等于25.任何想法,如果那种优化是可能的最终最大值?谢谢!

回答

1

正如所写的,x = [0,0]有资格作为局部最小值:您稍稍离开它,并且函数的值不会改变。 你可能想要一些非常量的东西。

一般而言,对于许多优化算法而言,重要的是您的函数是连续的还是可微分的。有些算法可以处理不平滑的问题,有些则没有。

+0

谢谢你,我改变了函数,使它是连续的,并且使用SLSQP方法最小化以在输入上放置边界。 – romsearcher