COIN-OR 是( COmputationalINfrastructure for Operations Research) 的简称。是国际知名的运筹和优化程序包代码开发组织。集结了当今运筹界很多知名的专家学者。
这个网站提供的代码完全开源,在遵循GNU GPL协议下,只要不涉及商业盈利目的,你可以任意下载使用及修改。有些项目已经开发的相当成熟了,如CLP, CBC, OSI, BONMIN, 还有IPOPT等,据说已经被一些知名的软件公司(如IBM, ILOG的(CPLEX), GAMS等)采纳,并考虑合作开发。有些人则本身就是这些公司的研究人员,可以说,这里集结了目前最先进的一些开源优化代码。
虽然这些软件的开发者们用心良苦,热情的和大家分享这些科研成果。然而,真正会使用这些代码的人却少之又少。出现这个现象的原因很多。首先,这些软件多数是在UNIX或Linux下开发的,而后移植到Windows平台上。所以在Windows上操作起来可能比较麻烦。另外,要使用这些代码,你必须具备一定的编程开发水平,以及扎实的优化理论知识。如果你是初学者,以前没有使用过其他的优化软件,如CPLEX,XPressMP, MATLAB, LINGO等,那么我建议你还是暂时不要接触这些开源代码,等有一定的经验后再说。
本篇文字其实是我的操作纪录,方便自己以后查阅才写的,如果有志同道合的朋友看了我这篇文章,那么欢迎交流。
本篇重点讲述如何编译COIN-OR的开源代码。
COIN-OR的代码有一个很大的特点,就是继承性。往往一个软件包里可能包含了很多其他的软件。例如:SYMPHONY。 这是一个mixed-integer linear programs (混合整数线性规划问题)的求解器。提供两种模式:callable library 和standalone command。也就是说,你可以写程序在自己的代码中调用,你也可以使用命令行模式直接调用solver求解问题。如果你打开他的源代码就会发现,这个程序包含了好几个COIN-OR的项目,如: CGL, CLP,OSI, CoinUtils,FlopC++,以及一些第三方软件如, f2clib, BLAS, GLPK 还有著名的LAPACK. 很多人看到这些可能已经晕头转向了。而且,往往是UNIX版,MAC版, WINDOWS版代码混合在一起的。即使编程老手看到了估计都会晕一阵子,这很正常。其实,这些软件包的结构的确是复杂了点。不过,如果你耐心察看使用说明,并仔细的琢磨一下,还是能摸索出一些头绪的。
首先来讲讲如何获得代码。Coin-OR 的主页地址是http://www.coin-or.org/
这里要先说说,COIN-OR的代码分享形式。COIN-OR的代码分享主要有三种,Binaries(编译版),source codes(源代码) 以及 Online Services(在线版)。 每个项目都有源代码版,但是Binaries版就不一定了,而且有的可能只提供UNIX的binarie版。至于Online版目前只有Bonmin, CLP和IPOPT. 具体信息察看网页http://www.coin-or.org/download.html。
先进入COIN-OR的主页,按projects进入COIN-OR所有项目的列表。这里我就以IPOPT为例说明。
首先在列表中找到IPOPT. 他在 Optimization deterministic nonlinear中
点击进入IPOPT的项目主页。这里你需要仔细的阅读项目的说明信息。
我们看到IPOPT的说明如下:
Project Description: (项目的描述)
Ipopt is an open-source solver for large-scale nonlinear continuous optimization. It can be used from modeling environments, such as AMPL, GAMS, or Matlab, and it is also available as callable library with interfaces to C++, C, and Fortran. Ipopt uses an interior point method, together with a filter linear search procedure. 简单来说,这是一个求解大规模连续非线性规划问题的求解器,IPOPT使用的算法是内点法。这个软件支持AMPL和GAMS的模型,也支持Matlab,并且提供了C++,C和Fortran的接口。
Project Manager: andreasw at watson dot ibm dot com (作者就是IBM的人)
Project Home Page: https://projects.coin-or.org/Ipopt(软件发布主页)
Project license: Common Public License 1.0
Third-party Software: (这里是第三方软件的列表)
Package |
Required/Optional |
Blas |
Required (any implementation) |
Lapack |
Optional (any implementation) |
Ampl Solver Library |
Optional |
A sparse linear solver (MA27, MA57, WSMP, Pardiso, MUMPS) |
Required (at least one) |
我们看到,BLAS和一个稀疏线性求解器是必须的,LAPACK和AMPL都是可选的。因为这些软件都是免费的,官方网站直接可以下载,所以建议都下载尝试一下。
Programming Language: C++
Development Status:
Activity Status: |
Active |
Maturity Level: |
4 |
Stable Version Number: |
|
Stable Release Number: |
|
目前稳定的发布版是3.5.5建议下载这个。
Builds and Passes Unit Test On:
Operating System |
Compiler |
Microsoft Windows |
MSVC++/cl |
Microsoft Windows |
CYGWIN/cl |
Microsoft Windows |
CYGWIN/g++ |
Microsoft Windows |
MSys/g++ |
Linux |
g++ |
Linux |
Intel icpc |
Mac OSX |
g++ |
Solaris x86 |
gcc |
Solaris x86 |
sunpro |
AIX |
xlC |
Ipod Linux (no kidding!) |
g++ |
这里是软件的编译和测试平台,这里就看出这个软件已经广泛的移植到很多平台上了。
Project Categories:
Optimization deterministic nonlinear |
这个软件源代码版的下载地址: http://www.coin-or.org/download/source/Ipopt/
编译版的下载地址: http://www.coin-or.org/download/source/Ipopt/
在线帮助文档: http://www.coin-or.org/Ipopt/documentation/
开发文档doxygen的下载地址: http://www.coin-or.org/download/source/Ipopt/ 。
在线帮助文档还有pdf版本的地址 https://projects.coin-or.org/Ipopt/browser/stable/3.2/Ipopt/doc/documentation.pdf?format=raw
具体安装说明和相关资料的下载,都可以在IPOTP的Home page上找到:https://projects.coin-or.org/Ipopt
大家选择下载一个版本。目前这个软件最新版是3.5.5. 下载地址是: http://www.coin-or.org/download/source/Ipopt/Ipopt-3.5.5.zip
下载软件包ipopt-3.5.5.zip后,接下来我们详细说说如何使用。
首先解压缩。解压后,注意两个文件夹,一个是IPOPT,这里放着软件的源代码和工程文件,以及范例等。
另外一个是ThirdParty,这里放第三方软件。注意,由于第三方软件是开源的,IPOPT并没有包含他的源代码,但是,我们前面说过,有些软件是必须要用到的。 所以,我们需要到这些3party的主页上下载这些软件。这点操作起来有点麻烦,我会在后面详细讲到。
我们先进入Ipopt \ MSVisualStudio \ v8 目录,发现这个软件的3.5.5版只提供了VS的v8版工程文件。一些老版本里可能还提供v6,v7版本的工程文件。大家可以根据软件的需要选择合适的VS。我建议就选v8以上的,我用的是VS2008.
双击Ipopt.sln打开工程。里面有2个使用范例,和4个模块工程。
2个范例:
hs071_cpp
IpoptAmplSolver
4个模块:
libCoinBlas
libCoinHSL
libCoinLapack
libIpopt
注意: 2个范例需要调用4个模块, 所以编译的顺序是先编译4个模块,再编译两个调用范例。
注意 libCoinBlas, libCoinHSL 和 libCoinLapack 都是第三方软件。即BLAS, HSL和LACPACK。
所以,编译前需要先上这些软件的主页下载软件。主页地址在前面IPOPT的第三方软件列表中已经提供,直接点击就可以进入下载。
这些3party模块的编译都差不多,所以,我们就以编译BLAS为例说明一下。具体步骤如下:
1. 上BLAS主页下载BLAS http://www.netlib.org/blas/blas.tgz. (直接下载这个压缩包即可)
注意: BLAS是用Fortran写的。而我们的工程需要的是C版的BLAS, 当然你也可以下载CBLAS(主页上有)。我的建议是,就下原版Fortran的。因为首先Fortran版最新最完整。其次CBLAS里混合了一些Fortran文件,不是完全的C版BLAS。其实,我们可以自己制作完整的C版BLAS,使用f2c.exe这个程序把Fortran版的BLAS转换为C版的。编译的时候加个头文件f2c.h和vcf2c.lib就好了。
2. 调用f2c转换Fortran版为C版
关于f2c这个程序,可以在f2c的主页下载: http://www.netlib.org/f2c/
这里我直接我们需要的文件下载地址:
f2c.exe的地址: http://www.netlib.org/f2c/mswin/f2c.exe.gz
f2c.h的地址: http://www.netlib.org/f2c/f2c.h
vcf2c的源代码地址: http://www.netlib.org/f2c/libf2c.zip
这里需要先把vcf2c.zip解压缩,并且把源代码编译一下,生成vcf2c.lib文件。编译过程很简单,代码中已经有VC的makefile文件。只要输入命令:nmake makefile.vc就可以了。编译好后生成vcf2c.lib文件。
这样,我们就收集到了所需的三个文件:f2c.exe,f2c.h和vcf2c.lib
接下来,我们把下载好的BLAS.tgz解压到一个文件夹里,里面有一个scr文件夹,这个文件夹里面包含了所有需要的BLAS源代码。都是*.f格式的Fortran文件。我们把这些文件全部拷贝到ThirdParty\Blas 文件夹里。然后再把准备好的f2c.h也一起放进去。最后使用f2c.exe程序,通过一条DOS命令:f2c.exe *.f
就可以把所有的Fortan代码转成C代码了。转换完后(如果转换过程没有错误),就可以调用另一条DOS命令: del *.f 把Fortran的代码都删除了。(你想保留也无所谓,不过也没什么用处,图占空间!)。
现在,我们已经手动的制作了一个BLAS的C版源代码程序包了。接下来就是修改libCoinBlas工程,编译BLAS。
3. 编译BLAS生成libCoinBlas.lib
首先,我们要在工程文件中加入vcf2c.lib文件。你可以直接把文件加入到工程中。你也可以在工程的设置里,C/C++选项卡中,把vcf2c.lib所在目录添加到附加包含路径里。然后在解决方案的文件管理器里,把所有的Source Files都删除了(因为默认路径不对。其实也可以把BLAS拷贝到默认路径里),再把BLAS里的所有的文件都加进去。最后,选择这个工程项目编译之。如果你前面的操作步骤都正确,那么就会成功的编译出一个lib文件来,输出地址是 Ipopt \ MSVisualStudio \ v8 \ libCoinBlas \ Release \,输出文件名是 libCoinBlas.lib。
至此,libCoinBlas.lib就大功告成了。如果你第一次没有成功,那就仔细的检查一下操作步骤。只要认真仔细,成功就在眼前。
接下来,你需要用同样的方法,把 libCoinHSL 和 libCoinLapack编译成libCoinHSL.lib和 libCoinLapack.lib文件。有点麻烦的是,这两个库都需要使用f2c转换。
然后,再编译最后一个库: libIpopt 库, 生成libIpopt.lib。这个编译就比较容易了,不需要任何修改直接编译既可。
确保上面4个库都编译成功后。就可以使用了。
首先我们可以编译一个例子测试一下。
熟悉例子后,大家就可以编写自己的程序。
如果写程序时遇到什么困难,或者要了解IPOPT的库函数,那么请参考库函数的使用说明:
在线帮助文档: http://www.coin-or.org/Ipopt/documentation/
和开发文档: http://www.coin-or.org/download/source/Ipopt/
相信,看过这篇介绍后,大家对如何使用COIN-OR应该有一些了解了。
kaien
2009/03/03