1、什么是线性规划
线性规划(Linear programming),在线性等式或不等式约束条件下求解线性目标函数的极值问题,常用于解决资源分配、生产调度和混合问题。例如:
max fx = 2*x1 + 3*x2 - 5*x3
s.t. x1 + 3*x2 + x3 <= 12
2*x1 - 5*x2 + x3 >= 10
x1 + x2 + x3 = 7
x1, x2, x3 >=0
线性规划问题的建模和求解,通常按照以下步骤进行:
(1)问题定义,确定决策变量、目标函数和约束条件;
(2)模型构建,由问题描述建立数学方程,并转化为标准形式的数学模型;
(3)模型求解,用标准模型的优化算法对模型求解,得到优化结果;
=== 关注 Youcans,分享更多原创系列 https://www.cnblogs.com/youcans/ ===
2、PuLP 库求解线性规划
PuLP是一个开源的第三方工具包,可以求解线性规划、整数规划、混合整数规划问题。
下面以该题为例讲解 PuLP 求解线性规划问题的步骤:
(0)导入 PuLP库函数
import pulp
(1)定义一个规划问题
MyProbLP = pulp.LpProblem(\"LPProbDemo1\", sense=pulp.LpMaximize)
pulp.LpProblem 是定义问题的构造函数。
\"LPProbDemo1\"是用户定义的问题名(用于输出信息)。
参数 sense 用来指定求最小值/最大值问题,可选参数值:LpMinimize、LpMaximize 。
(2)定义决策变量
x1 = pulp.LpVariable(\'x1\', lowBound=0, upBound=7, cat=\'Continuous\')
x2 = pulp.LpVariable(\'x2\', lowBound=0, upBound=7, cat=\'Continuous\')
x3 = pulp.LpVariable(\'x3\', lowBound=0, upBound=7, cat=\'Continuous\')
pulp.LpVariable 是定义决策变量的函数。
\'x1\' 是用户定义的变量名。
参数 lowBound、upBound 用来设定决策变量的下界、上界;可以不定义下界/上界,默认的下界/上界是负无穷/正无穷。本例中 x1,x2,x3 的取值区间为 [0,7]。
参数 cat 用来设定变量类型,可选参数值:\'Continuous\' 表示连续变量(默认值)、\' Integer \' 表示离散变量(用于整数规划问题)、\' Binary \' 表示0/1变量(用于0/1规划问题)。
(3)添加目标函数
MyProbLP += 2*x1 + 3*x2 - 5*x3 # 设置目标函数
添加目标函数使用 \"问题名 += 目标函数式\" 格式。
(4)添加约束条件
MyProbLP += (2*x1 - 5*x2 + x3 >= 10) # 不等式约束
MyProbLP += (x1 + 3*x2 + x3 <= 12) # 不等式约束
MyProbLP += (x1 + x2 + x3 == 7) # 等式约束
添加约束条件使用 \"问题名 += 约束条件表达式\" 格式。
约束条件可以是等式约束或不等式约束,不等式约束可以是 小于等于 或 大于等于,分别使用关键字\">=\"、\"<=\"和\"==\"。
(5)求解
MyProbLP.solve()
print(\"Status:\", pulp.LpStatus[MyProbLP.status]) # 输出求解状态
for v in MyProbLP.variables():
print(v.name, \"=\", v.varValue) # 输出每个变量的最优值
print(\"F(x) = \", pulp.value(MyProbLP.objective)) #输出最优解的目标函数值
solve() 是求解函数。PuLP默认采用 CBC 求解器来求解优化问题,也可以调用其它的优化器来求解,如:GLPK,COIN CLP/CBC,CPLEX,和GUROBI,但需要另外安装。
3、Python程序和运行结果
完整的程序代码如下:
import pulp
MyProbLP = pulp.LpProblem(\"LPProbDemo1\", sense=pulp.LpMaximize)
x1 = pulp.LpVariable(\'x1\', lowBound=0, upBound=7, cat=\'Continuous\')
x2 = pulp.LpVariable(\'x2\', lowBound=0, upBound=7, cat=\'Continuous\')
x3 = pulp.LpVariable(\'x3\', lowBound=0, upBound=7, cat=\'Continuous\')
MyProbLP += 2*x1 + 3*x2 - 5*x3 # 设置目标函数
MyProbLP += (2*x1 - 5*x2 + x3 >= 10) # 不等式约束
MyProbLP += (x1 + 3*x2 + x3 <= 12) # 不等式约束
MyProbLP += (x1 + x2 + x3 == 7) # 等式约束
MyProbLP.solve()
print(\"Status:\", pulp.LpStatus[MyProbLP.status]) # 输出求解状态
for v in MyProbLP.variables():
print(v.name, \"=\", v.varValue) # 输出每个变量的最优值
print(\"F(x) = \", pulp.value(MyProbLP.objective)) #输出最优解的目标函数值
# === 关注 Youcans,分享更多原创系列 https://www.cnblogs.com/youcans/ ===
程序运行结果如下:
Welcome to the CBC MILP Solver
Version: 2.9.0
Build Date: Feb 12 2015
Status: Optimal
x1 = 6.4285714
x2 = 0.57142857
x3 = 0.0
F(x) = 14.57142851
=== 关注 Youcans,分享更多原创系列 https://www.cnblogs.com/youcans/ ===
版权说明:
原创作品
Copyright 2021 YouCans, XUPT
Crated:2021-04-28
来源:https://www.cnblogs.com/youcans/p/14714085.html
图文来源于网络,如有侵权请联系删除。