Gekko 中基于时间的间距约束

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

我试图通过要求解输出元素(x7=1)间隔 s 条记录(周)来约束下面的“simu_total_volume”的向量输出,同时还控制 x7 可以 = 1 的最大次数总计。

下面的代码似乎可以工作,但我不确定如何在 Gekko 中正确地概括这一点。此外,我注意到 x7 的总和从 10(没有间距要求)减少到 8(有间距要求),尽管在给定约束的情况下有足够的空间让 sum(x7) 变为 = 10。任何有关实施间距要求的指导将不胜感激。

from gekko import GEKKO
m = GEKKO(remote=False)
m.options.NODES = 3
m.options.IMODE = 3
m.options.MAX_ITER = 1000

x7 = m.Array(m.Var,(n), integer=True)

i = 0
for xi in x7:
    xi.value = 1
    xi.lower = 0
    xi.upper = 1
    i += 1

simu_total_volume = [m.Intermediate((
(m.max2(0,base_volume[i]*(m.exp(total_vol_fedi[i])-1)) * x3[i] +
m.max2(0,base_volume[i]*(m.exp(total_vol_feao[i])-1)) * x4[i] +
m.max2(0,base_volume[i]*(m.exp(total_vol_diso[i])-1)) * x5[i] +
m.max2(0,base_volume[i]*(m.exp(total_vol_tpro[i])-1)) * x6[i]) + base_volume[i]) * x7[i]) for i in range(n)]

#Limit max promos
m.Equation(sum(x7)<=10)

#Enforce spacing requirements
s = 1
for i in range(n):
    if i < n-1:
        m.Equation(x7[i] + x7[i+s] < 2)

m.Maximize(m.sum(simu_total_volume))

m.solve(disp = True)
python optimization linear-programming gekko mixed-integer-programming
1个回答
0
投票

通过移动窗口对周期子集进行求和来强制执行间距约束,例如:

m.Equation(sum(x[0:3])<=1)
m.Equation(sum(x[1:4])<=1)
m.Equation(sum(x[2:5])<=1)

这是一个测试,显示具有不同间距约束的解决方案,所选的 5 个解决方案中最多有 4 个。间距约束依次为 [0,1,2,3]:

from gekko import GEKKO
m = GEKKO(remote=False)

for s in [0,1,2,3]:
    n = 5
    x = m.Array(m.Var,n,integer=True,value=1,lb=0,ub=1)
    m.Equation(sum(x)<=4)
    for i in range(0,n-s):
       m.Equation(sum(x[i:i+s+1])<=1)
       
    m.Maximize(sum(x))

    m.options.SOLVER=1
    m.solve(disp=False)
    print(f'spacing: {s} solution: {x}')

解决办法是:

spacing: 0 solution: [[0.0] [1.0] [1.0] [1.0] [1.0]]
spacing: 1 solution: [[1.0] [0.0] [1.0] [0.0] [1.0]]
spacing: 2 solution: [[0.0] [1.0] [0.0] [0.0] [1.0]]
spacing: 3 solution: [[1.0] [0.0] [0.0] [0.0] [1.0]]

间距为 0 和 2 的情况有多个解,间距 1 和 3 的情况有唯一的解。求解器仅返回每种情况的一个解。如果偏好选择较早的时段,您可能需要添加额外的目标。

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