单位承诺约束pyomo

问题描述 投票:0回答:1

[我目前尝试使用this单元承诺示例,使用pyomo建立我自己的模型。在定义了打开和关闭变量之后,我努力实现以下方程式:Equation

yalmip示例非常简单:

for k = 2:Horizon
 for unit = 1:Nunits
  % indicator will be 1 only when switched on
  indicator = onoff(unit,k)-onoff(unit,k-1);
  range = k:min(Horizon,k+minup(unit)-1);
  % Constraints will be redundant unless indicator = 1
  Constraints = [Constraints, onoff(unit,range) >= indicator];
 end
end

现在,我只研究一个单元,这给了我这个模型。

model = ConcreteModel()

p = prices
ts = timesteps
ut = min_uptime1

model.x = Var(ts, within = Binary) #onoff
model.v = Var(ts, within = Binary) #switch_on
model.w = Var(ts, within = Binary) #switch_off

def obj_rule(model):
    return sum(p[t] * model.x[t] - 0.001 * (model.v[t] + model.w[t]) for t in ts)
model.revenue = Objective(rule = obj_rule, sense = maximize)
#start-up, shut-down costs will be added

def daily_uptime_rule (model):
    return sum(model.x[t] for t in ts) == 12
model.daily_uptime_rule = \
    Constraint(rule = daily_uptime_rule)

def switch_on(model, t):
    if t == ts[0]:
        return model.v[t] >= 1 - (1 - model.x[t])
    else:
        return model.v[t] >= 1 - model.x[t-1] - (1 - model.x[t])
model.switch_on = \
    Constraint(ts, rule = switch_on)

def switch_off(model, t):
    if t == ts[23]:
        return model.w[t] >= model.x[t]
    else:
        return model.w[t] >= 1 - model.x[t+1] + (model.x[t] - 1)
model.switch_off = \
    Constraint(ts, rule = switch_off)

def min_ut(model, t):
    a = list(range(t, (min(ts[23], t+ut-1)+1)))
    for i in a:
        return model.x[i] >= model.v[t]
model.min_ut = \   
    Constraint(ts, rule = min_ut)

我的问题是,我无法在pyomo中以相同的方式访问变量x。对于每个时间步长t,我们都需要约束t + 1,t + 2,.. t + min_up -1,但是我不能将范围与变量(model.x)一起使用。我可以在pyomo中使用yalmip示例,还是需要新的配方?

optimization constraints pyomo
1个回答
0
投票

好,所以这里看来的根本问题是,您想要做的求和索引取决于不等式的RHS。您可以通过几种方式构造求和的索引。您只需要注意构造的值是有效的即可。这是一个可以帮助您的想法。该玩具模型尝试使x [t]的总和最大化,但仅出于傻笑就限制x [t] <= x [t-1] + x [t-2]。请注意,根据传递的t值“动态”求和范围的构造:

from pyomo.environ import *

m = ConcreteModel()

m.t = Set(initialize=range(5))

m.x = Var(m.t)

# constrain x_t to be less than the sum of x_(t-1), x_(t-2)
def x_limiter(m, t):
    if t==0:
        return m.x[t] <= 1   # limit the first value
    # upperlimit on remainder is sum of previous 2
    return sum(m.x[i] for i in range(t-2, t) if i in m.t) >= m.x[t]
m.c1 = Constraint(m.t, rule=x_limiter)

# try to maximize x
m.OBJ = Objective(expr=sum(m.x[t] for t in m.t), sense=maximize)

solver = SolverFactory('glpk')

m.pprint()

solver.solve(m)

m.display()

完成工作:

  Variables:
    x : Size=5, Index=t
        Key : Lower : Value : Upper : Fixed : Stale : Domain
          0 :  None :   1.0 :  None : False : False :  Reals
          1 :  None :   1.0 :  None : False : False :  Reals
          2 :  None :   2.0 :  None : False : False :  Reals
          3 :  None :   3.0 :  None : False : False :  Reals
          4 :  None :   5.0 :  None : False : False :  Reals

  Objectives:
    OBJ : Size=1, Index=None, Active=True
        Key  : Active : Value
        None :   True :  12.0

最近的帖子也有类似的想法:

Pyomo creating a variable time index

© www.soinside.com 2019 - 2024. All rights reserved.