数学规划求解器lp_solve超详细教程

本文详细介绍了开源线性规划求解器lpsolve,包括其功能、特点、适用场景和平台。通过科普、入门和进阶篇,逐步解析如何使用lpsolve,包括通过IDE进行简单操作和在多种编程语言(如MATLAB、Python)中的应用。文章提供了实际操作示例,适合初学者和开发者快速上手。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近小编学了运筹学中的单纯形法。
于是,很快便按奈不住跳动的心。
这不得不让我拿起纸和笔思考着,
一个至关重要的问题:
如何用单纯形法装一个完备的13?

恰巧,在我坐在图书馆陷入沉思的时候,
一位漂亮的小姐姐靠过来,
说:“同学,你是在看线性规划吗?
你能帮我看看这道题该怎么解好吗?”

纳尼?还真是瞌睡来了送枕头。
但是,尽管心里万马奔腾,
还是要装作若无其事的样子,蛋蛋一笑。
“这个啊,简单!让我来算算。”

但是一拿到题目之后,扫了一眼。
惊得差点没把笔吞下去。
这……城里人都这么会play的吗?
我*,25个变量。
看着那一堆约束条件,
看着这堆变量x1,x2,x3,…,x25。
总感觉,这次真的是玩脱了。

用Table?开什么国际玩笑,
且不说这得算到猴年马月,
在这期间如果搞错一个数,
那简直比吃了老坛酸菜牛肉面还酸爽。

用C++,
写个Simple algorithm用电脑跑一跑?
但是,像小编这种,
上不知虚函数,下不晓纯虚函数,
左不清explicit,右不明volatile。
连虚函数表都说不清道不明的小白,
打个simple algorithm的拼写还差不多。

气氛陷入了尴尬的沉默,
沉默是今晚的康桥。
在我快急哭了的时候,
小姐姐却淡淡一笑。

“解不出来吗?”
“嗯……这个是有点麻烦。”
“哈哈~解不出来也没关系啦。
哎,学弟你想考托福雅思吗?”
小姐姐话锋一转。“嗯哼???”
“我知道有几家托福雅思的培训机构,
那里的老师很厉害,
你可以了解一下哦。”
“……”
“……”

image

不过话说回来,
对于复杂的线性规划问题,
特别是变量很多的那种,
有什么办法呢?
难道真的要亲自撸一遍单纯形法?
那你就真的是out了。

今天给大家介绍一款神器:lpsolve
一款狂拽炫酷吊炸天阿姆斯特朗回旋加速棒棒的神器。

