是否存在可将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
相关产品推荐
相关产品推荐

