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

时间:2021-06-09 09:13:26

标签: python optimization pyomo piecewise operations-research

我有一个优化公式,其中有多个决策变量,每个决策变量都有自己的二次成本函数项。我计划通过使用 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],
                      pw_pts=xdata,
                      pw_constr_type='EQ',
                      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, ....)的过程,但到目前为止我没有运气。

提前致谢!

0 个答案:

没有答案
相关问题