我是编程的新手,我尝试使用Python解决数学优化问题。
该问题的想法是在遵守某些约束的同时最小化函数的值。这似乎很简单,但是由于某种原因,我得到的结果显然不满足约束条件。
有问题的函数如下(我没有足够的声誉点来发布LaTeX方程的图像):
f(a,b,c,d)= 2 * a + 3 * b + c + 2 * d
受以下约束:
我在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值。我确实尝试过更改优化方法,但没有帮助。
任何建议将不胜感激,谢谢您的阅读!
答案 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)
Hi似乎可以将约束最小化的唯一方法是COBYLA和SLSQP,尤其是当使用'eq'约束时,仅是SLSQP。 这可能有效:
u = min(f,[1.5,0.5,1.5,6.5],constraints=cons,method='SLSQP')