通过Pyomo调用Mosek能否导出opf格式文件?参数失效是否为bug?
问题结论
这个问题是Pyomo的Mosek对接接口的实现缺陷导致,而非Mosek本身的bug。
核心原因
- Pyomo默认会在系统临时目录创建独立的求解工作目录,求解完成后自动清理该目录下的所有文件,就算Mosek生成了opf文件也会被直接删除,不会保留到当前工作目录。
- 多数常用版本的Pyomo Mosek驱动对参数的传递逻辑存在疏漏,部分字符串类型的路径参数、枚举类参数不会被正确传递到Mosek内核。
可行解决方案
你可以绕过Pyomo的默认参数传递逻辑,直接获取Mosek的Task实例手动设置参数并导出文件,修改后代码如下:
import pyomo.environ as pyo import mosek model = pyo.ConcreteModel() model.x = pyo.Var([1,2], domain=pyo.NonNegativeReals) model.OBJ = pyo.Objective(expr = 2*model.x[1] + 3*model.x[2]) model.Constraint1 = pyo.Constraint(expr = 3*model.x[1] + 4*model.x[2] >= 1) opt = pyo.SolverFactory("mosek") # 初始化并获取Mosek原生任务实例 opt._solver_model.init_task() task = opt._solver_model.task # 直接在原生任务实例上设置导出参数 task.putintparam(mosek.iparam.opf_write_problem, mosek.onoffkey.on) # 明确指定opf文件输出到当前工作目录,避免被临时目录清理机制删除 task.putstrparam(mosek.sparam.opf_write_filename, "./test_problem.opf") # 执行求解 res = opt.solve(model)
运行后即可在当前代码目录下看到生成的test_problem.opf文件。
如果不想直接访问Pyomo的私有变量,也可以先将Pyomo模型导出为lp/mps格式文件,再用Mosek原生接口读取文件后导出opf,兼容性更好。
内容的提问来源于stack exchange,提问作者pqrz
相关产品推荐
相关产品推荐

