Scipy最小化不考虑约束

时间:2019-07-03 08:19:56

标签: python optimization scipy

我是编程的新手,我尝试使用Python解决数学优化问题。

该问题的想法是在遵守某些约束的同时最小化函数的值。这似乎很简单,但是由于某种原因,我得到的结果显然不满足约束条件。

有问题的函数如下(我没有足够的声誉点来发布LaTeX方程的图像):

f(a,b,c,d)= 2 * a + 3 * b + c + 2 * d

受以下约束:

  • a + b = 2
  • c + d = 8
  • a + c = 3
  • b + d = 7

我在Python中使用scipy.optimize.minimize尝试解决它,这是我的代码:

import numpy as np
import scipy
from scipy.optimize import minimize as min

def f(x):
    return 2*x[0] + 3*x[1] + x[2] + 2*x[3]

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

u = min(f,[1.5,0.5,1.5,6.5],constraints=cons,method='Nelder-Mead',options={'Disp':True,'maxiter':2})

print(u)
print(f(u.x))

它给我一些不满足等式的a,b,c,d值。我确实尝试过更改优化方法,但没有帮助。

任何建议将不胜感激,谢谢您的阅读!

2 个答案:

答案 0 :(得分:1)

您的目标函数是线性的,并且等式约束是线性的,因此问题很简单,可以手动完成。如果这样做,您将观察到一些有趣的事实:

  • 您的约束之一是多余的。例如,您可以删除a + c = 3,因为该方程式由其他三个隐式表示。

  • 您剩下三个线性方程式和四个未知数。这种系统的解决方案是在四维空间中形成一条直线。关于那条线的有趣之处在于,您的目标函数在其上恒定。线上的每个点的值为19。因此(考虑到不等式约束),线上具有非负坐标的每个点都是一个解决方案。 特别是,您的起点[1.5,0.5,1.5,6.5]即将出现,因此这是一个解决方案。 [1.9, 0.1, 1.1, 6.9][1.65, 0.35, 1.35, 6.65]也是如此,或者实际上是[0, 2, 3, 5] + a*[1, -1, -1, 1]形式中任意分量都不为负的任何点。

答案 1 :(得分:0)

documentation中的

Hi似乎可以将约束最小化的唯一方法是COBYLA和SLSQP,尤其是当使用'eq'约束时,仅是SLSQP。 这可能有效:

u = min(f,[1.5,0.5,1.5,6.5],constraints=cons,method='SLSQP')