数学规划求解器lp_solve超详细教程
前言
最近小编学了运筹学中的单纯形法。
于是,很快便按奈不住跳动的心。
这不得不让我拿起纸和笔思考着,
一个至关重要的问题:
如何用单纯形法装一个完备的13?
恰巧,在我坐在图书馆陷入沉思的时候,
一位漂亮的小姐姐靠过来,
说:“同学,你是在看线性规划吗?
你能帮我看看这道题该怎么解好吗?”
纳尼?还真是瞌睡来了送枕头。
但是,尽管心里万马奔腾,
还是要装作若无其事的样子,蛋蛋一笑。
“这个啊,简单!让我来算算。”
但是一拿到题目之后,扫了一眼。
惊得差点没把笔吞下去。
这……城里人都这么会play的吗?
我*,25个变量。
看着那一堆约束条件,
看着这堆变量x1,x2,x3,…,x25。
总感觉,这次真的是玩脱了。
用Table?开什么国际玩笑,
且不说这得算到猴年马月,
在这期间如果搞错一个数,
那简直比吃了老坛酸菜牛肉面还酸爽。
用C++,
写个Simple algorithm用电脑跑一跑?
但是,像小编这种,
上不知虚函数,下不晓纯虚函数,
左不清explicit,右不明volatile。
连虚函数表都说不清道不明的小白,
打个simple algorithm的拼写还差不多。
气氛陷入了尴尬的沉默,
沉默是今晚的康桥。
在我快急哭了的时候,
小姐姐却淡淡一笑。
“解不出来吗?”
“嗯……这个是有点麻烦。”
“哈哈~解不出来也没关系啦。
哎,学弟你想考托福雅思吗?”
小姐姐话锋一转。“嗯哼???”
“我知道有几家托福雅思的培训机构,
那里的老师很厉害,
你可以了解一下哦。”
“……”
“……”
不过话说回来,
对于复杂的线性规划问题,
特别是变量很多的那种,
有什么办法呢?
难道真的要亲自撸一遍单纯形法?
那你就真的是out了。
今天给大家介绍一款神器:lpsolve
一款狂拽炫酷吊炸天阿姆斯特朗回旋加速棒棒的神器。
Part1
科普篇
lpsolve是什么?
lpsolve是sourceforge下的一个开源项目,它的介绍如下:
Mixed Integer Linear Programming (MILP) solver lp_solve solves pure linear, (mixed) integer/binary, semi-cont and special ordered sets (SOS) models.lp_solve is written in ANSI C and can be compiled on many different platforms like Linux and WINDOWS
它的特点有:
- Linear and Integer programming solver
- Sensitivity analysis
- Very strong API with many programming language examples
- IDE
- Open source
- Pure C code
- Windows, Unix, Linux, Mac OSX
- 32 and 64 bit
- Also precompiled binaries provided
它是一个混合整数线性规划求解器,可以求解纯线性、(混合)整数/二值、半连续和特殊有序集模型。并且经过实际验证,有极高的求解效率。
应用领域:科学与研究,高级用户终端,程序开发等
开发语言:C
应用平台:可应用于Linux和WINDOWS等所有平台。
相关资源sourceforge主页:http://sourceforge.net/projects/lpsolve/?source=directory
有关lpsolve的所有资源都可以在这个主页上找到。
包括本文后面介绍的所有文件。
有关lpsolve的详细说明文档:http://web.mit.edu/lpsolve/doc/
Part2
入门篇
简单上手
看完了上面的介绍,相信大部分小伙伴还是一脸懵逼。说了这么多牛逼,转了半天,还没告诉我怎么用呢!(汗)
小编也不指望大家能耐下心来好好去读那让人头大的英语说明文档了。今天,本编就带领大家一步一步上手这个神器的求解器……
说到这里,可能有小伙伴又不乐意了,不会又要撸代码吧?呃……不撸代码是不可能了,这辈子都不可能了。
好在,天无绝人之路,lpsolver也提供了一个简易的IDE(别问我什么是IDE。IDE就是集成开发环境Integrated Development Environment ),提供给像小编这种小白使用。下面就给大家慢慢道来。
LPSolve
IDELPSolve
DE可谓是大大方便了各位新手朋友了。它的界面还算友好,功能十分强大。
界面如下:
image它的介绍如下:
The LPSolve IDE (Integrated Development Interface) is a very user friendly Windows interface to the lpsolve API. All functionality of lpsolve can be accessed via a graphical and very user friendly application.
Many thanks to Henri Gourvest for making this nice interface to lpsolve and making it available to the community.
它的几个特点如下:
- Everything is graphical and mouse controled
- Enter your lp model in all supported formats and even via an XLI interface (See External Language Interfaces)
- Convert your lp model from any supported format to another supported format and even via an XLI interface (See External Language Interfaces)
- Very user friendly editor to enter/change the model with syntax highlight.
- Syntax checking of the model
- Solve the model
- See the results in grids
- Control every possible lpsolve option (tolerances, presolve, scaling, …)
- View the matrix in grids
- Export model to HTML, RTF, LaTeX output
- Export matrix to CSV, HTML, RTF output
- Export results to CSV, HTML, RTF output
- Show statistics about the model.
…只需要把需要求解的线性规划问题输入到求解器里面,然后点一下绿色的run按钮,就能马上出结果了。
image如下面所示:
image关于x,y的取值和目标最优值已经求出来了。还可以进行灵敏度等相关分析:
image上面对应每个约束的条件的影子价格,以及变化范围等等一应俱全。此外,lpsolveIDE还提供了很多选项,大家根据自己的需要勾选相应的功能即可。
imageIDE的使用很简单,在这里不再详细说明了。另外输入语法格式等问题,可以点下面的链接查看详细说明:http://web.mit.edu/lpsolve/doc/
在左侧列表定位到lp file format 即可。
另外,lpsolve还支持其他求解器的语法格式。具体有以下:
- MPS file format
- CPLEX lp file format
- LINDO lp file format
- GNU MathProg file format
- LPFML XML file format
具体说明也可以点击上面提供的链接,左侧定位到
Formulation of an lp model in lpsolve 即可。
怎样?是不是很神奇?
Part3
进阶篇
MPL下调用lpsolve
有些同学问我MPL是什么,我……,MPL就是Mathematical Programming Language 数学编程语言。lpsolve支持很多数学编程语言,有:
- AMPL
- MATLAB
- O-Matrix
- Sysquake
- Scilab
- Octave
- FreeMat
- Euler
- Python
- Sage
- PHP
- R
- Microsoft Solver Foundation
碍于文章篇幅等原因,小编选取几种常用的数学编程语言,来给大家演示怎么在程序里使用lpsolve求解相关线性规划问题。
matlab下使用lpsolve环境配置在sourceforge网站(