数学建模学习-线性规划(Linear Programming)教程(1)

311 阅读3分钟

数学建模学习-线性规划(Linear Programming)教程(1)

算法简介

线性规划(Linear Programming, LP)是运筹学中最基础也最重要的数学规划方法之一。它主要用于在一组线性约束条件下,求解线性目标函数的最优值(最大值或最小值)。线性规划广泛应用于工业生产、经济管理、资源调配等领域。

算法特点

  1. 线性性:目标函数和约束条件都是决策变量的线性函数
  2. 可行域是一个凸多面体
  3. 最优解(若存在)必定在可行域的顶点上
  4. 可以使用单纯形法等高效算法求解
  5. 有多种标准形式,便于计算机求解

环境准备

# 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

可行域和最优解的图形表示:

solution.png

结果分析

  1. 最优生产方案是:

    • 生产0个产品A
    • 生产3个产品B
    • 获得最大利润12000元
  2. 从图中可以看出:

    • 蓝线和红线分别表示加工时间和装配时间的约束
    • 浅蓝色区域是满足所有约束的可行域
    • 绿点表示最优解的位置
    • 最优解位于可行域的顶点处

扩展应用

线性规划可以应用于更复杂的实际问题:

  1. 投资组合优化
  2. 交通运输问题
  3. 生产计划制定
  4. 资源调配问题
  5. 网络流优化

注意事项

  1. 建立模型时要确保线性假设成立
  2. 注意变量的取值范围约束
  3. 目标函数和约束条件要写成标准形式
  4. 实际问题中可能需要考虑整数解
  5. 大规模问题要注意计算效率