如何在最大化问题的变量选择中进行有限捆绑约束

How to make limited bundling constraint in variable selection for maximization problem

我正在 select 花费几个小时来解决价格时间序列中的收入最大化问题。

约束条件是 你可以 select # of chances 在每次机会中,您最多可以选择 # 个连续小时。 因此,最大 selected 小时数等于“# of chance” * “# of continuous hours to choose”

例如24小时内, 你最多有3次机会 每次机会最多连续 3 小时 总 select 学时最多可达 9 小时

当价格序列是这样的时候,

那么最佳 selected 时间是: (3, 4, 5), (10, 11, 12), (17, 18, 19)

在 Pyomo 中,我创建了一个符合一般约束条件的代码

我想为 :: 在每次机会中,您最多可以选择连续 # 小时。

不知道你对答案有没有想法。

您的答案可以是通用数学公式、pyomo、GAMS 或任何您喜欢的数学编程语言。

我认为这对你有用。我创建了一个辅助“助手”变量来注释周期开始选择,并用它来限制哪些段是“向上”

有了这个结构,约束就变得更清晰了。一种限制周期开始次数的约束。另一个围绕该选择执行 window。

# price period selector
import pyomo.environ as pe

prices = [1,1,10,10,10,1,1,1,1,20,20,20,1,1,1,1,30,30,30,1,1,1,1,1]
price_dict = {idx: p for idx, p in enumerate(prices)}

dispatch=3
max_up_time=3

m = pe.ConcreteModel()

# sets
m.TIME = pe.Set(initialize=range(len(prices)))

# params
m.P = pe.Param(m.TIME, initialize=price_dict)

# variables
m.u = pe.Var(m.TIME, domain=pe.Boolean)  # true if that period is "on"

# make a second variable, which holds the selected start times
m.selected = pe.Var(m.TIME, domain=pe.Boolean)


###  OBJ  ###
m.OBJ = pe.Objective(expr=sum(m.u[t] * m.P[t] for t in m.TIME), sense=pe.maximize)

###  Constraints  ###

# limit selection of period starts
m.C1 = pe.Constraint(expr=sum(m.selected[t] for t in m.TIME) <= dispatch)

# continuity constraint.  Any "up" segment must be preceeded by a "selection" within window
# this is a lookback constraint.
def continuity(model, t):
    return sum(m.selected[tt] for tt in range(max(t - max_up_time + 1, 0), t+1)) >= m.u[t]  
m.C2 = pe.Constraint(m.TIME, rule=continuity)

# m.pprint()

solver = pe.SolverFactory('cbc')
result = solver.solve(m)

m.display()

产量:

  Variables:
    u : Size=24, Index=TIME
        Key : Lower : Value : Upper : Fixed : Stale : Domain
          0 :     0 :   0.0 :     1 : False : False : Boolean
          1 :     0 :   0.0 :     1 : False : False : Boolean
          2 :     0 :   1.0 :     1 : False : False : Boolean
          3 :     0 :   1.0 :     1 : False : False : Boolean
          4 :     0 :   1.0 :     1 : False : False : Boolean
          5 :     0 :   0.0 :     1 : False : False : Boolean
          6 :     0 :   0.0 :     1 : False : False : Boolean
          7 :     0 :   0.0 :     1 : False : False : Boolean
          8 :     0 :   0.0 :     1 : False : False : Boolean
          9 :     0 :   1.0 :     1 : False : False : Boolean
         10 :     0 :   1.0 :     1 : False : False : Boolean
         11 :     0 :   1.0 :     1 : False : False : Boolean
         12 :     0 :   0.0 :     1 : False : False : Boolean
         13 :     0 :   0.0 :     1 : False : False : Boolean
         14 :     0 :   0.0 :     1 : False : False : Boolean
         15 :     0 :   0.0 :     1 : False : False : Boolean
         16 :     0 :   1.0 :     1 : False : False : Boolean
         17 :     0 :   1.0 :     1 : False : False : Boolean
         18 :     0 :   1.0 :     1 : False : False : Boolean
         19 :     0 :   0.0 :     1 : False : False : Boolean
         20 :     0 :   0.0 :     1 : False : False : Boolean
         21 :     0 :   0.0 :     1 : False : False : Boolean
         22 :     0 :   0.0 :     1 : False : False : Boolean
         23 :     0 :   0.0 :     1 : False : False : Boolean
    selected : Size=24, Index=TIME
        Key : Lower : Value : Upper : Fixed : Stale : Domain
          0 :     0 :   0.0 :     1 : False : False : Boolean
          1 :     0 :   0.0 :     1 : False : False : Boolean
          2 :     0 :   1.0 :     1 : False : False : Boolean
          3 :     0 :   0.0 :     1 : False : False : Boolean
          4 :     0 :   0.0 :     1 : False : False : Boolean
          5 :     0 :   0.0 :     1 : False : False : Boolean
          6 :     0 :   0.0 :     1 : False : False : Boolean
          7 :     0 :   0.0 :     1 : False : False : Boolean
          8 :     0 :   0.0 :     1 : False : False : Boolean
          9 :     0 :   1.0 :     1 : False : False : Boolean
         10 :     0 :   0.0 :     1 : False : False : Boolean
         11 :     0 :   0.0 :     1 : False : False : Boolean
         12 :     0 :   0.0 :     1 : False : False : Boolean
         13 :     0 :   0.0 :     1 : False : False : Boolean
         14 :     0 :   0.0 :     1 : False : False : Boolean
         15 :     0 :   0.0 :     1 : False : False : Boolean
         16 :     0 :   1.0 :     1 : False : False : Boolean
         17 :     0 :   0.0 :     1 : False : False : Boolean
         18 :     0 :   0.0 :     1 : False : False : Boolean
         19 :     0 :   0.0 :     1 : False : False : Boolean
         20 :     0 :   0.0 :     1 : False : False : Boolean
         21 :     0 :   0.0 :     1 : False : False : Boolean
         22 :     0 :   0.0 :     1 : False : False : Boolean
         23 :     0 :   0.0 :     1 : False : False : Boolean

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

  Constraints:
    C1 : Size=1
        Key  : Lower : Body : Upper
        None :  None :  3.0 :   3.0
    C2 : Size=24
        Key : Lower : Body : Upper
          0 :  None :  0.0 :   0.0
          1 :  None :  0.0 :   0.0
          2 :  None :  0.0 :   0.0
          3 :  None :  0.0 :   0.0
          4 :  None :  0.0 :   0.0
          5 :  None :  0.0 :   0.0
          6 :  None :  0.0 :   0.0
          7 :  None :  0.0 :   0.0
          8 :  None :  0.0 :   0.0
          9 :  None :  0.0 :   0.0
         10 :  None :  0.0 :   0.0
         11 :  None :  0.0 :   0.0
         12 :  None :  0.0 :   0.0
         13 :  None :  0.0 :   0.0
         14 :  None :  0.0 :   0.0
         15 :  None :  0.0 :   0.0
         16 :  None :  0.0 :   0.0
         17 :  None :  0.0 :   0.0
         18 :  None :  0.0 :   0.0
         19 :  None :  0.0 :   0.0
         20 :  None :  0.0 :   0.0
         21 :  None :  0.0 :   0.0
         22 :  None :  0.0 :   0.0
         23 :  None :  0.0 :   0.0
[Finished in 3.6s]