Julia/JuMP中Couenne求解器超时后无法获取可行最优解求助
在Julia/JuMP中使用Couenne求解MINLP无法导出有效可行解的问题
使用Julia/JuMP调用MINLP求解器Couenne时,遇到时限到达后无法导出有效可行解的问题。当设置60秒求解时限结束后,求解状态显示primal_status=FEASIBLE_POINT、termination_status=LOCALLY_SOLVED,但返回的决策变量全为0、目标值为0,完全不符合预期。同一问题用SCIP求解,时限到达后能正常返回中间最优可行解。
配置与代码
Couenne配置文件(couenne.opt)
time_limit 60 allowable_gap 1 allowable_fraction_gap 0.0001 feas_tolerance 0.0001
Julia调用代码
using AmplNLWriter, Couenne_jll model = Model(() -> AmplNLWriter.Optimizer(Couenne_jll.amplexe))
求解日志
Couenne 0.5.8 -- an Open-Source solver for Mixed Integer Nonlinear Optimization Mailing list: couenne@list.coin-or.org Instructions: http://www.coin-or.org/Couenne couenne: ANALYSIS TEST: Reformulating problem: 11.8 seconds NLP0012I Num Status Obj It time Location NLP0014I 1 OPT -0.39672801 76 6.214076 NLP0014I 2 TIME 0 2 0.102525 Loaded instance "\/var\/folders\/sx\/gcm0k6yd7fng162n002d7h440000gp\/T\/jl_Fz3AVB\/model.nl" Constraints: 82 Variables: 1375 (1291 integer) Auxiliaries: 38 (4 integer) Clp0000I Optimal - objective value -3687.1319 Clp0032I Optimal objective -3687.13193 - 0 iterations time 0.002 Clp0000I Optimal - objective value -3687.1319 Cbc0004I Integer solution of -3687.1319 found after 0 iterations and 0 nodes (0.01 seconds) Cbc0001I Search completed - best objective -3687.131929999996, took 0 iterations and 0 nodes (0.01 seconds) Cbc0035I Maximum depth 0, 0 variables fixed on reduced cost Clp0000I Optimal - objective value -3687.1319 "Finished" Linearization cuts added at root node: 0 Linearization cuts added in total: 0 (separation time: 0s) Total solve time: 0.012623s (0.012624s in branch-and-bound) Lower bound: -3687.13 Upper bound: -3687.13 (gap: 0.00%) Branch-and-bound nodes: 0 Performance of FBBT: 0.01599s, 1 runs. fix: 0 shrnk: 1172.2 ubd: 0 2ubd: 2 infeas: 0 ***************************** primal_status=FEASIBLE_POINT termination_status=LOCALLY_SOLVED Solution Status is local optimal solution Objective Value:0.0 Solution for Decision Variables: [0, 0, ..., 0]
排查与解决建议
确认Couenne是否读取到配置文件:Couenne默认读取当前工作目录下的
couenne.opt,但通过AmplNLWriter调用时可能需要显式指定路径,或直接在代码中设置参数:# 显式指定配置文件 model = Model(() -> AmplNLWriter.Optimizer(Couenne_jll.amplexe, ["--couenne_options=./couenne.opt"])) # 或直接在代码中设置参数 set_optimizer_attribute(model, "time_limit", 60) set_optimizer_attribute(model, "allowable_gap", 1) set_optimizer_attribute(model, "allowable_fraction_gap", 0.0001) set_optimizer_attribute(model, "feas_tolerance", 0.0001)强制保留最佳可行解:添加
best_solution参数,确保Couenne在时限到达后返回求解过程中找到的最优可行解:set_optimizer_attribute(model, "best_solution", "yes")检查模型导出的NL文件:启用
keepfiles=true保留临时NL文件,确认模型是否正确导出:model = Model(() -> AmplNLWriter.Optimizer(Couenne_jll.amplexe, keepfiles=true))查看临时目录下的NL文件,验证变量、约束和目标函数是否与预期一致。
调整求解策略:从日志看,Couenne根节点未添加线性化切割且分支定界节点数为0,尝试启用切割增强求解:
set_optimizer_attribute(model, "cutting_plane", "yes") set_optimizer_attribute(model, "max_cuts", 100)更新Couenne版本:当前使用的Couenne 0.5.8版本较旧,可能存在时限处理bug,尝试更新Couenne_jll到最新版本。
内容的提问来源于stack exchange,提问作者GuanghuiLiu
相关产品推荐
相关产品推荐

