代码之家  ›  专栏  ›  技术社区  ›  datadude558

如何在Gekko中强制向量中的特定元素成为优化解决方案

  •  1
  • datadude558  · 技术社区  · 2 年前

    我试图在长度为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
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   John Hedengren    2 年前

    有多种方法可以约束阵列中的特定元素。以下是一个完整的示例,它优化了的元素 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]]