使用 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 (将#修改为@)