优化自定义函数时,Pyomo/Ippot出现错误



我是Pyomo和Ipopt的新手。我想使用这些工具来优化非线性优化问题。我在尝试优化函数时出错。

我一直在玩Pyomo提供的例子。我的问题的主要区别是,我想在一个单独的函数中定义目标函数,它意味着用numpy数组进行一些乘法运算,但我认为这两者都可以用Pyomo处理。

我试图尽可能简化我的问题(当然,从优化的角度来看,这没有意义,但这只是为了展示问题(。我的问题看起来像:

import numpy as np
from pyomo.environ import *
def myfunc(model, extra_param):
matrix_A=np.sin(np.random.rand(100,100))+extra_param
return sum(model.x*matrix_A-extra_param)
extra_param=5
model = ConcreteModel()
model.IDX=range(100)
model.x = Var(model.IDX,bounds=(0,1.), initialize=0.99)
model.obj=Objective(expr = myfunc(model,extra_param))
model.pprint()
solver = SolverFactory('ipopt')
solver.solve(model, tee=True)

我收到以下消息:

Ipopt 3.11.1: C:UsersAAnaconda3Librarybinipopt.exe: jacdim: got M = 0, N = 0, NO = 1
ERROR: Solver (ipopt) returned non-zero return code (1)
ERROR: See the solver log above for diagnostic information.

您遇到的问题是因为目标函数没有返回导致标量值的表达式(您可以通过检查model.obj.pprint()的结果来看到这一点(。

像这样的东西可能会做你想做的事:

def myfunc(model, extra_param):
matrix_A=np.sin(np.random.rand(100,1)).flatten() + extra_param
return sum(matrix_A[i] * model.x[i] for i in model.IDX)

注意,我用(100,1)更改了np.random.rand函数中的(100,100)部分,因为变量model.x是一个向量。此外,.flatten()方法会将阵列折叠为1-D。

最新更新