解析OPL求解文件:命令行整数解XML转变量值方法问询
提取OPL生成的整数解XML文件中的变量值
我来帮你搞定这个OPL整数解XML文件的变量提取问题~你提到用execute { cplex.intsolfileprefix="sofar"; }生成的XML格式中间解文件,其实有好几种实用方法可以提取变量值,甚至能实现你想要的类似execute DISPLAY的实时输出效果:
方法1:用CPLEX命令行直接导出变量值
这是最简单的办法,直接用CPLEX自带的命令行工具读取XML解文件,然后导出成易读的文本:
- 启动CPLEX交互式命令行
- 依次执行以下命令:
执行完后,read sofar1.xml write solution variables.txtvariables.txt里就会清晰列出所有变量的名称和对应取值,直接打开就能看。
方法2:用OPL脚本解析XML文件
如果想在OPL环境里处理,写个小的execute块就能直接解析XML并输出变量值,效果和DISPLAY很像:
execute { // 加载XML解文件 var doc = new IloOplXMLDocument("sofar1.xml"); // 定位到solution和variables节点 var solElem = doc.getElementsByTagName("solution")[0]; var varsElem = solElem.getElementsByTagName("variables")[0]; var varList = varsElem.getElementsByTagName("variable"); // 遍历所有变量节点,打印名称和值 for(var i=0; i<varList.getLength(); i++){ var varElem = varList.item(i); var varName = varElem.getAttribute("name"); var varValue = varElem.getAttribute("value"); writeln(varName, " = ", varValue); } }
把这段代码加到你的OPL模型里运行,就能直接在控制台输出所有变量的取值了。
方法3:用Python手动解析XML
如果更习惯用Python处理,直接用标准库就能搞定,示例代码如下:
import xml.etree.ElementTree as ET # 解析XML文件 tree = ET.parse('sofar1.xml') root = tree.getroot() # 遍历所有variable节点,输出变量名和值 for variable in root.findall('.//variable'): var_name = variable.get('name') var_value = variable.get('value') print(f"{var_name} = {var_value}")
这个脚本不仅能打印变量,还能根据你的需求过滤特定变量,或者把结果保存成CSV文件,灵活性很高。
实现类似execute DISPLAY的实时输出
其实你完全可以不用生成XML文件,直接在OPL里写个回调函数,在找到每个整数解时实时打印变量值,这就是你想要的理想状态:
execute { cplex.intsolfileprefix="sofar"; // 保留XML文件生成(可选) // 定义打印解的函数 function printCurrentSolution() { writeln("\n=== 新找到的整数解 ==="); // 遍历模型里的所有变量 for(var var in thisOplModel) { // 只打印整数变量和浮点变量 if (var.typename == "intVar" || var.typename == "floatVar") { writeln(var.name, " = ", var.solutionValue); } } writeln("====================="); } // 添加CPLEX回调,每次找到新的最优解时触发 cplex.addCallback({ invoke: function(cb) { if (cb.getCallbackType() == IloCplex.CallbackType.IncumbentCallback) { printCurrentSolution(); } } }); }
这段代码会在CPLEX每找到一个新的整数解时,自动在控制台打印所有变量的取值,完全不需要事后处理XML文件,完美替代execute DISPLAY的需求。
内容的提问来源于stack exchange,提问作者healyp
相关产品推荐
相关产品推荐

