如何在最大化问题的变量选择中进行有限捆绑约束
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]
我正在 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]