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

是否存在可将HIGHS求解文件格式转换为GLPK求解文件格式的功能?

是否存在可将HIGHS求解文件格式转换为GLPK求解文件格式的功能?

首先直接给你答案:目前HIGHS官方并没有内置的功能可以直接把它的求解文件转换成GLPK的解文件格式哦。不过你有两个比较实用的替代方案来实现这个需求:


方案一:解析HIGHS解文件,手动生成GLPK格式

因为两种解文件都是结构化的文本格式,你可以自己写个小脚本(比如Python、Shell脚本都可以)来完成转换:

  • 第一步:读取HIGHS的.sol文件,分别提取Columns和Rows部分的名称、数值以及状态信息(比如基础/非基础状态)
  • 第二步:按照GLPK解文件的格式要求,把提取到的信息重新排版写入新文件,注意对应好状态标识的映射(比如HIGHS里的基础变量对应GLPK里的BAS,非基础变量对应NZI这类)

方案二:跳过HIGHS解文件,直接用API生成GLPK格式

这个方案更高效,也避免了解析文件的麻烦——你可以在调用HIGHS求解完成后,直接通过它的Python API获取所有变量和行的求解结果,然后直接组织成GLPK的格式写入文件,不用先生成HIGHS的.sol文件。

给你一个简单的Python代码示例参考:

import highspy

h = highspy.Highs()
filename = 'abc.mps'
h.readModel(filename)

h.setOptionValue("solver","ipm")
h.run()

# 获取核心求解结果
obj_val = h.getObjectiveValue()
num_cols = h.getNumCols()
num_rows = h.getNumRows()

# 映射HIGHS的状态到GLPK的状态标识
col_status_map = {
    highspy.HighsColBasisStatus.kBasic: "BAS",
    highspy.HighsColBasisStatus.kNonbasicLower: "NZI",
    highspy.HighsColBasisStatus.kNonbasicUpper: "NZI",
    highspy.HighsColBasisStatus.kNonbasicFree: "NZI"
}
row_status_map = {
    highspy.HighsRowBasisStatus.kBasic: "BAS",
    highspy.HighsRowBasisStatus.kNonbasicLower: "NZI",
    highspy.HighsRowBasisStatus.kNonbasicUpper: "NZI"
}

# 提取列(变量)的所有信息
col_info = []
for i in range(num_cols):
    name = h.getColName(i)
    val = h.getColSolution()[i]
    status = col_status_map.get(h.getColBasisStatus(i), "NZI")
    col_info.append((status, name, val))

# 提取行的所有信息
row_info = []
for i in range(num_rows):
    name = h.getRowName(i)
    val = h.getRowSolution()[i]
    status = row_status_map.get(h.getRowBasisStatus(i), "NZI")
    row_info.append((status, name, val))

# 写入GLPK格式的解文件
with open("abc_glpk_solution.sol", "w") as f:
    # 写入头部信息
    f.write(f"Problem: {filename}\n")
    f.write(f"Rows: {num_rows}\n")
    f.write(f"Columns: {num_cols}\n")
    f.write(f"Objective: obj = {obj_val:.6f}\n\n")
    
    # 写入行部分
    f.write("Row statuses:\n")
    for status, name, val in row_info:
        f.write(f"{status:4} {name:12} {val:.6f}\n")
    
    # 写入列部分
    f.write("\nColumn statuses:\n")
    for status, name, val in col_info:
        f.write(f"{status:4} {name:12} {val:.6f}\n")

这个示例只是个基础框架,你可以根据自己的实际需求调整数值精度、状态映射的细节,或者补充更多边界情况的处理。


总的来说,虽然没有现成的一键转换功能,但通过上面两种方案都能比较轻松地得到GLPK格式的解文件,第二种方案更推荐,因为它直接和HIGHS的求解结果交互,出错概率更低。

备注:内容来源于stack exchange,提问作者hbstha123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:00:31