我试图通过要求解输出元素(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)
通过移动窗口对周期子集进行求和来强制执行间距约束,例如:
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 的情况有唯一的解。求解器仅返回每种情况的一个解。如果偏好选择较早的时段,您可能需要添加额外的目标。