如何使用Python-MIP解决优化问题
MIP是基于Python的优化问题建模package,全称是Python- Mixed-Integer Linear Programming。MIP可以调用开源求解器CBC和商用求解器Gurobi。本质上是一套优化建模语言,将建立好的优化模型转化成计算机和求解器能看懂的形式。
Package的主页是https://pypi.org/project/mip/
官方文档和使用手册看这里https://python-mip.readthedocs.io/en/latest/
下面介绍一下如何安装使用MIP建立优化问题的模型,并如何求解。
一、安装
安装很简单,命令是
pip install mip
最新的版本是1.12.0,安装时候可以指定版本
pip install mip==1.12.0
MIP的开发比较活跃,隔几个月就会有新版本发布。在升级的时候一定要注意,千万不要
pip install mip
而应该指定更高的版本号,例如
pip install mip==1.12.0
二、如何建模
首先导入MIP
from mip import *
初始化一个模型
m = Model(solver_name=CBC)
注意,如果不指定求解器,默认是Gurobi。CBC是开源求解器,可以免费试用。
增加变量
x = m.add_var()
通常我们会加入很多相似变量,比如x_ij,这个时候可以使用dict() 去存储变量,便于后续检索。例如可以这样,把变量名字当做字典的key
x = {}
for i in [1, 2, 3]:
x[i] = m.add_var(name=’x’+str(i))
注意,这样做以后,字典里的value是MIP的variable class。并且建议增加变量的时候加上name,便于以后检索。
如果有变量的name,也可以这样得到变量本身
var = m.var_by_name(var_name)
增加约束条件
可以这样:
m += x + y <= 10
也可以这样
m.add_constr(x + y <= 10)
这里也建议给每个constr起个名字。也可以设置一个字典去存储所有约束条件。
这里有一个很有用的函数xsum(),用于求和,比如
m += xsum(w[i]*x[i] for i in range(n) if i%2 == 0) <= c
增加目标函数
默认是minimize,也可以设置maximize
m.objective = minimize(xsum(c[i]*x[i] for i in range(n)))
m.objective = maximize(xsum(c[i]*x[i] for i in range(n)))
存储模型
强调一下MIP是一个很好的优化建模工具。模型建立好以后不需要一定用CBC或者Gurobi求解。如果想用别的求解器,可以先把建立好的模型转成mps格式或者lp格式。
m.write('model.lp')
m.write('model.mps')
多数求解器都可以读lp文件和mps文件,然后去求解。
求解
m.optimize()
返回的是优化模型状态model status,是MIP的另外一个class,OptimizationStatus。
如何想知道某个变量的最优值,可以用x这个属性,比如
Var.x
想知道优化目标函数可以这样
m.objective_value
CBC有时候会返回多个最优值,
m.objective_values
这里是MIP的基本功能,掌握以后可以解决大部分优化模型的建立问题。语法容易上手,和Gurobi非常相似,如果没有Gurobi许可证,MIP是个很好的替代。
- 点赞
- 收藏
- 关注作者
评论(0)