在GLPK

时间:2018-07-25 11:16:56

标签: linear-programming glpk mathprog

我正在尝试使用GLPK解决我有一个分段函数(2个子函数)的优化问题。 简而言之,问题在于通过调度某些(电气)设备的运行来最小化环境中的能源成本。也正在考虑产生能量,使我的目标函数成为以下函数的最小化:

objective function

这个想法是,对于每个瞬间, balance [i] 将存储总体能量平衡(即消耗的能量和产生的能量之差)。因此,如果balance [i]> = 0,则所需的能源量超过了生产量,我们需要从电网购买能源;否则,产量将超过需求,我们可以将多余的能源出售给电网。

对于每个时刻, balance [i] 的值将取决于能源生产,固定能源消耗(两者都是已知的,因此不涉及任何问题变量)以及预定设备的能源消耗(根据问题变量进行计算)。

在尝试使用GLPK对此模型进行建模时,我引入了一个二进制变量,该变量对于每个瞬时i都告诉信号 balance [i] 。想法是将目标函数编写为:

  

最小化obj:总和{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中甚至不可能?

1 个答案:

答案 0 :(得分:1)

您的方法

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是常量。

通常可以进一步简化此构造,但这取决于模型的细节。