scipy 如何最小化等式约束多于自变量约束

fquxozlt  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(144)

我有一个最小化问题:

import numpy as np
from scipy.optimize import Bounds, minimize, fmin_cobyla, linprog

A = \
np.array([[ 0.106667,  0.1333,  0.1333,  0.01],
          [ 0.02,  0.6667,  0.1333,  0.12],
          [0.0933,  0.06667,  0.6,  0.01]])

B = \
np.array([[27],
          [57],
          [28]])

l = \
np.array([[100],
          [40],
          [10],
          [50]])
u = \
np.array([[200],
          [80],
          [20],
          [150]])

def objfun(x):
    return abs(np.sum(x - (u+l)/2))

x0 = \
np.array([[150],
          [60],
          [15],
          [100]])

bounds = Bounds(l, u)

eq_cons1 = {'type': 'eq', 'fun': lambda x: np.matmul(A[0,:],x)-B[0]}
eq_cons2 = {'type': 'eq', 'fun': lambda x: np.matmul(A[1,:],x)-B[1]}
eq_cons3 = {'type': 'eq', 'fun': lambda x: np.matmul(A[2,:],x)-B[2]}
eq_cons = {'type': 'eq', 'fun': lambda x: x%1}
res = minimize(objfun, x0,  method='SLSQP',
               constraints=[eq_cons1, eq_cons2, eq_cons3, eq_cons],
               bounds=bounds)

但添加最后一个约束

eq_cons = {'type': 'eq', 'fun': lambda x: x%1}

使其失败
出现以下错误
等式约束多于自变量(退出模式2)
我们怎样才能恰当地使用scipy来解决这类问题。
例如,我需要x是某个常数k的倍数,这就是为什么我使用模。
谢谢

wmomyfyw

wmomyfyw1#

首先,请注意你的所有向量B,l,u,x0的维数都是2,而你的维数应该是1。这和你上一个问题中的错误是一样的。由于numpy的广播,使用维数错误的np.数组会导致令人惊讶的结果,所以请注意你的数组维数。
一些音符以任意顺序排列:

  • 假设您的向量具有正确的维度,您的前三个约束可以写成单一向量约束函数:lambda x: A @ x - B。这里,@表示矩阵乘法运算符,它在幕后调用np.matmul。这使得代码不那么冗长。
  • 您的初始猜测x0不可行,并且违反了等式约束。
  • 你应该意识到从数学的Angular 来看有些事情是错误的。首先,你的目标函数和最后的约束函数都是不可微的。因此,你的优化问题是不可微的,并且违反了SLSQP算法的数学假设。2这在实践中会导致非常奇怪的结果。你可以通过简单地最小化和的平方而不是绝对值,至少使目标可微。
  • 第二,你有一个四个变量的优化问题,有七个等式约束。注意,你的模约束是一个向量约束,也就是说,它算作四个等式约束。因此,没有什么需要优化的,因为你的问题的解(假设它存在)已经由你的约束给出了。
  • 第三,也是最重要的一点,模约束意味着优化变量应该是整数,这就把问题变成了混合整数非线性优化问题(MINLP),而不是连续非线性优化问题(NLP)。然而,scipy.optimize.minimize只支持后者。

长话短说,你基本上有两个选择:
1.将问题重写为整数优化问题,并使用MINLP求解器求解。还应注意,您的问题也可以用混合整数线性优化问题(MILP)来表示,因为您的目标和模约束中的绝对值可以线性化。
1.你可以用一个平滑的近似值(例如this one)来代替模函数,然后用一个NLP来近似求解MINLP。这里,你可以在目标函数中加入一个惩罚项,惩罚违反模约束的行为,从而试图将解推向整数值。然后,你可以将找到的解舍入到最接近的整数值。

相关问题