线性规划是研究线性约束条件下线性目标函数的极值问题的数学理论和方法。Python中有许多第三方的工具可以解决这类问题,这里介绍常用的pulp工具包。pulp能够解包括整数规划在内的绝大多数线性规划问题,并且提供了多种solver,每种solver针对不同类型的线性规划问题有更好的效果。
<>1.安装pulp库
这里讲的是在jupyter中安装python第三方库。
* 格式:!pip install +包名 !pip install pulp
<>2. 使用流程
我们解决线性规划问题一般是通过以下三个步骤。
* 1.列出约束条件及目标函数
* 2.画出约束条件所表示的可行域
* 3.在可行域内求目标函数的最优解及最优值
使用pulp工具包,我们只需要做第一步即可,使用pulp提供的API提供目标函数及约束条件就可以直接求解,非常方便。
<>3. 常用的API
1.LpProblem类
LpProblem(name='NoName', sense=LpMinimize)
构造函数,用来构造一个LP问题实例,其中name指定问题名(输出信息用),sense值是LpMinimize或LpMaximize中的一个,用来指定目标函数是求极大值还是极小值。
solve(solver=None, **kwargs)在对LpProblem添加完约束条件后,调用该函数进行求解,如果不是求解特定的整数规划问题,
solver一般使用默认即可。
2.LpVariable类
LpVariable(name, lowBound=None, upBound=None, cat='Continuous', e=None)
构造函数,用来构造LP问题中的变量,name指定变量名,lowBound和upBound是下界和上界,默认分别是负无穷到正无穷,cat用来指定变量是离散
(Integer,Binary)还是连续(Continuous)。
dicts(name, indexs, lowBound=None, upBound=None, cat='Continuous',
indexStart=[])用来构造变量字典,可以让我们不用一个个地创建Lp变量实例。name指定所有变量的前缀,
index是列表,其中的元素会被用来构成变量名,后面三个参数和LbVariable中的一样。
3.lpSum(vector)
计算一个序列的值,使用lpSum求解比普通的sum函数要快得多。
<>4. 案例
某公司生产三种油漆(interior , exterior and theme)需要两种原材料(M1,M2)。下表提供了问题的基本数据:
interior/吨exterior/吨theme/吨每日材料数量
M112310
M20125
利润100020003000
求:确定interior , exterior 和 theme的最佳产品组合,以最大限度地实现每日总利润。
解:
* 数学模型
*
决策变量
x1:interior 的产量
x2:exterior 的产量
x3:theme 的产量
*
目标变量
Maximize Z = 1000 * x1 + 2000 * x2 + 3000 * x3
*
约束条件
x1 + 2 * x2 + 3 * x3 <= 10
x2 + 2 * x3 <= 5
x1,x2,x3 >=0
python代码如下:
from pulp import * #创建问题实例:求最大极值 prob = LpProblem("problem1",LpMaximize)
#定义决策变量 x1 = LpVariable("x1",0,None,LpContinuous) x2 = LpVariable("x2",0,None,
LpContinuous) x3 = LpVariable("x3",0,None,LpContinuous) #目标变量 prob += 1000 * x1
+ 2000 * x2 + 3000 * x3 #添加约束条件 prob += x1 + 2 * x2 + 3 * x3 <=10 prob += x2 + 2
* x3 <=5 #写入LP文件 prob.writeLP("problem1.lp") #模型求解,如果status输出 Optimal(最佳) ,则方程有解
prob.solve() print("\n","status:",LpStatus[prob.status],"\n")
#遍历得出x1,x2,x3分别等于多少时,利润最大化 for i in prob.variables(): print("\t",i.name,"=",i.
varValue,"tons","\n") #每日最大利润为 print("Maxnum Daily Profit =","Rs",value(prob.
objective))
运行结果为:
status: Optimal x1 = 2.5 tons x2 = 0.0 tons x3 = 2.5 tons Maxnum Daily Profit =
Rs10000.0
答:当x1=2.5,x2=0,x3=2.5即interior 的产量为2,exterior 的产量为0,theme
的产量为2.5时,每日最大利润为10000。