我正在尝试使用 Pyomo 和多个不同大小的索引变量来解决 MIP。我想做的是将变量的结果导出到数据框,以便我可以进一步分析这些结果。我的问题是,我无法找到一种方法来很好地自动化该过程,因为索引变量的大小在每个模型模拟中都可能发生变化。
这是我将创建的一些变量的示例:
import pyomo.environ as pyo
model = pyo.ConcreteModel()
model.T = pyo.RangeSet(0, 10)
model.Generators = pyo.Set(initialize=(['equip_1', 'equip_2']))
model.Storages = pyo.Set(initialize=(['storage_1', 'storage_2']))
model.var_1 = pyo.Var(model.T, model.Generators, domain=pyo.NonNegativeReals)
model.var_2 = pyo.Var(model.T, domain=pyo.NonNegativeReals)
model.var_3 = pyo.Var(model.T, model.Storages, domain=pyo.NonNegativeReals)
model.var_4 = pyo.Var(model.T, model.Generators, domain=pyo.Binary, initialize=0)
# constraints and objective function here, which I don't think are relevant for the question
.
.
.
SolverFactory('cbc').solve(model).write()
Run Code Online (Sandbox Code Playgroud)
现在,我想创建以 model.T 作为索引、变量名称加上 model.Generator 或 model.Storages 作为 multiIndex 列的数据框(我假设它必须是 multiIndex,但也许不是)。我希望它的外观的粗略示例如下所示:
| Var_1 | Var_2 | Var_3 | …Run Code Online (Sandbox Code Playgroud) 我有一个程序,我想最小化两个变量的绝对差(绝对误差函数)。说:
e_abs(x, y) = |Ax - By|; where e_abs(x, y) is my objective function that I want to minimize.
Run Code Online (Sandbox Code Playgroud)
该函数受到以下约束:
x and y are integers;
x >= 0; y >= 0
x + y = C, where C is an arbitrary constant (also C >= 0)
Run Code Online (Sandbox Code Playgroud)
我正在使用 mip 库(https://www.python-mip.com/),我在其中定义了目标函数和约束。
问题是 mip 没有“abs”方法。因此,我必须通过将主要问题分为两个优化子问题来克服这个问题:
e(x, y) = Ax - By
Porblem 1: minimize e(x, y); subject to e(x, y) >= 0
Porblem 2: maximize e(x, y); subject to e(x, y) …Run Code Online (Sandbox Code Playgroud)