数学建模学习-线性规划(Linear Programming)教程(1)
算法简介
线性规划(Linear Programming, LP)是运筹学中最基础也最重要的数学规划方法之一。它主要用于在一组线性约束条件下,求解线性目标函数的最优值(最大值或最小值)。线性规划广泛应用于工业生产、经济管理、资源调配等领域。
算法特点
- 线性性:目标函数和约束条件都是决策变量的线性函数
- 可行域是一个凸多面体
- 最优解(若存在)必定在可行域的顶点上
- 可以使用单纯形法等高效算法求解
- 有多种标准形式,便于计算机求解
环境准备
# requirements.txt
numpy>=1.21.0
scipy>=1.7.0
matplotlib>=3.4.0
代码实现
我们以一个简单的生产规划问题为例:
一个工厂生产两种产品A和B:
- 生产1个A需要2小时加工和3小时装配
- 生产1个B需要1小时加工和4小时装配
- 工厂每天加工时间不超过8小时,装配时间不超过12小时
- A的利润是3000元/个,B的利润是4000元/个
- 求最大利润的生产方案
import numpy as np
from scipy.optimize import linprog
import matplotlib.pyplot as plt
import matplotlib as mpl
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
# 定义目标函数系数(最大化问题转化为最小化)
c = [-3000, -4000] # 利润系数取负
# 定义约束条件的系数矩阵和右端向量
A = np.array([[2, 1], # 加工时间系数
[3, 4]]) # 装配时间系数
b = np.array([8, 12]) # 时间上限
# 定义变量的范围
x_bounds = (0, None) # x >= 0
y_bounds = (0, None) # y >= 0
# 求解线性规划
res = linprog(c, A_ub=A, b_ub=b,
bounds=[x_bounds, y_bounds],
method='highs') # 使用推荐的highs方法
# 打印结果
print("最优解:")
print(f"产品A生产数量: {res.x[0]:.2f}")
print(f"产品B生产数量: {res.x[1]:.2f}")
print(f"最大利润: {-res.fun:.2f}") # 注意转换回正值
# 绘制可行域和最优解
x = np.linspace(0, 6, 100)
y1 = (8 - 2*x) # 加工时间约束
y2 = (12 - 3*x)/4 # 装配时间约束
plt.figure(figsize=(8, 6))
plt.plot(x, y1, 'b-', label='加工时间约束')
plt.plot(x, y2, 'r-', label='装配时间约束')
plt.fill_between(x,
np.minimum(y1, y2),
where=(x >= 0) & (np.minimum(y1, y2) >= 0),
alpha=0.2,
label='可行域')
plt.plot(res.x[0], res.x[1], 'go', label='最优解')
plt.grid(True)
plt.xlabel('产品A数量')
plt.ylabel('产品B数量')
plt.title('生产规划线性规划问题')
plt.legend()
# 保存图片
plt.savefig('images/solution.png', bbox_inches='tight', dpi=300)
plt.close()
运行结果
运行上述代码,得到以下结果:
最优解:
产品A生产数量: 0.00
产品B生产数量: 3.00
最大利润: 12000.00
可行域和最优解的图形表示:
结果分析
-
最优生产方案是:
- 生产0个产品A
- 生产3个产品B
- 获得最大利润12000元
-
从图中可以看出:
- 蓝线和红线分别表示加工时间和装配时间的约束
- 浅蓝色区域是满足所有约束的可行域
- 绿点表示最优解的位置
- 最优解位于可行域的顶点处
扩展应用
线性规划可以应用于更复杂的实际问题:
- 投资组合优化
- 交通运输问题
- 生产计划制定
- 资源调配问题
- 网络流优化
注意事项
- 建立模型时要确保线性假设成立
- 注意变量的取值范围约束
- 目标函数和约束条件要写成标准形式
- 实际问题中可能需要考虑整数解
- 大规模问题要注意计算效率