混合整数规划MIP/线性规划LP+python(cplex库)实现 附代码

喜欢的话请关注我们的微信公众号~《你好世界炼丹师》。

  • 公众号主要讲统计学,数据科学,机器学习,深度学习,以及一些参加Kaggle竞赛的经验。
  • 公众号内容建议作为课后的一些相关知识的补充,饭后甜点。
  • 此外,为了不过多打扰,公众号每周推送一次,每次4~6篇精选文章。

微信搜索公众号:你好世界炼丹师。期待您的关注。


相关知识点

LP线性规划问题

  • Linear Problem
  • [百度百科]:研究线性约束条件下线性目标函数的极值问题的数学理论和方法。
    学过运筹学的小伙伴,可以看这个LP问题的标准型来回顾一下:
    在这里插入图片描述
    不太熟悉的朋友可以看这个例题,再结合上面的标准型,来感受一下:
    在这里插入图片描述

MIP混合整数规划

  • Mixed Integar Planing
  • 混合整数规划是LP的一种,决策变量部分是整数,不要求全部都是整数的规划问题。

MIP的Python实现(docplex库)

我们来解一个这样得简单得题目
在这里插入图片描述

from docplex.mp.model import Model  #导出库,只用这一个就够了
model = Model('LP') #可命名model为 'LP'
var_list = [i for i in range(0, 4)] #创建列表
X = model.continuous_var_list(var_list, lb=0, name='X') #创建变量列表
model.maximize(3 * X[0] + 5 * X[1] + 4 * X[2])  #设定目标函数
#添加约束条件
model.add_constraint(2 * X[0] + 3 * X[1] <= 1500)
model.add_constraint(2 * X[1] + 4 * X[2] <= 800)
model.add_constraint(3 * X[0] + 2 * X[1] + 5 * X[2] <= 2000)
sol = model.solve() #求解模型
print(sol)  #打印结果

但是这样抛出一个错误,目前还不知道怎么解决

在这里插入图片描述
这里给出一个cplex库得解决方法,跟docplex是同一个原理

# 先安装cplex
!pip install cplex

在这里插入图片描述

import cplex
from cplex.exceptions import CplexError
my_obj = [1.0, 2.0, 3.0, 1.0]
my_ub = [40.0, cplex.infinity, cplex.infinity, 3.0]
my_lb = [0.0, 0.0, 0.0, 2.0]
my_ctype = "CCCI"
my_colnames = ["x1", "x2", "x3", "x4"]
my_rhs = [20.0, 30.0, 0.0]
my_rownames = ["r1", "r2", "r3"]
my_sense = "LLE"

try:
    mlp = cplex.Cplex()
    mlp.objective.set_sense(prob.objective.sense.maximize)
    mlp.variables.add(obj=my_obj,
		    lb=my_lb,
		    ub=my_ub,
		    types=my_ctype,
		    names=my_colnames)
    rows = [[["x1","x2","x3","x4"],[-1,1,1,10]],
    	    [["x1","x2","x3"],[1,-3,1]],
    	    [["x2","x4"],[1.0,-3.5]]]
    mlp.linear_constraints.add(lin_expr=rows,
    				senses=my_sense,
    				rhs=my_rhs,
    				names=my_rownames)
    mlp.solve()
 except CplexError as exc:
     print(exc)
print()

输出打印结果

print("Solution status = ",mlp.solution.get_status(),":",end=' ')
print(mlp.solution.status[mlp.solution.get_status()])
print("Solution value = ",mlp.solution.get_objective_value())

numcols = mlp.variables.get_num()
numrows = mlp.linear_constraints.get_num()

slack = mlp.solution.get_linear_slacks()
x = mlp.solution.get_values()
print('x:')
print(x)

在这里插入图片描述

MIP的Python实现(ortool库)

个人而言,还是比较喜欢用ortool来解决MIP问题
混合整数规划MIP/线性规划LP+python(ortool库)实现 附代码

  • 9
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
混合整数线性规划是一种数学问题,它在线性约束条件下寻求线性目标函数的最优解。在混合整数线性规划中,决策变量部分是整数,而不要求全部都是整数。混合整数线性规划问题通常比线性规划问题更难求解。在求解过程中,可以使用分支定界法、割平面法等方法,将问题划分为子问题,并调用线性规划LP)求解模块进行求解。\[2\] Python提供了一些实现混合整数线性规划,其中一个常用的是docplex。docplex提供了MIP(Mixed Integer Programming)的Python实现。使用docplex可以方便地解决混合整数线性规划问题。\[2\] 需要注意的是,大多数广泛使用的线性规划混合整数线性规划都是使用Fortran、C或C++原生编写的。这是因为线性规划需要进行计算密集型的矩阵计算。Python工具只是这些求解器的包装器。\[3\] #### 引用[.reference_title] - *1* [混合整数规划MIP/线性规划LP+python(cplex)实现 代码](https://blog.csdn.net/qq_34107425/article/details/104046037)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [MindOpt对于混合整数线性规划问题如何建模优化(python语言)](https://blog.csdn.net/MindOpt_003/article/details/128446505)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [万字教你如何用 Python 实现线性规划](https://blog.csdn.net/devcloud/article/details/121990568)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值