![image](http://upload-images.jianshu.io/upload_images/10386940-3beaf0c8e3caa650?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

欲下载本文相关的代码及算例,请关注公众号【程序猿声】,后台回复【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的所有资源都可以在这个主页上找到。
包括本文后面介绍的所有文件。

image

有关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还提供了很多选项,大家根据自己的需要勾选相应的功能即可。

image

IDE的使用很简单,在这里不再详细说明了。另外输入语法格式等问题,可以点下面的链接查看详细说明: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网站(https://sourceforge.net/projects/lpsolve/files/lpsolve/5.5.2.0/

下载相应系统所需的文件,如需配置matlab中的lpsolve则下载xxx_dev_win64/32以及xxx_MATLAB_exe_win64/32,不过在此之前你需要先确认自己的操作系统是多少位的,一般来说都是64位的Windows 10操作系统了。 如图所示:

32位系统请下载这两个文件:

64位系统请下载这两个文件:

image

由于小编的电脑是64位win 10系统,所以下面的演示都是基于64位Windows系统的演示。
将下载的两个文件夹解压:

image

先进入文件夹lp_solve_5.5.2.0_MATLAB_exe_win64:

image

将解压后…\lp_solve_5.5.2.0_MATLAB_exe_win64\bin\win64目录下的mxlpsove.mexw64拷贝到…\lp_solve_5.5.2.0_MATLAB_exe_win64根目录下,如图所示:

image

image

注意:如果系统是32位的,则将mxlpsolve.dll文件一同拷贝到根目录下。
下面设置 matlab 的 path 变量,使其能搜索到 lp_solve_5.5.2.0_MATLAB_exe_win32 目录,在 命令行窗口中输入: pathtool,并添加刚刚解压设置好的lp_solve_5.5.2.0_MATLAB_exe_win32 目录到 path 中,保存。设置如下图:

image

这时心急的小伙伴感觉打开MATLAB运行一下,结果还是会出错。会提示:

image

这下哦豁了。心急吃不了热豆腐,我们还需要在做一步工作。在之前下载的lp_solve_5.5.2.0_dev_win64文件夹中找到lpsolve55.dll文件,

image

然后在matlab命令行窗口输入“!path”命令 (注意,不是 path 命令,前面多了个英文状态下的感叹号) ,输出结果包含一堆路径:

PATH=C:\Program Files\MATLAB\R2014b\bin\win64;C:\ProgramData\Oracle\Java\javapath;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;…..(此处省略一万字)…..;C:\Users\xuesheng\AppData\Local\GitHubDesktop\bin;

其中每个目录都是以分号隔开的。我们lpsolve55.dll文件拷贝到任意一个目录下都可行的,如果不可行,那原因很有可能是(敲黑板!)因为下载的.dll文件版本不是对应64位的,如果是按照第一步下载的dev压缩包,那应该是不会出问题的。

在 matlab 中 输入 mxlpsolve 命令进行测试,如果输出如下信息表明配置成功。则可以愉快的运行啦~:
mxlpsolve MATLAB Interface version 5.5.0.6using lpsolve version 5.5.2.0Usage: [ret1, ret2, …] = mxlpsolve(‘functionname’, arg1, arg2, …)

至此,环境配置完成。

如何调用

以一个具体的例子说明用lpsolve求解数学规划问题的方法。

假设我们要用matlab解决如下线性规划问题:

max x1 + 3x2 + 6.24x3 + 0.1x4
s. t. 78.26x2 + 2.9x4 >= 92.3

0.24x1 + 11.31x3 <= 14.8
12.68x1 + 0.08x3 + 0.9x4 >= 4
x1 >= 28.6
x4 >= 18
x4 <= 48.98

matlab语句如下:

 1>> lp=mxlpsolve('make_lp', 0, 4);
 2>> mxlpsolve('set_verbose', lp, 3);
 3>> mxlpsolve('set_obj_fn', lp, [1, 3, 6.24, 0.1]);
 4>> mxlpsolve('add_constraint', lp, [0, 78.26, 0, 2.9], 2, 92.3);
 5>> mxlpsolve('add_constraint', lp, [0.24, 0, 11.31, 0], 1, 14.8);
 6>> mxlpsolve('add_constraint', lp, [12.68, 0, 0.08, 0.9], 2, 4);
 7>> mxlpsolve('set_lowbo', lp, 1, 28.6);
 8>> mxlpsolve('set_lowbo', lp, 4, 18);
 9>> mxlpsolve('set_upbo', lp, 4, 48.98);
10>> mxlpsolve('set_col_name', lp, 1, 'COLONE');
11>> mxlpsolve('set_col_name', lp, 2, 'COLTWO');
12>> mxlpsolve('set_col_name', lp, 3, 'COLTHREE');
13>> mxlpsolve('set_col_name', lp, 4, 'COLFOUR');
14>> mxlpsolve('set_row_name', lp, 1, 'THISROW');
15>> mxlpsolve('set_row_name', lp, 2, 'THATROW');
16>> mxlpsolve('set_row_name', lp, 3, 'LASTROW');
17>> mxlpsolve('write_lp', lp, 'a.lp');
18>> mxlpsolve('get_mat', lp, 1, 2)
19
20ans =
21
22   78.2600
23
24>> mxlpsolve('solve', lp)
25
26ans =
27
28     0
29
30>> mxlpsolve('get_objective', lp)
31
32ans =
33
34   31.7828
35
36>> mxlpsolve('get_variables', lp)
37
38ans =
39
40   28.6000
41         0
42         0
43   31.8276
44
45>> mxlpsolve('get_constraints', lp)
46
47ans =
48
49   92.3000
50    6.8640
51  391.2928

如果需还要其他功能,请参考包含完整API文档的网址(重要,推荐看!!!):http://web.mit.edu/lpsolve/doc/MATLAB.htm

从以上的过程我们看到用 lpsolve 建立一个规划问题的代码还是够麻烦的,想必你刚开始看到上面那些语句的时候,也是一头雾水。不要着急,对于这类简单的问题,还有更简便的方法。

lpsolve 为我们提供了一种简化的途径,我们注意到以上文件列表中有一个lp_maker.m和lp_solve.m文件。lp_maker.m文件的功能是创建一个(混合整数)线性规划问题,调用格式类似于其他matlab自带的优化工具箱,你只需要为它提供f、A、b、l、u几个矩阵,它会自动为你实现创建模型、设置目标函数、添加约束的过程

从以上的过程我们看到用 lpsolve 建立一个规划问题的代码还是够麻烦的,想必你刚开始看到上面那些语句的时候,也是一头雾水。不要着急,对于这类简单的问题,还有更简便的方法。

Python下使用lpsolve

环境配置

lpsolve目前最新也只能支持到Python2.6版本而已了,所以下面的演示也是基于Python2.6版本的,系统是64位Windows10系统。

首先大家根据自己的系统版本下载相应的包。

image

然后在电脑上把Python2.6版本也给装上。

把刚刚下载的包解压出来,找到如下文件,双击安装,然后一路向西即可。(注意,此步要先安装好Python2.6版本。)

image
image

最后还有一步,就是把之前lp_solve_5.5.2.0_dev_win64包下的dll文件复制到C:\Windows\System32目录里面。

image

复制到C:\Windows\System32:
image

最后,打开Python2.6(如果电脑装了多个Python,注意打开的版本。),输入:

>>> from lpsolve55 import *
>>> lpsolve()
如果显示以下信息,则大功告成:
image

至此,环境配置已经完成。
Python调用

在Python下,lpsolve 同样为我们提供了一种简化的途径。直接举个例子吧。

假如我们要用Python解决以下线性规划问题:

max 4x1 + 2x2 + x3
s. t. 2x1 + x2 <= 1
x1 + 2x3 <= 2
x1 + x2 + x3 = 1
x1 >= 0
x1 <= 1
x2 >= 0
x2 <= 1
x3 >= 0
x3 <= 2

从中我们可以得出几个相关矩阵:

f = [4, 2, 1]
A = [[2, 1, 0], [1, 0, 2], [1, 1, 1]]
b = [1, 2, 1]

注意到我们的单个变量约束并没有放进条件约束里面,lp_solve 可以设置单个变量的界限,它们是:

l = [ 0, 0, 0]
u = [ 1, 1, 2]

现在在Python里输入下面代码:

1>>> f = [4, 2, 1]
2>>> A = [[2, 1, 0], [1, 0, 2], [1, 1, 1]]
3>>> b = [1, 2, 1]
4>>> l = [ 0, 0, 0]
5>>> u = [ 1, 1, 2]

然后开始求解我们的问题:

 1>>> from lpsolve55 import *
 2>>> from lp_maker import *
 3>>> lp = lp_maker(f, A, b, [-1, -1, 0], l, u, None, 1, 0)
 4>>> solvestat = lpsolve('solve', lp)
 5>>> obj = lpsolve('get_objective', lp)
 6>>> print obj
 72.5
 8>>> x = lpsolve('get_variables', lp)[0]
 9>>> print x
10[0.5, 0.0, 0.5]
11>>> lpsolve('delete_lp', lp)

关于Python下使用lpsolve的更多说明,请访问:http://web.mit.edu/lpsolve/doc/

左侧定位到Using lpsolve from Python即可。

Part4

实战篇

高级编程语言使用lpsolve

上面讲了几种MPL怎么调用lpsolve,可能又有部分小伙伴不乐意了。咱平时撸的都是C/C++、Java这等高级语言的代码啊,哪里用过什么MATLAB什么的。别急,万能lpsolve怎么可能不支持高级编程语言呢!下面小编就一一为各位看官道来。

lpsolve支持以下几种编程语言:

  • C/C++
  • Java
  • Delphi, Free Pascal
  • VB, VBScript
  • http://VB.NET
  • C#.NET

官方介绍如下:

In several cases it is required that the solver is called from within the programming language in which an application is build. All the data is in memory and no files are created to provide data to the solver. lpsolve has a very rich, yet easy, API to do this.

碍于文章篇幅,我们还是挑几个大家常用的语言来讲解吧~。

C/C++使用lpsolve

在C/C++下配置lpsolve确实有点麻烦,所以,这里大家一定要看仔细,操作仔细了。每一步都不能出错,不然很难把程序编译出来的。

首先,大家找到去在sourceforge网站(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值