scipy.optimize紧凑约束

问题描述:

我有一个长度为9的np.array A,它是目标函数中的变量。scipy.optimize紧凑约束

A = [ a1, a2, a3, 
     b1, b2, b3, 
     c1, c2, c3], where a1...c3 are real numbers. 
with constraints: a1 > a2, a2 > a3, 
        b1 > b2, b2 > b3, 
        c1 > c2, c2 > c3 

有没有简单的方法来写约束?目前我有以下代码,但随着数组大小变大,很难将它们全部写入。

cons = (
     {'type':'ineq', 
     'fun': lambda x : np.array([x[0]-x[1]]) 
     } 
    , 
     {'type':'ineq', 
     'fun': lambda x : np.array([x[1]-x[2]]) 
     } 
    , 
     {'type':'ineq', 
     'fun': lambda x : np.array([x[3]-x[4]]) 
     }  
    , 
     {'type':'ineq', 
     'fun': lambda x : np.array([x[4]-x[5]]) 
     } 
    , 
     {'type':'ineq', 
     'fun': lambda x : np.array([x[6]-x[7]]) 
     }  
    , 
     {'type':'ineq', 
     'fun': lambda x : np.array([x[7]-x[8]]) 
     }  
    ) 

我会想象SciPy的喜欢从每个功能,而不是布尔数字输出,让排除了每个功能的两个以上的投入......(*度和所有isht的),你可以做什么就是写一个列表的理解,使功能你...

cons = ({'type':'ineq', 'fun': lambda x: x[i] - x[i+1]} for i in range(len(A)-1)) 

我不知道你为什么会需要减法的结果转换为1长数组,所以我离开了出来..很容易放回

显然,您的约束是每列A应该(按元素)大于或等于其右侧的列。

你可以制定一个单一的,矢量outpur约束如下:

def cons_fun(x): 
    A = x.reshape(3,3) # change "(3,3)" according to the dimensions of A 

    return np.array([A[:,i]-A[:,i+1] for i in range(3-1)]).ravel() # change "3" accordingly 

cons = ({'type':'ineq', 
     'fun' : cons_fun},) 

我与SLSQP经验,矢量输出的限制导致更快的优化时间比提供多个标量输出限制。

+0

非常感谢!这真的很有帮助! – Meng