微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 for 循环自动创建分段对象

如何解决使用 for 循环自动创建分段对象

我有一个优化公式,其中有多个决策变量,每个决策变量都有自己的二次成本函数项。我计划通过使用 pyomo 中的“分段”函数来使用分段线性近似来简化目标函数。我在一个简单的玩具问题中设法解决了这个问题,其中我只有一个决策变量,当我处理许多决策变量时就会出现问题。必须为每个决策变量用它自己的“分段”函数一个新行是不可行的,所以我试图用一个 for 循环来自动化它,类似于你可以用约束来做到这一点。

这是我正在尝试做的一个示例玩具问题:

import numpy as np

from pyomo.environ import *
from pyomo.core import *
from pyomo.opt import SolverFactory

def cost_function_0(x):
    return x ** 2 + 3 * x + 4

def cost_function_1(x):
    return x ** 2 + 6 * x - 2

xdata = np.linspace(-10,10,50)

ydata_0  = list(cost_function_0(xdata))
ydata_1  = list(cost_function_1(xdata))

xdata = list(xdata)

model = ConcreteModel()

model.N = range(2)

model.X = Var(model.N,bounds=(-10,10))
model.Y = Var(model.N)

model.piecewise_0 = Piecewise(model.Y[0],model.X[0],pw_pts=xdata,pw_constr_type='EQ',f_rule=ydata_0,pw_repn='CC')

model.piecewise_1 = Piecewise(model.Y[1],model.X[1],f_rule=ydata_1,pw_repn='CC')

model.obj = Objective(expr=model.Y[0] + model.Y[1],sense=minimize)

opt = SolverFactory('glpk')
obj_val = opt.solve(model)

print('Decision variables: ',model.X[0].value,model.X[1].value)
print('Objective value: ',model.Y[0].value + model.Y[1].value)

所以我试图用自动 for 循环替换手动创建 Piecewise 对象(model.piecewise_0,model.piecewise_1,....)的过程,但到目前为止我没有运气。

提前致谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。