如何在命令行上将cplex * .mod文件转换为glpk * .mod文件?

时间:2016-04-07 01:40:06

标签: cplex ampl glpk mathprog mps

我想使用任何开源解算器将cplex .mod和.dat文件转换为glpk .mod和.dat(单独的模型和数据文件),然后使用不同的数据文件(最好是glpsol)编译模型。 据我所知,glpsol没有为opl cplex .mod文件提供读命令。我不想通过oplrun导出mps或lp文件,然后转换为glpk .mod文件,因为cplex不是开源的,lp / mps格式不会单独转换模型和数据文件。

2 个答案:

答案 0 :(得分:1)

虽然大多数解算器(例如CPLEX和GLPK)都能理解(free-)mps或类似文件(仅包含纯优化问题)。 所有其他功能,如数据库连接,输出设施或分离的数据文件仅在专用的数学/优化编程语言(如OPL和GMPL)中可用。

虽然从数学编程语言到mps或相关的单向转换器很常见 - 但我没有看到任何导入/导出函数或解析器,它们可以将一种数学编程语言翻译成另一种。

我猜你必须自己完成从opl-syntax到gmpl-syntax的翻译工作,以包含结构和功能。由于Cplex和GLPK Solvers在复杂问题上的性能安静不同,因此在开始将模型代码迁移到其他编程语言之前,请先检查是否可以在GLPK中解决导出的.mps文件(在合理的时间内)。 / p>

答案 1 :(得分:1)

这是运行glp-convert .mod-> .lp等的shell脚本glpsol。-

#!/bin/bash
# glp-convert to=lp *.mps
# see also [LPsolve doc on file formats](http://lpsolve.sourceforge.net/5.5/formulate.htm)
# note that glpk .mod is gmpl, not ampl

to=lp

help() {
    cat <<!
--------------------------------------------------------------------------------
glp-convert  [to=glp / lp / mps / freemps]  file*.glp / file*.lp / file*.mod / file*.mps
    converts e.g. file*.mod to file*.lp, gmpl to cplex
    default: to=lp, cplex format
--------------------------------------------------------------------------------
!
    exit
}

case $1 in
to=* )
    export "$1"
    shift
esac

[[ -f $1 ]] ||
    help

glpread() {  # .mod -> --model etc.
    case ${1%.gz} in
    *.glp ) echo --glp ;;
    *.lp )  echo --lp ;;  # cplex
    *.mod ) echo --model ;;  # gmpl math prog lang
    *.mps ) echo --freemps ;;
    * )     exec echo >&2  "? $1 should be .glp .lp .mod or .mps"
    esac
}

#...............................................................................
for file
do
    base=${file##*/}
    base=${base%%.*}
    echo "
-- $file > $base.$to"

    glpsol --check \
        `glpread $file` $file \
        --w$to $base.$to \
        --log $base.convertlog
done