相关知识点
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库)实现 附代码