Python 约束更好地作为等式(硬)或目标(软)?
Gekko中基于梯度的优化器(APOPT,IPOPT)通常更容易将约束作为目标函数(最小化为零)或方程(将其设置为零)来求解?我举了一个例子。最优目标可以作为一个等式设置为零(硬约束)或最小化为零(软约束)Python 约束更好地作为等式(硬)或目标(软)?,python,nonlinear-optimization,ipopt,gekko,Python,Nonlinear Optimization,Ipopt,Gekko,Gekko中基于梯度的优化器(APOPT,IPOPT)通常更容易将约束作为目标函数(最小化为零)或方程(将其设置为零)来求解?我举了一个例子。最优目标可以作为一个等式设置为零(硬约束)或最小化为零(软约束) 从gekko导入gekko a=1;b=100 打印('精确:',a,a**2) m=GEKKO(远程=False) x=m.Var(0);y=m.Var(0); m、 最小化((a-x)**2+b*(y-x**2)**2) m、 选项。解算器=1;m、 求解(disp=False) 打印(
从gekko导入gekko
a=1;b=100
打印('精确:',a,a**2)
m=GEKKO(远程=False)
x=m.Var(0);y=m.Var(0);
m、 最小化((a-x)**2+b*(y-x**2)**2)
m、 选项。解算器=1;m、 求解(disp=False)
打印('Soft:',x.value[0],y.value[0],'Iterations:',m.options.Iterations)
m=GEKKO(远程=False)
x=m.Var(0);y=m.Var(0);
m、 方程((a-x)**2+b*(y-x**2)**2==0)
m、 选项。解算器=1;m、 求解(disp=False)
打印('Hard:',x.value[0],y.value[0],'Iterations:',m.options.Iterations)
m=GEKKO(远程=False)
x=m.Var(0);y=m.Var(0);
m、 最小化((a-x)**2+b*(y-x**2)**2)
m、 方程((a-x)**2+b*(y-x**2)**2==0)
m、 选项。解算器=1;m、 求解(disp=False)
打印('Both:',x.value[0],y.value[0],'Iterations:',m.options.Iterations)
对所有问题进行概括可能太难了,但我对权衡很感兴趣,特别是对于一些约束可能是软约束、硬约束或两者兼而有之的大规模问题。对于Rosenbrock问题,结果几乎相同,但软约束方法的迭代次数最少
Exact: 1 1
Soft: 0.99999999441 0.99999999029 Iterations: 23
Hard: 0.99969681373 0.99942834333 Iterations: 26
Both: 0.99988305657 0.99978643823 Iterations: 27
Exact: 1 1
Soft: [0.99999467 0.99998932] Iterations: 19
Hard: [0.99986205 0.99963916] Iterations: 22
Both: [1.00013127 1.00021689] Iterations: 23
当可以找到可行的解决方案时,我使用硬约束;当很难找到可行的解决方案时,或者当可以接受但不鼓励违反约束时,我使用软约束。硬约束方程更适合大规模应用,因为约束不是全部集中到一个目标函数值中。优化器使用方程中的梯度信息来寻找可行解的搜索方向。为了进行比较,这里有一个
scipy.optimize.minimize
,用于解决相同的问题
从scipy.optimize导入最小化
定义f(z):
x、 y=z
返回(a-x)**2+b*(y-x**2)**2
sol=最小化(f,[0,0])
打印('Soft:',sol.x,'Iterations:',sol.nit)
定义f(z):
返回0
def con(z):
x、 y=z
返回(a-x)**2+b*(y-x**2)**2
硬={'type':'eq','fun':con}
sol=最小化(f[0,0],约束=硬)
打印('Hard:',sol.x,'Iterations:',sol.nit)
定义f(z):
x、 y=z
返回(a-x)**2+b*(y-x**2)**2
def con(z):
x、 y=z
返回(a-x)**2+b*(y-x**2)**2
硬={'type':'eq','fun':con}
sol=最小化(f[0,0],约束=硬)
打印('Both:',sol.x,'Iterations:',sol.nit)
第一种形式(软约束,目标函数)迭代次数最少
Exact: 1 1
Soft: 0.99999999441 0.99999999029 Iterations: 23
Hard: 0.99969681373 0.99942834333 Iterations: 26
Both: 0.99988305657 0.99978643823 Iterations: 27
Exact: 1 1
Soft: [0.99999467 0.99998932] Iterations: 19
Hard: [0.99986205 0.99963916] Iterations: 22
Both: [1.00013127 1.00021689] Iterations: 23
要回答有关Gekko中特定解算器的问题,可以使用
m.options.SOLVER=0运行以尝试所有可用解算器并显示性能摘要。如果SOLVER=0
,则不会将任何解决方案返回给Gekko,因此除了
块之外,可以通过try
捕获错误
从gekko导入gekko
从scipy.optimize导入最小化
#罗森布鲁克函数
a=1;b=100
打印('精确:',a,a**2)
尝试:
m=GEKKO(远程=False)
x=m.Var(0);y=m.Var(0);
m、 最小化((a-x)**2+b*(y-x**2)**2)
m、 选项。解算器=0;m、 求解(disp=True,debug=0)
除:
通过
尝试:
m=GEKKO(远程=False)
x=m.Var(0);y=m.Var(0);
m、 方程((a-x)**2+b*(y-x**2)**2==0)
m、 选项。解算器=0;m、 求解(disp=True,debug=0)
除:
通过
尝试:
m=GEKKO(远程=False)
x=m.Var(0);y=m.Var(0);
m、 最小化((a-x)**2+b*(y-x**2)**2)
m、 方程((a-x)**2+b*(y-x**2)**2==0)
m、 选项。解算器=0;m、 求解(disp=True,debug=0)
除:
通过
所有解算器(包括BPOPT)都成功地使用了硬约束方法。IPOPT迭代不会自动报告,所以我从解算器打印输出中获取它
Solver Variables Equations Res Evals Jac Evals Iter Info Objective Solution Time Status
----------- --------- --------- --------- --------- ---- ---- ------------ ------------- ---------
APOPT (v1.0) 2 1 30 26 26 0 0.00000E+00 0.065 Success
BPOPT (v1.0) 2 1 0 18 17 0 0.00000E+00 0.004 Success
IPOPT (v3.12) 2 1 22 17 15 0 0.00000E+00 0.019 Success
--------------------------------------------------------------------------------------------------