【问题标题】:Error obtained with Pyomo/Ipopt when optimizing a customized function优化自定义功能时使用 Pyomo/Ipopt 获得的错误
【发布时间】:2020-04-29 14:12:34
【问题描述】:

我是 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:\Users\A\Anaconda3\Library\bin\ipopt.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.

【问题讨论】:

  • 我不建议在目标中使用随机数生成器。
  • 感谢欧文的评论。是的,从优化的角度来看确实没有意义(我将一些第三方数据替换为随机矩阵只是为了简化问题)。但是,无论是否在目标函数中使用随机数生成器,我都会得到相同的错误。

标签: python optimization pyomo


【解决方案1】:

您遇到的问题是因为您的目标函数没有返回导致标量值的表达式(您可以通过检查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)

请注意,我将np.random.rand 函数中的(100,100) 部分更改为(100,1),因为您的变量model.x 是一个向量。此外,.flatten() 方法会将数组折叠成一维数组。

【讨论】:

  • 感谢您的评论,非常有用!事实上,当我简化我的问题时,我遇到了一个维度问题。对于我的实际问题,我需要 matrix_A 仍然是一个二维数组,因为目标函数将是这样的:obj=sum(vector1+vector2) 其中每个向量都是由相乘产生的,例如:vector1(dim n, dim 1)=(matrix (dim n, dim m)*model.x(dim m,dim 1)**2 (数组每个元素的幂)。与 vector2 相同,但矩阵不同。我是否也应该尝试折叠为一维数组?
  • 很高兴它有帮助。从数学的角度来看,您的公式是有意义的,但请小心,因为某些乘法的 Pyomo 符号可能不同(例如,请参阅我的 return 语句与您的差异)。通常,检查一切是否正常的一种简单方法是在目标上使用 .pprint() 方法,并查看 Expression 是否存在实际表达式或其他需要更正的内容(例如 Numpy 数组)。跨度>
猜你喜欢
  • 2020-04-09
  • 2018-03-01
  • 2019-06-23
  • 1970-01-01
  • 2017-11-10
  • 1970-01-01
  • 2019-09-09
  • 2011-09-07
相关资源
最近更新 更多