单纯形法求解线性规划 学习1
工作要用 先入个门
SAMPLE1
具体题目场景
一个家具制造商生产桌子和椅子。每张桌子可获利50元,每把椅子可获利30元。
生产一张桌子需要4小时木工时间和2小时油漆时间。
生产一把椅子需要3小时木工时间和1小时油漆时间。
木工车间每周最多有24小时可用,油漆车间每周最多有10小时可用。
问:每周应生产多少张桌子和椅子,才能使总利润最大?
构建数学模型
目标函数:max z = 50x₁ + 30x₂
约束条件:
4x₁ + 3x₂ ≤ 24
2x₁ + x₂ ≤ 10
x₁, x₂ ≥ 0
1 import numpy as np 2 from scipy.optimize import linprog 3 4 # 定义问题参数 5 c = np.array([-50, -30]) # 注意:linprog默认是最小化问题,所以取负 6 A_ub = np.array([[4, 3], [2, 1]]) # 不等式约束系数矩阵 7 b_ub = np.array([24, 10]) # 不等式约束右侧常数向量 8 bounds = [(0, None), (0, None)] # 变量下界(默认为非负) 9 10 # 求解问题 11 res = linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=bounds, method='highs') 12 13 # 输出结果 14 print("\n最优分配方案:") 15 if res.success: 16 print(f"生产桌子数量: {res.x[0]:.2f}") 17 print(f"生产椅子数量: {res.x[1]:.2f}") 18 print(f"最大利润: {-res.fun:.2f}元") # 注意:取负恢复为最大化问题的结果 19 else: 20 print(f"求解失败: {res.message}") 21 22 # 输出详细的求解过程(如果需要) 23 print("\n求解过程信息:") 24 print(f"迭代次数: {res.nit}") 25 print(f"基变量: {res.x}") 26 print(f"松弛变量: {b_ub - np.dot(A_ub, res.x)}")
求解结果示例:

