摘要:当前使用Python求解混合整数规划问题的实例大多使用了cplex库。本文基于教材上的混合整数规划和0-1整数规划两道例题,尝试使用Python语言予以解决,得到的答案与教材上一致。现将有关求解过程及代码附上,以期对运筹学初学者有所裨益。
关键词:整数规划; 0-1规划; cplex;Python
0.例题
目标函数:
约束条件:
1.Python代码
#导入cplex
import cplex
from cplex.exceptions import CplexError
my_obj=[3.0,1.0,3.0]#目标函数系数
my_ctype='ICI'#目标函数变量的类型,一般就是C,整数类型就是I就是integer
my_ub=[cplex.infinity, cplex.infinity,1]#变量的约束条件上限
my_lb=[0,0,0]#变量的约束条件下限
my_colnames=['x1','x2','x3']#column names列向量的名字
my_rhs=[4.0,2.0,3.0]#约束条件的值相当于b
my_rownames=['r1','r2','r3']#row names行向量的名字
#是约束条件的形式,L为小于号“less-than”,大于号是‘G’,即'greater than'
my_sense='LLL'
def populatebyrow(prob):
#设置目标函数类型:求max or min
prob.objective.set_sense(prob.objective.sense.maximize)
#设置(增加)变量,明确目标函数,约束条件上限、下限,变量类型,还有变量名称
prob.variables.add(obj=my_obj,lb=my_lb,ub=my_ub,types=my_ctype,
names=my_colnames)
#对应的约束方程
rows=[[['x1','x2','x3'],[-1.0,2.0,1.0]],
[['x2','x3'],[4.0,-3.0]],
[['x1','x2','x3'],[1.0,-3.0,2.0]]]
#设置(增加)约束条件
prob.linear_constraints.add(lin_expr=rows, senses=my_sense,
rhs=my_rhs,names=my_rownames)
#初始化模型
my_prob=cplex.Cplex()
#计算
handle=populatebyrow(my_prob)
#求解
my_prob.solve()
#输出结果
print(my_prob.solution.get_objective_value())
x = my_prob.solution.get_values()
print(x)
2.结果
可以看到,求得最优解:
3.求解0-1规划问题
(1)例题
可供选择,考虑到各地居民消费水平及居民居住密集度,规定:
(1)在东区由三个点中至多选择两个;
(2)在西区由两个点中至少选择一个;
(3)在南区由两个点中至少选择一个;
(4)在北区由三个点中至少选择两个。
投资额 | 100 | 120 | 150 | 80 | 70 | 90 | 80 | 140 | 160 | 180 |
利润 | 36 | 40 | 50 | 22 | 20 | 30 | 25 | 48 | 58 | 61 |
各点的设备投资及每年可获利润由于地点不同而不同,预测情况如上表,但总投资金额不超过720万元,问应该选择哪几个销售点,可使利润最大。
(2)求解
变量或,建立数学模型如下:
目标函数:
约束条件:
(3)代码
import cplex
from cplex.exceptions import CplexError
my_obj=[36.,40.,50.,22.,20.,30.,25.,48.,58.,61.]
my_ctype='IIIIIIIIII'
my_ub=[1,1,1,1,1,1,1,1,1,1]
my_lb=[0,0,0,0,0,0,0,0,0,0]
my_colnames=['x1','x2','x3','x4','x5','x6','x7','x8','x9','x10']
my_rhs=[720,2,1,1,2]
my_rownames=['r1','r2','r3','r4','r5']
my_sense='LLGGG'
def populatebyrow(prob):
prob.objective.set_sense(prob.objective.sense.maximize)
prob.variables.add(obj=my_obj, lb=my_lb, ub=my_ub,
types=my_ctype, names=my_colnames)
rows=[[['x1','x2','x3','x4','x5','x6','x7','x8','x9','x10'],[100.0,120.0,150.0,80.0,70.0,90.0,80.0,140.0,160.0,180.0]],
[['x1','x2','x3'],[1.0,1.0,1.0]],
[['x4','x5'],[1.,1.]],
[['x6','x7'],[1.,1.]],
[['x8','x9','x10'],[1.,1.,1.]]]
prob.linear_constraints.add(lin_expr=rows, senses=my_sense,
rhs=my_rhs,names=my_rownames)
my_prob=cplex.Cplex()
handle=populatebyrow(my_prob)
my_prob.solve()
print(my_prob.solution.get_objective_value())
x = my_prob.solution.get_values()
print(x)
(4)结果
4.说明
(1)以上两个例题均来自韩伯棠老师主编的《管理运筹学》(第四版)教材中,韩老师授课十分有趣、清楚,是初学运筹学者比较好的入门课程。
(2)网上有很多关于cplex的说明,本人了解不全,很多设置还搞不清楚,请各位批评指正。