在Python中最小化有界多变量约束线性函数?

2024-06-02 17:57:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须最小化以下功能:

def foo(x):
        sigma1 = sum([sum([KS * x[U + e * K + k] for k in range(K)]) for e in range(E)])
        sigma2 = sum([W * c for c in x[U + Y: U + Y + X]])
        sigma3 = sum([T * z for r in x[U + Y + X:]])
        return sigma1 + sigma2 + sigma3

其中,KS,U,K,E,W,Y,X,T是常数,X是范围[0;1]内的数字向量。在

此外,还必须匹配几个约束条件:

^{pr2}$

,其中M、V、D、C是常量,dicts是字典列表,在“ENTRY”键下还携带字典。 初始猜测向量:

init_guess = [1] * (U + C + Y + Z)

最小化:

result = scipy.optimize.minimize(fun=foo, x0=init_guess, method='SLSQP', constraints=cons, options={"maxiter": 5000}, bounds=[(0, 1) for _ in range(len(init_guess))])

但是,输出如下所示:

nfev: 159
fun: 17480.0
status: 6
njev: 1
   x: array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
    1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
    1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
    1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
    1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
    1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
    1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
    1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
    1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
    1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
    1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,
    1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])
 message: 'Singular matrix C in LSQ subproblem'
 jac: array([    0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
       0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
       0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
       0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
       0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
       0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
       0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
       0.,     0.,     0.,     0.,     0.,     0.,     0.,     0.,
      15.,    15.,    15.,    15.,    15.,    15.,    15.,    15.,
      15.,    15.,    15.,    15.,    15.,    15.,    15.,    15.,
      15.,    15.,    15.,    15.,    15.,    15.,    15.,    15.,
      15.,    15.,    15.,    15.,    15.,    15.,    15.,    15.,
      15.,    15.,    15.,    15.,    15.,    15.,    15.,    15.,
      15.,    15.,    15.,    15.,    15.,    15.,    15.,    15.,
      15.,    15.,    15.,    15.,    15.,    15.,    15.,    15.,
      15.,    15.,    15.,    15.,    15.,    15.,    15.,    15.,
      80.,    80.,    80.,    80.,    80.,    80.,    80.,    80.,
      80.,    80.,    80.,    80.,    80.,    80.,    80.,    80.,
      80.,    80.,    80.,  1500.,  1500.,  1500.,  1500.,  1500.,
    1500.,  1500.,  1500.,  1500.,  1500.,     0.])
 nit: 1
 success: False

我不仅不明白它为什么失败,而且还不明白为什么雅可比矩阵虽然计算正确,但在末尾有一个额外的“0”(因此它比初始猜测向量长1个元素)。我尝试过显式地发送Jacobian,但结果还是一样。我不能使用其他最小化方法,因为只有SLSQP可以同时处理“eq”和“ineq”约束以及边界。如果scipy.optimize.minimize.最小化不是一个很好的工具,有人能推荐另一个Python库来解决这个问题吗?我不熟悉线性优化,但我必须用Python来做。在


Tags: infor字典fooinitrangescipy向量