1. GLPK

GLPK全称GNU Linear Programming Kit,是一个开源的求解线性规划问题的工具套件,由c写成,可以求解大规模线性规划问题、混合整数规划问题。GLPK是免费的,在大规模问题上的性能要逊色于商用软件,求解的性能可以参考安装文件doc目录下的miplib2.txt,miplib3.txt和netlib.txt这三个文件,下面是截图:

GLPK安装非常简单,在centos系统下,执行:

sudo yum install glpk

GLPK使用MathProg(mathematical programming language)建模语言,可以使用GLPSOL这个cmd应用来进行交互。作为示例,新建一个文件problem.mod,输入:

var x1;
var x2;
maximize obj: 0.6 * x1 + 0.5 * x2;
s.t. c1: x1 + 2 * x2 <= 1;
s.t. c2: 3 * x1 + x2 <= 2;
solve;
display x1, x2;
end;

然后退出文件编辑,输入glpsol -m p.mod,最后输出了求解结果。

GLPSOL: GLPK LP/MIP Solver, v4.65
Parameter(s) specified in the command line:--math short.mod
Reading model section from short.mod...
9 lines were read
Generating obj...
Generating c1...
Generating c2...
Model has been successfully generated
GLPK Simplex Optimizer, v4.65
3 rows, 2 columns, 6 non-zeros
Preprocessing...
2 rows, 2 columns, 4 non-zeros
Scaling...A: min|aij| =  1.000e+00  max|aij| =  3.000e+00  ratio =  3.000e+00
Problem data seem to be well scaled
Constructing initial basis...
Size of triangular part is 2
*     0: obj =  -0.000000000e+00 inf =   0.000e+00 (2)
*     2: obj =   4.600000000e-01 inf =   0.000e+00 (0)
OPTIMAL LP SOLUTION FOUND
Time used:   0.0 secs
Memory used: 0.1 Mb (102250 bytes)
Display statement at line 8
x1.val = 0.6
x2.val = 0.2
Model has been successfully processed

2. PyMathProg

python环境下可以使用PyMathProg进行建模并用GLPK求解。

pip install pymprog

下面是个简单的例子:

from pymprog import *
begin('bike production')
x, y = var('x, y') # variables
maximize(15 * x + 10 * y, 'profit')
x <= 3 # mountain bike limit
y <= 4 # racer production limit
x + y <= 5 # metal finishing limit
solve()

下面是几种定义变量的方式:

x,y = var('x','y') #默认变量是非负连续变量
z = var('z',3) #非负连续变量数组
a = var('a',kind=bool) #0/1变量。其他还有:float (默认): 连续变量;int: 整数变量;bool: 0/1变量
b = var('b',bounds = (0,5)) #限制上下界的连续变量
cindex = ('c1','c2','c3')
c = var('c',cindex) #使用自定义index set来定义变量

下面是关于index的一些示例:

A = (1, 2, 3) #interable的python类型(比如tuple,list,set……)都可以作为index。
B = (6, 7, 8)
C = iprod(A, B) #可以用这种方式形成更大的index集合。
x = var('x',C) #使用index集合创建变量
x[2,7].name

下面是关于parameter的一些示例:

k = par('k', [2,3,4]) #内容是list/tuple的话,那生成的就是一个parameter的list
p = par('P', {'east':0, 'west':2, 'south':3, 'north':1}) #内容是dict的话,生成的是以dict的key为下标的list
a, b, c = par('a,b,c', 3, (5,2)) #可以一次定义多个参数
r = [{(3,4):3, (1,2):4}, 5]
R = par('R', r) #可以recusive定义参数
x = var('x', 3)
x.value = 10 #可以重新定义参数值

下面是关于contraint的一些示例:

x = var('x', 3)
y = var('y')
c = [6,4,3]
sum(p*q for p,q in zip(c,x)) <= y #可以直接添加约束
st( sum(p*q for p,q in zip(c,x)) <= y ) #也可以用st表明这是一个约束

目标函数定义很简单:

maximize(sum(c[i]*x[i] for i in range(3)), 'Profit')

可以调用的solver有四种,线性规划有simplex、exact、interior三种(默认是simplex),整数规划是intopt,可以显式调用,例如:

solve(simplex)
print(vobj()) #获取目标函数值
print(x.primal) #获取变量求解值

下面是营养问题的综合示例:

from pymprog import *
minlev = group('minlev')
fruits = ('apple', 'pear', 'orange')
nutrit = ('fat', 'fibre', 'vitamin')
ntrmin = ( 10, 50, 30 ) # min nutrition intake
#nutrition ingredients of each fruit
ingred = ('apple': (3,4,5), 'pear': (2,4,1),'orange': (2,3,4))
diet = var('diet', fruits, int)
minimize(sum(diet[frt] for frt in fruits), 'mindiet')
for n, ntr in enumerate(nutrit):minlev[ntr] = sum( diet[frt] * ingred[frt][n] for frt in fruits) >= ntrmin[n]

点击这里可以参考更多例子。

