Scipy的最小化函数未考虑约束条件

3
我是一个新手程序员,尝试使用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 的值,但这些值并不满足相等关系。我尝试更改优化方法,但没有帮助。

如有建议请不吝赐教,感谢阅读!


你是否使用了错误的方法?从文档中看来,约束最小化的唯一可用方法是COBYLA和SLSQP。 - Matteo Peluso
当我使用SLSQP时,它只会返回我的初始猜测...而对于COBYLA,它会说它无法处理“eq”类型的约束。 - math647032
我尝试了许多不同的初始条件,最优值始终为19,这与您使用SLSQP方法得到的初始条件的值相同。可能是因为您已经获得了最优值,所以返回了原始值。 - Cleb
2个回答

1

你好,来自文档。看起来约束最小化的唯一可用方法是COBYLA和SLSQP,特别是在使用'eq'约束时,只能使用SLSQP。这可能有效:

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

谢谢您的回答,然而当我使用这种方法时,它会返回我的初始猜测。 - math647032
通过更改初始猜测,输出值会发生变化。u = min(f,[1.5,3.5,1.5,6.5],constraints=cons,options={'maxiter':20}) x: array([ 2.75, -0.75, 0.25, 7.75]) - Matteo Peluso
我忘了提到所有的值都必须是正数,我在这里的代码约束中添加了它:{'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]])}, - math647032

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]的点,其中各分量均为非负数,都是解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接