如何使用Python-MIP解决优化问题

网友投稿 1186 2022-05-30

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

如何使用Python-MIP解决优化问题

二、如何建模

首先导入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是个很好的替代。

EI智能体 运筹优化 EI创新孵化Lab EI企业智能

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《敏捷软件开发:用户故事实战》—细节在哪里?
下一篇:Vue进阶(十三):MOCK
相关文章