运筹系列10:线性规划开源软件GLPK和PyMathProg相关推荐

  1. 2011 年最重要的 10 个开源软件

    2011 年即将过去,是该对这即将过去的这一年做一个总结,这么一个标题如何去确定其实是很难的,而且也可能会比较片面.那么什么叫做"重要"呢,什么样的开源软件算是"重要&q ...

  2. 2013 年国产开源软件 10 大年度热门项目

    本排行榜主要是针对国产开源软件,榜单涉及的 10 个开源软件并非同类型,尽管放在一起并不是很科学.我们只是从几个角度进行筛选,包括用户访问.软件更新和用户对该软件的讨论等. 1. Goagent Go ...

  3. 开源软件的安全性风险_开源硬件如何提高安全性

    开源软件的安全性风险 硬件黑客之所以特别可怕,是因为它们胜过任何软件安全防护措施,例如,它们可以使服务器上的所有帐户都免密码. 幸运的是,我们可以从软件行业从数十年来与多产的软件黑客作斗争中所学到的知 ...

  4. 系列教程丨用 Docker 探索开源软件 —— PostgreSQL(一)

    出品丨Docker公司(ID:docker-cn) 编译丨小东 每周一.三.五,与您不见不散! Docker 的一大优点是可以让您快速使用它来试用应用程序,而无需直接在开发人员的计算机上安装它.如果您 ...

  5. php制作软件工具,开源10款热门教学相关的开源软件(教学平台和制作工具)

    百年大计,教育为本.本文收录了 2010 年度开源中国社区最受欢迎的 10 款跟教学服务和教学管理相关的开源软件,这些软件多数采用PHP开发,也有Java的系统. 1. BigBlueButton B ...

  6. linux开源软件推荐,10个Linux平台开源ERP软件推荐

    10个最好的自由Linux平台Enterprise Resource Planning (ERP) 软件.经常关注开源软件的朋友,或经常访问Sourceforge.net.apache.org等网站的 ...

  7. 开源软件贡献者Top 10!第一名当之无愧!

    IT界开源贡献Top 10,你认识几个呢? 林纳斯·本纳第克特·托瓦兹 Linux之父 林纳斯·托瓦兹是Linux之父,他是开源理念的发起者之一,他曾经花费了两周时间写出了著名的GIT版本控制器,现在 ...

  8. 免费开源软件专题(2): 10大图形图像编辑处理软件

    http://hi-rain.com/index.php/507 之前,已经介绍了10大网络基础应用的开源软件,今天,就为那些平常喜欢设计的朋友介绍10款免费开源的图形图像编辑软件. 开源的图像和照片 ...

  9. 盘点10大热门区块链开源软件,你知道几个?

    越来越多的企业将开源软件作为其构建基础信息系统的重要选择,"低成本.安全性高.灵活自由.高可用性.协同性好--"一连串的技术优势,让越来越多的企业无法拒绝. 在区块链领域,又有哪些 ...

  10. 高手必备:10大最流行开源软件

    对于开源软件来说,相信每个人心中都会有自己的TOP10,尤其是那些开源软件拥趸者眼中的TOP10,可能会与我们所列的TOP10有些不同.不过,这是经过全球很多开源社区高手共同讨论的结果,我们觉得这个版 ...

最新文章

  1. 如何使python等待按键
  2. 【拥抱大厂系列】面试官100%会严刑拷打的 CMS 垃圾回收器,下次面试就拿这篇文章怼回去!
  3. 微软社区精英计划 - 你会如何回答【6月26日】北京.Net学习活动QA时提出的问题...
  4. vc++栈的简单实现
  5. Qt下Sqlite数据库操作
  6. 快速搭建本地 .NET Core 运行时调试环境
  7. 【火炉炼AI】机器学习006-用决策树回归器构建房价评估模型
  8. STM32工作笔记0091---ADC模数转换实验-M3
  9. wordpress 通过域名无法访问_关于在宝塔面板的基础上搭建Wordpress个人博客的教程...
  10. ASIHTTPRequest
  11. window包管理器
  12. 撸羊毛的一些心得体会
  13. 三星s9Android9内测申请链接,Galaxy S9/S9+国行版进行安卓9.0内测
  14. 计算机发展前沿技术——医学领域的人工智能
  15. 基于学习的方法决定在哪些分支节点上运行heuristic算法
  16. 2012人类将从“微博体”过渡到“微媒体”。至于你信不信,反正我信了
  17. 【数据结构】详解KMP算法
  18. 按键精灵-UI配置丢失问题解决办法
  19. 小鲲Python嘎嘎炫~day1.4
  20. 虚拟主机做游戏服务器,虚拟主机做游戏服务器

热门文章

  1. 公共计算机房电气设计规范,《住宅建筑电气设计规范》(总结版)
  2. 济南遥墙机场停5天怎么收费,济南遥墙国际机场停车场收费标准
  3. 线程安全的几种单例模式
  4. Caffe教程:训练自己的网络结构来分类。
  5. window 上 shell 连接工具
  6. 反向题在测试问卷信效度_[问卷的信度和效度分析]问卷信度和效度分析
  7. Maven无法加载ojdbc14.jar的解决方法
  8. vb.net 画多个矩形_电气原理图和接线图识图方法,电气接线图怎么画?你会画吗?...
  9. 虚拟机安装MAC-OS系统开发非常卡。使用beamoff.zip优化教程
  10. Tomcat原理简述