JuMP 0.20如何通过!optimize获取松弛解?
嘿,这个问题我太熟悉了!JuMP从0.18版本升级到新API后,solve()函数被optimize!()替代,原来的relaxation=true参数也确实被移除了,但获取MIP松弛解的方法其实更清晰可控了,具体操作如下:
获取JuMP新版本中整数规划松弛解的方法
推荐方法:创建独立的松弛模型
这是最安全且清晰的方式,不会影响原模型的结构:
步骤1:生成松弛模型
使用relax_integrality()函数,它会创建一个原模型的副本,并将所有整数/二进制变量转换为连续变量:# 假设你的原整数规划模型名为model relaxed_model = relax_integrality(model)步骤2:求解松弛模型
用新版的optimize!()求解这个松弛后的模型:optimize!(relaxed_model)步骤3:提取松弛解
求解完成后,用value()函数获取变量的松弛值,比如:# 获取单个变量x的松弛解 x_relaxed = value(relaxed_model[:x]) # 遍历所有变量打印松弛解 for var in all_variables(relaxed_model) println("变量$(name(var))的松弛解:$(value(var))") end
备选方法:临时修改原模型变量类型(不推荐)
如果你不想创建新模型,也可以临时修改原模型中离散变量的类型,求解后再恢复,但这种方式容易因遗漏恢复步骤导致原模型损坏,仅作了解:
# 先保存所有变量的原始类型 original_var_types = Dict(var => variable_type(var) for var in all_variables(model)) # 将所有整数/二进制变量松弛为连续变量 for var in all_variables(model) if variable_type(var) <: Union{Integer, Binary} set_variable_type(var, Continuous) end end # 求解松弛后的原模型 optimize!(model) # 提取松弛解(操作同前) # ... # 务必恢复变量原始类型,避免影响后续使用 for (var, orig_type) in original_var_types set_variable_type(var, orig_type) end
总的来说,优先用relax_integrality()的方法,既简洁又不会破坏原模型的结构,是JuMP官方推荐的做法。
内容的提问来源于stack exchange,提问作者Henrique Andrade
相关产品推荐
相关产品推荐

