我正在处理一个优化问题,其中有一个设备是可移位的,可以安排在其他时间而不是它的初始时间表。问题是,这个设备有一个特定的占空比,我的意思是,如果它是开着的,它必须开着至少T_ON小时,不能超过T_ON小时。
有一个二进制变量,I(t)显示设备的ON(1)或OFF(0)状态。在Pyomo中,据我所知,我们不能定义变量的if语句,所以我很难在Pyomo中公式化这个问题。我还试图在下图中制作一个图形版本,我正在寻找。
我真的很感激,如果有人能帮助我的想法,如何公式化这个问题。
干杯!:)
See the graphic here! :)
如果"if"语句在Pyomo中起作用,我将把它写成如下形式:
model.Gen = Set(initialize=RangeSet(0,End_uses -1), doc='set of enduses') #index of end uses
model.T = Set(initialize=RangeSet(0,50-1), doc='Time') #index of data samples
model.taw = SetOf(model.T) # references whatever is in T
#Yes/No of each item (binary variable) --> include or exclude an item
model.I_test=Var(model.Gen,model.T,within=Binary)
#Min Up time
def MinUp(model,g,t):
if t > 0:
if model.I_test[g,t]-model.I_test[g,t-1]>0:
return sum(model.I_test[g,t2] for t2 in model.taw if t2>=t and t2<=t+T_on[g]) >= T_on[g]*(model.I_test[g,t]-model.I_test[g,t-1])
else:
return Constraint.Skip
model.cons5 = Constraint(model.Gen,model.T,rule=MinUp)
我正在寻找一个公式化的问题,甚至是类似的代码,可以帮助我解决这个问题的帮助。
1条答案
按热度按时间izkcnapc1#
您缺少的部分是一个额外的变量,用于跟踪 * 机器在哪个时段启动 *。这将允许使用某些整数运算绘制其他几种类型的约束。下面是几个示例。
从你的问题中并不清楚哪一个对你最有用,你似乎暗示
min_runtime
==max_runtime
,然后你提到占空比,但没有定义它。如果您的规范简化为精确的
n
小时开启,然后最少n
小时关闭,则可以重写下面这些类型的约束之一,使启动后的n
时段为"开启",然后n+1
到2n
时段为关闭,并删除其他约束。代码:
输出(部分):