我是R的新手,如果问题有点傻,请原谅我.我正在尝试为值函数迭代编写一个简单的while循环.我的函数(optim.routine)使用求解器ipoptr.这是我的代码:
d<-1
old1<-0
old2<-0
num.iter<-0
i.esp<-1e-05
i.T<-100
lb<-0
ub<-10
while (d>i.eps & num.iter<i.T){
new1 <- optim.routine(old1, old2, eval_f=eval_f, eval_grad_f=eval_grad_f, lb=lb, ub=ub, update=FALSE)
d<-dist(c(old1, new1), method="euclidean")
num.iter<-num.iter+1
old1<-new1
}
Run Code Online (Sandbox Code Playgroud)
其中optim.routine是以下函数:
optim.routine<-function(old1, old2, eval_f=obj, eval_grad_f=obj.deriv, lb=lb, ub=ub, update){
if (isTRUE(update)){
var2<-old2
var1<-old1
var1.deriv<-deriv(var1)
optimize <- ipoptr(x0 = old2, eval_f = eval_f, eval_grad_f = eval_grad_f, lb = lb,
ub = ub)
new1<- optimize$objective
new2<- optimize$solution
old2<-new2
old1<-new1
}else{
var2<-old2
var1<-old1
var1.deriv<-vf.deriv(var1)
optimize <- ipoptr(x0 = old2, eval_f = eval_f, eval_grad_f = eval_grad_f, lb …Run Code Online (Sandbox Code Playgroud) 有人在 Anaconda python 上安装过 Ipopt 吗?我下载的是3.6.1版本。此外,我还下载了自述文件中描述的所需的英特尔 Fortran 库。
configure make通过使用并make install链接到它的所有依赖项,安装应该是直接的。我希望我能自己解决这个问题。
如果我想在 anaconda 中使用 Ipopt,我还需要考虑什么?我特别想构建包含 Ipopt 的 Pygmo。
或者安装 pyopt 或 Casadi 就足够了吗?
具有目标平方的优化问题可以使用Python Gekko中的IPOPT成功解决。
from gekko import GEKKO
import numpy as np
m = GEKKO()
x = m.Var(); y = m.Param(3.2)
m.Obj((x-y)**2)
m.solve()
print(x.value[0],y.value[0])
Run Code Online (Sandbox Code Playgroud)
但是,当我切换到绝对值目标np.abs(x-y)(的numpy版本abs或m.abs(x-y)的Gekko版本abs)时,IPOPT求解器报告失败的解决方案。绝对值近似m.sqrt((x-y)**2)也将失败。
解决方案失败
from gekko import GEKKO
import numpy as np
m = GEKKO()
x = m.Var(); y = m.Param(3.2)
m.Obj(m.abs(x-y))
m.solve()
print(x.value[0],y.value[0])
Run Code Online (Sandbox Code Playgroud)
我知道基于梯度的求解器不喜欢没有连续一阶和二阶导数的函数,因此我怀疑这种情况发生abs()在0没有连续导数的点。是否有任何的替代abs(),以可靠地解决在Python壁虎基于梯度的解算器的绝对值?
我即将为实时应用编写一个algorthim,它涉及一些高维NLP(非线性编程).
在实现之前,我需要对算法进行计时,以确定它是否适用于实时应用程序,因此我使用Matlab的内置fmincons作为基线.
根据经验表明,matlab算法的速度往往从慢到低于C++对应物,所以我想估计一下这种特殊情况可以带来什么样的性能提升?
由于我的工作主要与实时应用程序有关,因此我很少使用NLP(非线性编程),所以我问我的同事们,他们建议我尝试ipopt作为开始,我google了它的网站,没有针对Matlab的基准测试关于算法细节也没有太多话题(至少在Matlab中,检查它们的算法的细节并不难),所以我基本上对它的准确性/鲁棒性/最优性等几乎一无所知.
所以关于NLP的C++实现的任何帮助都将非常有用,非常感谢提前.
Pyomo 中多目标优化的任何示例?
我正在尝试最小化 4 个目标(非线性),并且我想使用 pyomo 和 ipopt。还可以访问 Gurobi。
我想看一个非常简单的例子,其中我们尝试针对决策变量列表(不仅仅是一个维度,可能是一个向量)针对两个或多个目标(一个最小化和一个最大化)进行优化。
我拥有的 Pyomo 书(https://link.springer.com/content/pdf/10.1007%2F978-3-319-58821-6.pdf)没有提供任何线索。
我在通过 pyomo 设置 iopt 选项时遇到问题。
对于某些选项,可以简单地使用
executable = os.getcwd()+'/Ipopt/Ipopt/build/bin/ipopt.exe'
opt = SolverFactory("ipopt", executable=executable,solver_io='nl')
opt.options['nlp_scaling_method'] = 'user-scaling'
Run Code Online (Sandbox Code Playgroud)
这很好用。如果我尝试设置“fixed_variable_treatment”选项,即:
opt.options['fixed_variable_treatment'] = 'make_parameter'
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ERROR: "[base]\site-packages\pyomo\opt\base\solvers.py", 599, solve
Solver (asl) returned non-zero return code (1)
ERROR: "[base]\site-packages\pyomo\opt\base\solvers.py", 604, solve
Solver log:
Unknown keyword "fixed_variable_treatment"
Run Code Online (Sandbox Code Playgroud)
我假设这是因为你无法通过 python 设置所有选项?
任何帮助或克服这个问题的方法将不胜感激。谢谢
我正在尝试解决非线性优化问题。我通过创建下面的代码来复制我的问题。Python返回TypeError: object of type 'int' has no len()。如何在约束函数中包含IF语句?
控制台将打印以下内容:
File "<ipython-input-196-8d29d410dcea>", line 1, in <module>
runfile('C:/Users/***/Documents/***/Project/untitled.py', wdir='C:/Users/***/Documents/***/***/Project')
File "C:\Users\***\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 704, in runfile
execfile(filename, namespace)
File "C:\Users\***\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 108, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/***/Documents/***/***/Project/untitled.py", line 27, in <module>
m.Equation(Cx(x1,x2,x3,x4) < 0)
File "C:/Users/***/Documents/***/***/Project/untitled.py", line 17, in Cx
if K > 15:
File "C:\Users\***\Anaconda3\lib\site-packages\gekko\gk_operators.py", line 25, in __len__
return len(self.value)
File "C:\Users\***\Anaconda3\lib\site-packages\gekko\gk_operators.py", line 134, in __len__
return len(self.value)
TypeError: object of type 'int' has no len() …Run Code Online (Sandbox Code Playgroud) 我一直在寻找可以直接处理矩阵变量的 Python 非线性约束优化包(用于处理不一定是凸的问题)。更具体地说,我正在处理优化问题,其中优化变量是矩阵,并且方程两边都是矩阵,存在等式约束。这种优化问题的一个例子是正交 Procrustes 问题 ( https://en.wikipedia.org/wiki/Orthogonal_Procrustes_problem )。
在我的搜索中,我遇到了 SciPy、pyOpt、Ipopt 和 GEKKO,但它们似乎都不直接支持矩阵变量(从我能找到的文档中)。我考虑过在必要时进行一些操作以将矩阵转换为向量,反之亦然(通过numpy.reshape或类似的方式),但我想尽可能避免这种选择。原因是我的问题相当大,不断重塑数组会严重损害优化过程的效率。
有什么建议么?
我正在学习 Pyomo 并尝试使用 ipopt 来解决示例问题。但最初,我已经安装了软件包,然后它总是显示没有找到 ipopt 。之后我重新安装了很多次,现在显示
'''WARNING: Could not locate the 'ipopt' executable, which is required for solver
ipopt
---------------------------------------------------------------------------
ApplicationError Traceback (most recent call last)
<ipython-input-2-2e55f87657f9> in <module>
1 model.N=50
2 instance = model.create_instance()
----> 3 results = opt.solve(instance) # solves and updates instance
D:\Anacondo\lib\site-packages\pyomo\opt\base\solvers.py in solve(self, *args, **kwds)
514 """ Solve the problem """
515
--> 516 self.available(exception_flag=True)
517 #
518 # If the inputs are models, then validate that they have been
D:\Anacondo\lib\site-packages\pyomo\opt\solver\shellcmd.py in available(self, exception_flag) …Run Code Online (Sandbox Code Playgroud) ipopt ×10
python ×5
gekko ×4
pyomo ×3
optimization ×2
c++ ×1
executable ×1
matlab ×1
maximize ×1
minimize ×1
moo ×1
numpy ×1
python-3.x ×1
r ×1