如何强制向量中的特定元素位于 Gekko 的优化解决方案中

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

我试图在长度为 n 的向量中生成 p 记录的最佳组合,同时确保(约束)向量中的特定元素包含在解决方案集 p 中(目前基于二进制值)

我有下面的方程“simu_total_volume”,它确实可以确保解集永远不会超过 p 条记录,但我无法弄清楚如何修改这个方程以确保向量中的特定元素 i 包含在解集中(即使不是最佳的)。 x7 是基于 p 选择包含哪些元素的二元向量。

“劳动节”是一个由 0 组成的向量,除了一个等于 1 的元素(这对应于我想要包含在解决方案集中的元素)。我可以强制这个向量总和为 1,但我不确定如何将其集成到“simu_total_volume”中,以便解决方案符合它。

很抱歉没有包含所有与可重复性相关的信息,但完整的解决方案非常大。

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)]

labor_day = [m.Intermediate(x8[i] * el_cppg['holiday_labor_day_flag'].values[i]) for i in range(n)]

#Require labor day to be in output
m.Equation(sum(labor_day) == 1)

#Limit max output
m.Equation(sum(x7)<=p)

m.Maximize(m.sum(simu_total_volume))

m.options.SOLVER=1

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

有多种方法可以约束数组中的特定元素。这是一个完整的示例,它优化了

X
的元素以最小化总成本。每个元素
X
都可以是
[0,1]
,并且可以使用
sum(X)==2
选择两个元素。

from gekko import GEKKO
m = GEKKO(remote=False)
X = m.Array(m.Var,7,lb=0,ub=1,integer=True)
c = [1.2,0.95,1.3,1.0,0.8,1.25,1.4]
m.Equation(sum(X)==2)
m.Minimize(sum([X[i]*c[i] for i in range(7)]))
m.options.SOLVER=1
m.solve()
print(f'X: {X}')

求解器选择与

c
0.95
0.8
元素相对应的两个最低值:

c = [1.2,0.95,1.3,1.0,0.8,1.25,1.4]
X: [[0.0] [1.0] [0.0] [0.0] [1.0] [0.0] [0.0]]

以下是限制解决方案的几种方法,例如强制始终选择最后一个元素:

添加方程式

m.Equation(X[-1]==1)

设置指定解的上限和下限

X[-1].lower=1
X[-1].upper=1

使用

m.fix()
功能

m.fix(X[-1],1)

添加目标作为软约束

如果添加硬约束给出不可行的解决方案,请使用此方法。这将鼓励选择首选选项,但如果不满足方程则不会强制执行。

m.Minimize(100*(X[-1]-1)**2)

结果

所有这些方法都会返回选择最后一个元素(不是最优)和成本最低的元素的正确解决方案。

X: [[0.0] [0.0] [0.0] [0.0] [1.0] [0.0] [1.0]]
© www.soinside.com 2019 - 2024. All rights reserved.