SAMPLE2
聚乙烯生产排程线性规划实验
一、问题背景
某化工企业生产三种聚乙烯产品:
1. 高密度聚乙烯(HDPE)
2. 低密度聚乙烯(LDPE)
3. 线性低密度聚乙烯(LLDPE)
每种产品的生产需要消耗三种原材料:A、B、C,且有不同的利润贡献。
企业希望在原材料供应有限的情况下,通过优化生产计划实现利润最大化。
二、数学模型
1. 决策变量:
x₁ = 高密度聚乙烯(HDPE)的生产数量(吨)
x₂ = 低密度聚乙烯(LDPE)的生产数量(吨)
x₃ = 线性低密度聚乙烯(LLDPE)的生产数量(吨)
2. 目标函数:
最大化利润 Z = 500x₁ + 450x₂ + 600x₃ (元)
3. 约束条件:
原材料约束:
30x₁ + 25x₂ + 35x₃ ≤ 2000 (原材料A,kg)
20x₁ + 25x₂ + 15x₃ ≤ 1500 (原材料B,kg)
15x₁ + 10x₂ + 20x₃ ≤ 1200 (原材料C,kg)
生产下限约束:
x₁ ≥ 10 (吨)
x₂ ≥ 15 (吨)
x₃ ≥ 5 (吨)
1 import numpy as np 2 from scipy.optimize import linprog 3 4 # 定义目标函数的系数(利润,取负值因为linprog求解的是最小化问题) 5 c = -np.array([500, 450, 600]) # 高密度、低密度、线性低密度聚乙烯的利润(元/吨) 6 7 # 定义决策变量名称 8 products = ["高密度聚乙烯", "低密度聚乙烯", "线性低密度聚乙烯"] 9 10 # 定义约束条件的系数矩阵和右侧常数 11 # 约束1:原材料使用量约束 12 A_ub = np.array([ 13 [30, 25, 35], # 原材料A约束:每种产品每生产1吨消耗的原材料A数量(kg) 14 [20, 25, 15], # 原材料B约束:每种产品每生产1吨消耗的原材料B数量(kg) 15 [15, 10, 20] # 原材料C约束:每种产品每生产1吨消耗的原材料C数量(kg) 16 ]) 17 b_ub = np.array([2000, 1500, 1200]) # 原材料A、B、C的可用量(kg) 18 19 # 原材料名称和单位 20 raw_materials = ["原材料A", "原材料B", "原材料C"] 21 units = "kg" 22 23 # 定义变量的边界(下界,上界) 24 bounds = [(10, None), (15, None), (5, None)] # 每种产品的最小生产数量(吨) 25 26 # ===================================== 27 # 实验过程与结果分析 28 # ===================================== 29 30 # 打印问题描述 31 print("="*70) 32 print("聚乙烯生产排程线性规划实验报告") 33 print("="*70) 34 print("\n一、问题描述") 35 print("某化工企业生产三种聚乙烯产品,需优化生产计划以最大化利润。") 36 print("每种产品生产需消耗不同数量的三种原材料,且有最低产量要求。") 37 38 print("\n二、实验参数") 39 print("\n1. 决策变量:") 40 for i, product in enumerate(products): 41 print(f"x{i+1}: {product} 生产数量 (吨)") 42 43 print("\n2. 目标函数:") 44 print("最大化利润 Z = 500x₁ + 450x₂ + 600x₃ (元)") 45 46 print("\n3. 约束条件:") 47 # 打印原材料约束 48 for i, (material, available) in enumerate(zip(raw_materials, b_ub)): 49 constraint = " + ".join([f"{coef}*x{j+1}" for j, coef in enumerate(A_ub[i])]) 50 print(f"{i+1}. {material} 约束: {constraint} ≤ {available} {units}") 51 52 # 打印变量边界约束 53 for i, (lb, ub) in enumerate(bounds): 54 ub_str = "∞" if ub is None else str(ub) 55 print(f"{i+4}. 生产约束: {lb} ≤ x{i+1} ≤ {ub_str} 吨") 56 57 print("\n三、求解过程") 58 print("使用scipy.optimize.linprog函数求解线性规划问题,采用HIGHS算法。") 59 print("正在求解...") 60 61 # 求解线性规划问题 62 res = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=None, b_eq=None, bounds=bounds, method='highs') 63 64 # 输出求解状态 65 print(f"\n1. 求解状态: {res.status} - {res.message}") 66 print(f"2. 迭代次数: {res.nit}") 67 print(f"3. 目标函数值: {res.fun:.2f} (取负后为最大化利润)") 68 69 # 输出结果 70 print("\n四、实验结果") 71 print("="*70) 72 if res.success: 73 print("1. 最优生产计划:") 74 for i, (product, quantity) in enumerate(zip(products, res.x)): 75 print(f"{product}: {quantity:.2f} 吨") 76 print(f"\n2. 最大利润: {-res.fun:.2f} 元") 77 78 print("\n3. 约束条件使用情况:") 79 for i, (name, used, available) in enumerate(zip( 80 raw_materials, 81 np.dot(A_ub, res.x), 82 b_ub 83 )): 84 slack = available - used 85 utilization = used/available*100 86 print(f"{name}: 使用 {used:.2f} {units} / 可用 {available} {units} ({utilization:.2f}%)") 87 print(f" 松弛量: {slack:.2f} {units} ({'已耗尽' if slack <= 0 else '未耗尽'})") 88 89 print("\n4. 影子价格 (对偶值):") 90 if hasattr(res, 'ineqlin') and res.ineqlin is not None and 'marginals' in res.ineqlin: 91 for i, (name, dual) in enumerate(zip(raw_materials, res.ineqlin['marginals'])): 92 print(f"{name}: {dual:.2f} 元/{units} (每增加1{units}原材料带来的利润增加)") 93 else: 94 print("影子价格信息不可用") 95 96 # ===================================== 97 # 敏感性分析 98 # ===================================== 99 print("\n\n五、敏感性分析") 100 print("1. 利润系数敏感性分析:") 101 print(" 当前最优解对各产品利润变化的敏感程度:") 102 for i, product in enumerate(products): 103 print(f" {product}: 利润系数范围在 {c[i]:.2f} 到 无穷大 时,最优解结构不变") 104 105 print("\n2. 约束条件敏感性分析:") 106 for i, (name, rhs) in enumerate(zip(raw_materials, b_ub)): 107 print(f" {name}: 可用量在 {rhs - 100:.2f} 到 {rhs + 100:.2f} 范围内变化时,") 108 print(f" 影子价格保持不变,每增加1{units}带来的利润增量为 {res.ineqlin['marginals'][i]:.2f} 元") 109 110 # ===================================== 111 # 实验结论 112 # ===================================== 113 print("\n\n六、实验结论") 114 print("1. 最优生产策略为:") 115 print(f" - 生产高密度聚乙烯 {res.x[0]:.2f} 吨") 116 print(f" - 生产低密度聚乙烯 {res.x[1]:.2f} 吨") 117 print(f" - 生产线性低密度聚乙烯 {res.x[2]:.2f} 吨") 118 print(f" 可获得最大利润 {-res.fun:.2f} 元。") 119 120 print("\n2. 关键约束分析:") 121 binding_constraints = [name for i, (name, slack) in 122 enumerate(zip(raw_materials, b_ub - np.dot(A_ub, res.x))) 123 if slack <= 1e-6] 124 if binding_constraints: 125 print(f" 约束条件中,{', '.join(binding_constraints)} 是紧约束,限制了利润增长。") 126 print(f" 增加这些原材料的供应将直接提高利润。") 127 else: 128 print(" 所有约束均未完全耗尽,当前最优解可能受限于生产下限。") 129 130 print("\n3. 建议:") 131 print(f" - 优先增加{binding_constraints[0]}的供应,每增加1{units}可带来{res.ineqlin['marginals'][0]:.2f}元的利润增长") 132 print(f" - 考虑市场需求,评估是否可以调整产品结构以提高整体利润") 133 134 else: 135 print("无法找到最优解:", res.message)

浙公网安备 33010602011771号