MOSEK Fusion Python API:获取优化过程中找到的可行解数量
获取MOSEK优化过程中的可行解数量(Fusion Python API)
针对混合整数规划(MIP)问题
MOSEK求解MIP时会跟踪找到的可行解,你可以通过两种方式获取计数:
1. 解析优化日志统计
MOSEK的日志会记录每次找到可行整数解的事件,你可以捕获日志后统计对应条目数量:
import mosek.fusion as mf import io with mf.Model("mip-example") as model: # 此处添加你的模型构建代码... # 将日志捕获到内存流 log_buffer = io.StringIO() model.setLogHandler(log_buffer) # 执行求解 model.solve() # 统计可行解数量 log_content = log_buffer.getvalue() feasible_count = log_content.count("Int feasible solution found") print(f"累计找到可行解数量: {feasible_count}")
2. 通过回调函数实时计数
注册MIP回调函数,在每次发现新可行解时递增计数器:
import mosek.fusion as mf feasible_count = 0 def mip_callback(phase, callback_info): global feasible_count # 触发条件:找到新的整数可行解 if phase == mf.CallbackPhase.MIP_NEW_INT_POINT: feasible_count += 1 with mf.Model("mip-example") as model: # 此处添加你的模型构建代码... # 注册回调函数 model.setCallback(mip_callback) # 执行求解 model.solve() print(f"累计找到可行解数量: {feasible_count}")
针对连续优化问题(LP/QP等)
连续问题的可行域是连续空间,存在无穷多可行解,MOSEK不会统计可行解数量。这类场景下,你需要通过调整求解停止准则(如时间限制、最优间隙阈值)来平衡求解时间与解的质量。
平衡时间与解质量的参数设置
结合可行解计数需求,你可以通过以下参数控制MIP求解过程:
mipMaxSolutions:设定MOSEK最多寻找的可行解数量,达到后停止求解optimizerMaxTime:设定求解的最长时间限制(单位:秒)mipRelativeGap:设定最优间隙阈值,当间隙小于该值时停止求解
示例参数设置:
# 最多寻找50个可行解 model.setSolverParam("mipMaxSolutions", 50) # 求解最长不超过30秒 model.setSolverParam("optimizerMaxTime", 30.0) # 最优间隙小于1%时停止 model.setSolverParam("mipRelativeGap", 1e-2)
内容的提问来源于stack exchange,提问作者iLoveMosek
相关产品推荐
相关产品推荐

