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

举报
大麦字 发表于 2020/10/27 05:53:15 2020/10/27
【摘要】 MIP是基于Python的优化问题建模package,全称是Python- Mixed-Integer Linear Programming。MIP可以调用开源求解器CBC和商用求解器Gurobi。本质上是一套优化建模语言,将建立好的优化模型转化成计算机和求解器能看懂的形式。

MIP是基于Python的优化问题建模package,全称是Python- Mixed-Integer Linear ProgrammingMIP可以调用开源求解器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)

注意,如果不指定求解器,默认是GurobiCBC是开源求解器,可以免费试用。

 

增加变量

x = m.add_var()

通常我们会加入很多相似变量,比如x_ij,这个时候可以使用dict() 去存储变量,便于后续检索。例如可以这样,把变量名字当做字典的key

x = {}

for i in [1, 2, 3]:

x[i] = m.add_var(name=’x’+str(i))

注意,这样做以后,字典里的valueMIPvariable 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的另外一个classOptimizationStatus

如何想知道某个变量的最优值,可以用x这个属性,比如

Var.x

想知道优化目标函数可以这样

m.objective_value

CBC有时候会返回多个最优值,

m.objective_values

 

这里是MIP的基本功能,掌握以后可以解决大部分优化模型的建立问题。语法容易上手,和Gurobi非常相似,如果没有Gurobi许可证,MIP是个很好的替代。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。