喜欢的话请关注我们的微信公众号~《你好世界炼丹师》。
- 公众号主要讲统计学,数据科学,机器学习,深度学习,以及一些参加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库)实现 附代码