Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 约束更好地作为等式(硬)或目标(软)?_Python_Nonlinear Optimization_Ipopt_Gekko - Fatal编程技术网

Python 约束更好地作为等式(硬)或目标(软)?

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中基于梯度的优化器(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)
打印('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
 --------------------------------------------------------------------------------------------------