Linear programming GLPK中分段函数的建模

Linear programming GLPK中分段函数的建模,linear-programming,glpk,mathprog,Linear Programming,Glpk,Mathprog,我试图用GLPK来解决一个优化问题,我有一个分段函数(2个子函数)。 简言之,问题在于通过安排某些(电气)设备的运行来最小化环境中的能源成本。能量的产生也在考虑之中,使得我的目标函数是以下函数的最小化: 这个想法是,对于每一个瞬间,balance[i]将存储总的能量平衡(即消耗和产生的能量之差)。因此,如果balance[i]>=0,则所需能源量超过生产量,我们需要从电网购买能源;否则,生产将超过需求,我们可以向电网出售多余的能源 对于每个时间瞬间,balance[i]的值将取决于能源生产、固

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

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

对于每个时间瞬间,balance[i]的值将取决于能源生产、固定能源消耗(两者都是已知的,因此不涉及问题变量)和计划设备的能源消耗(作为问题变量的函数计算)

在试图用GLPK对此进行建模时,我引入了一个二进制变量,对于每一个瞬间I,该变量告诉信号平衡[I]。其思想是将目标函数写成:

最小化obj:sum{i in k}(z[i]*余额[i]*买入+(1-z[i])*余额[i]*卖出)

因此,当balance[I]>=0时,我希望z[I]为1,否则z[I]为0(balance[I]<0)

如何定义z[I]上的约束?我知道可以在GLPK中定义条件约束,但据我所知,我无法编写:

s、 t.zUpperi{i在k:balance[i]>=0}:z[i]=1

因为平衡[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
minimize obj:sum{i in k}(posbal[i]*buy+negbal[i]*(-sell))
#约束条件
posbal[i]-negbal[i]=余额[i]
posbal[i]=0

-不,你的结论是错误的。我没有以任何形式摆脱变量
balance
。谢谢你的建议!是的,
buy
sell
都是常量。如果我理解你的建议,这将删除余额[I]
的计算,对吗?我们将产品
z[i]*balance[i]
替换为
posbal[i]
(对于
negbal[i]
)对我来说,问题是,虽然
balance[i]
是基于问题变量计算的,但我仍然需要在其他约束中使用分配给它们的值,并通过对
posbal[i]施加上界
我认为我无法使它与其他变量具有一致的值。也许这不能在LP中完成。。。还是我误解了什么?我错了,你是对的
posbal
negbal
具有所需的值。这解决了我的问题!再次感谢你