DOcplex之简单线性规划建模求解
线性规划
下面以一个简单的线性规划为例,介绍docplex如何求解线性规划。
max 3 * x1 + 5 * x2 + 4 * x3
s.t.
2 * x1 + 3 * x2 <= 1500
2 * x2 + 4 * x3 <= 800
3 * x1 + 2 * x2 + 5 * x3 <= 2000
x1, x2, x3 >= 0
代码先行 show you code
from docplex.mp.model import Model #导出库,只用这一个就够了
model = Model() #创建模型
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) #打印结果
一、创建模型
from docplex.mp.model import Model #导出库,只用这一个就够了
model = Model('线性规划') #创建模型,可命名model为 '线性规划'
此创建好了一个名为model的对象,我们所有变量和约束都是基于这个model,并且 docplex在调用cplex的时候也是导入这个model中的信息。
二、添加变量
线性规划最重要的是创建变量,有连续型,整数型,布尔型(01变量), 本例为连续型变量。
X1 = model.continuous_var(lb=0, name='X1') #此时创建了一个连续变量X1,并且下界为0
但是我们不止一个变量,总不能一个一个写吧,期末考试的运筹学倒是变量不过三五个, 但如果是实际情况,变量可能是15* 15* 5,这就没办法自己写了。 docplex提供了利用list创建变量列表的方法
var_list = [i for i in range(0, num_var)]
[0, 1, 2, 3]
利用这个列表创建变量
X = model.continuous_var(var_list, lb=0, name='X')
我们来print一下创建的变量X
[docplex.mp.Var(type=C,name='X_0'), docplex.mp.Var(type=C,name='X_1'), docplex.mp.Var(type=C,name='X_2')]
此时出现了三个变量,分别是X_0, X_1, X_2, 因为列表是从0开始的,所以创建的名字是X0,X1,X2, 不影响使用,如果不习惯,可以从1开始创建列表
[i for i in range(1, 4)]
这时候打印出来的就是X_1, X_2, X_3了
三、设定目标函数
目标函数max 3 * x1 + 5 * x2 + 4 * x3
model.maximize(3 * X[0] + 5 * X[1] + 4 * X[2])
如果目标函数是min,可以写成
model.minimize()
注意X[0]表示的是读取X变量列表中的第一个变量,也就是name='X_0'的变量, 列表从0或从1开始都只是对变量名字的进行修改,而X[0]是索引X列表中的第二个值,不一样。
四、添加约束
最基础的添加约束语句
model.add_constraint()
2 * x1 + 3 * x2 <= 1500
2 * x2 + 4 * x3 <= 800
3 * x1 + 2 * x2 + 5 * x3 <= 2000
model.add_constraint(2 * X[0] + 3 * X[1] <= 1500)
model.add_constraint(2 * X[1] + 4 * X[2] <= 800)