问题描述
我正在尝试解决一个 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