GLPK 中的分段函数建模
Modelling piecewise function in GLPK
我正在尝试使用 GLPK 来解决我有分段函数(2 个子函数)的优化问题。
简而言之,问题是通过安排某些(电气)设备的运行来最小化环境中的能源成本。能量的产生也在考虑之中,使我的 objective 函数成为以下函数的最小化:
这个想法是,对于每个瞬间,balance[i] 将存储整体能量平衡(即消耗的能量和产生的能量之间的差异)。因此,如果 balance[i]>= 0,则能源需求量超过生产量,我们需要从电网购买能源;否则,生产超过需求,我们可以将多余的能源出售给电网。
对于每个时刻,balance[i] 的值将取决于能源生产、固定能源消耗(两者都是已知的,因此不涉及问题变量)和能源预定设备的消耗(作为问题变量的函数计算)。
为了在 GLPK 中对此建模,我引入了一个二进制变量,对于每个时刻 i,它告诉 balance[i] 的信号。这个想法是将 objective 函数写成:
minimize obj: sum {i in k} (z[i]*balance[i]*buy + (1-z[i])*balance[i]*sell)
因此,我希望当 balance[i]>= 0 时 z[i] 为 1,否则 z[i] 为 0 (balance[i] < 0)。
如何定义对 z[i] 的约束?我知道可以在 GLPK 中定义条件约束,但据我所知我不能写:
s.t. zUpperi{i in k: balance[i] >= 0}: z[i] = 1;
因为 balance[i] 取决于问题变量...还有其他表达此约束的方式吗?或者这在 GLPK 中甚至不可能吗?
你的方法
minimize obj: sum {i in k} (z[i]*balance[i]*buy + (1-z[i])*balance[i]*sell)
当您将两个变量相乘时,问题会变成非线性(二次)。一般来说我们可以做到:
minimize obj: sum {i in k} (posbal[i]*buy + negbal[i]*(-sell))
# constraints
posbal[i] - negbal[i] = balance[i]
posbal[i] <= z[i]*maxbal[i]
negbal[i] <= (1-z[i])*maxbal[i]
# bounds
posbal[i] >= 0, negbal[i] >= 0
-maxbal[i] <= balance[i] <= maxbal[i]
z[i] binary
其中 maxbal[i]
是 balance[i]
上的常数边界。我假设 sell,buy
是常量。
通常可以进一步简化此构造,但这取决于模型的细节。
我正在尝试使用 GLPK 来解决我有分段函数(2 个子函数)的优化问题。 简而言之,问题是通过安排某些(电气)设备的运行来最小化环境中的能源成本。能量的产生也在考虑之中,使我的 objective 函数成为以下函数的最小化:
这个想法是,对于每个瞬间,balance[i] 将存储整体能量平衡(即消耗的能量和产生的能量之间的差异)。因此,如果 balance[i]>= 0,则能源需求量超过生产量,我们需要从电网购买能源;否则,生产超过需求,我们可以将多余的能源出售给电网。
对于每个时刻,balance[i] 的值将取决于能源生产、固定能源消耗(两者都是已知的,因此不涉及问题变量)和能源预定设备的消耗(作为问题变量的函数计算)。
为了在 GLPK 中对此建模,我引入了一个二进制变量,对于每个时刻 i,它告诉 balance[i] 的信号。这个想法是将 objective 函数写成:
minimize obj: sum {i in k} (z[i]*balance[i]*buy + (1-z[i])*balance[i]*sell)
因此,我希望当 balance[i]>= 0 时 z[i] 为 1,否则 z[i] 为 0 (balance[i] < 0)。
如何定义对 z[i] 的约束?我知道可以在 GLPK 中定义条件约束,但据我所知我不能写:
s.t. zUpperi{i in k: balance[i] >= 0}: z[i] = 1;
因为 balance[i] 取决于问题变量...还有其他表达此约束的方式吗?或者这在 GLPK 中甚至不可能吗?
你的方法
minimize obj: sum {i in k} (z[i]*balance[i]*buy + (1-z[i])*balance[i]*sell)
当您将两个变量相乘时,问题会变成非线性(二次)。一般来说我们可以做到:
minimize obj: sum {i in k} (posbal[i]*buy + negbal[i]*(-sell))
# constraints
posbal[i] - negbal[i] = balance[i]
posbal[i] <= z[i]*maxbal[i]
negbal[i] <= (1-z[i])*maxbal[i]
# bounds
posbal[i] >= 0, negbal[i] >= 0
-maxbal[i] <= balance[i] <= maxbal[i]
z[i] binary
其中 maxbal[i]
是 balance[i]
上的常数边界。我假设 sell,buy
是常量。
通常可以进一步简化此构造,但这取决于模型的细节。