微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果解决方案不可行,则放宽 Gekko 约束

如何解决如果解决方案不可行,则放宽 Gekko 约束

我正在尝试解决一个 MILP 优化问题,即最大化比率的约束条件,即优化器选择的二进制 decion 变量的尾部总和介于 tail_min 和 tail_max 之间。

但是,考虑到我尝试使用 try 更新的 tail_min 约束,优化器可能会遇到不可行的解决方案,除了阻止并尝试使用更新的 tail_min 值。

我有一种感觉,每当我通过将新的 tail_min 递减 0.005 来更新新的 tail_min 时,Gekko 只是在添加一个新约束,因此它永远不会达到可行的解决方案,因为具有基础 tail_min 的第一个约束仍然存在约束列表。

如何使用新的 tail_min 值实际更新给定的约束,而不是在每次触发 while 循环时堆积约束。

isOpt_Sol = False

m.Maximize( ((m.sum([tl_c[i]*xc[i] for i in range(tot_ean_c)])) + (m.sum([tl_m[j]*xm[j] for j in range(tot_ean_m)])) ) / ((m.sum([to_c[i]*xc[i] for i in range(tot_ean_c)])) + (m.sum([to_m[j]*xm[j] for j in range(tot_ean_m)])) + 1) )

# Constraints :-
m.Equation( (m.sum([tl_c[i]*xc[i] for i in range(tot_ean_c)])) +  (m.sum([tl_m[j]*xm[j] for j in range(tot_ean_m)])) <= tail_max)
m.Equation(m.sum([xc[i] for i in range(tot_ean_c)]) == 1)
m.Equation(m.sum([xm[i] for i in range(tot_ean_m)]) == 1)

while isOpt_Sol==False:
  try:        
    print("ATTEMPTING TO SOLVE with tail_min = ",tail_min)
    m.Equation( (m.sum([tl_c[i]*xc[i] for i in range(tot_ean_c)])) +  (m.sum([tl_m[j]*xm[j] for j in range(tot_ean_m)])) > tail_min)
    m.solve(disp=True)
    isOpt_Sol = True
  except:
    tail_min = tail_min - 0.005
    print("Failed TRYING AGAIN!")
    isOpt_Sol = False

任何帮助将不胜感激!

解决方法

如果您需要更改约束中的值,请使用 m.Param() 并使用 tmin.value 更改该值。

我无法验证解决方案,因为问题不完整,但这里提出了一个建议,您需要实施和验证。

m.Maximize( ((m.sum([tl_c[i]*xc[i] for i in range(tot_ean_c)])) \
             + (m.sum([tl_m[j]*xm[j] for j in range(tot_ean_m)])) ) \
             / ((m.sum([to_c[i]*xc[i] for i in range(tot_ean_c)])) \
             + (m.sum([to_m[j]*xm[j] for j in range(tot_ean_m)])) + 1) )

# Constraints :-
m.Equation( (m.sum([tl_c[i]*xc[i] for i in range(tot_ean_c)])) \
             +  (m.sum([tl_m[j]*xm[j] for j in range(tot_ean_m)])) <= tail_max)
m.Equation(m.sum([xc[i] for i in range(tot_ean_c)]) == 1)
m.Equation(m.sum([xm[i] for i in range(tot_ean_m)]) == 1)

tmin = m.Param(value=tail_min)
m.Equation( (m.sum([tl_c[i]*xc[i] for i in range(tot_ean_c)])) \
             +  (m.sum([tl_m[j]*xm[j] for j in range(tot_ean_m)])) > tail_min)

isOpt_Sol = False
tail_min=0.1
while not isOpt_Sol:
    tail_min = tail_min - 0.005
    tmin.value=tail_min
    print("ATTEMPTING TO SOLVE with tail_min = ",tail_min)
    m.solve(disp=True)
    if m.options.APPSTATUS==1:
        isOpt_Sol=True

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。