You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Pyomo调用Mosek能否导出opf格式文件?参数失效是否为bug?

问题结论

这个问题是Pyomo的Mosek对接接口的实现缺陷导致,而非Mosek本身的bug。

核心原因

  1. Pyomo默认会在系统临时目录创建独立的求解工作目录,求解完成后自动清理该目录下的所有文件,就算Mosek生成了opf文件也会被直接删除,不会保留到当前工作目录。
  2. 多数常用版本的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 14:54:00