MICROSOFT

EP01. “Transportation Problem 运输问题”

首页 Microsoft 工具 Excel · Data Analysis · Solver · EP01
约 6 分钟· #EP01#Excel#Solver
🔒 登录后可标记已读
  • Solver(规划求解)是 Excel 内建的最优化加载项,能在一堆限制条件下自动找出让某个目标(成本最低/利润最高)最优的方案
  • 这篇笔记用经典的"运输问题"入门——从几个工厂运货到几个客户,工厂各自有固定供应量,客户各自有固定需求量,要找出总运输成本最低的运送方案
  • 前置知识是基本的 SUM / SUMPRODUCT 函数
  • 学完能掌握用 Solver 解最优化问题的完整流程(建模 → 试算 → 求解)

重点内容


适用版本

桌面版通用(Excel 365 / 2021 / 2019 等)。Solver 是加载项,不是内建功能,需要先启用。


启用 Solver 加载项

如果 Data(数据)选项卡右侧看不到 Solver 按钮:

  1. File(文件)→ Options(选项)→ Add-ins(加载项)
  2. 在底部 Manage(管理)下拉选单选择 Excel Add-ins(Excel 加载项),点击 Go
  3. 勾选 Solver Add-in(规划求解加载项)
  4. 点击 OK,Solver 就会出现在 Data 选项卡的 Analyze(分析)组里

📌 后面所有用到 Solver 的笔记(Assignment Problem、Shortest Path Problem 等)都要先做这一步,之后不再重复说明。


第一步:建立模型(Formulate the Model)

建模时要想清楚三个问题:

  1. 决策变量:需要 Excel 决定的是"每个工厂要给每个客户运送多少单位货物"
  2. 约束条件:每个工厂有固定供应量上限,每个客户有固定需求量要满足
  3. 目标函数:让总运输成本最小化

命名范围(方便公式和 Solver 设置里直接读名字):

范围名称单元格
UnitCostC4:E6
ShipmentsC10:E12
TotalInC14:E14
DemandC16:E16
TotalOutG10:G12
SupplyI10:I12
TotalCostI16

用到的函数:

  • SUM 算每个工厂的总发货量(TotalOut)、每个客户的总收货量(TotalIn)
  • SUMPRODUCT(UnitCost, Shipments) 算总运输成本(TotalCost = 单价 × 运送量的加总)

第二步:试错法(Trial and Error)

先手动填几个运送方案试算,感受一下约束和目标怎么运作。示例方案:工厂1→客户1 运 100 单位、工厂2→客户2 运 200 单位、工厂3→客户1 运 100 单位、工厂3→客户3 运 200 单位,算出总成本是 27,800,作为之后跟 Solver 最优解的对照基准。


第三步:用 Solver 求解

  1. Data 选项卡 → Analyze 组 → 点击 Solver
  2. Set Objective(设置目标)选 TotalCost
  3. 选择 Min(最小化)
  4. By Changing Variable Cells(可变单元格)选 Shipments
  5. Add Constraint(添加约束):TotalIn = Demand
  6. 再 Add Constraint:TotalOut = Supply
  7. 勾选 Make Unconstrained Variables Non-Negative(无约束变量为非负数),Solving Method 选 Simplex LP(单纯形线性规划)
  8. 点击 Solve(求解)

[截图:Solver Parameters 对话框,Objective/Variable Cells/Constraints 都已设好]


求解结果

最优运送方案:工厂1→客户2 运 100、工厂2→客户2 运 100、工厂2→客户3 运 100、工厂3→客户1 运 200、工厂3→客户3 运 100,总成本降到 26,000(比试错法的 27,800 更低),所有约束条件都满足。

[截图:Solver 求解完成后的最优运送方案表格]


学完你会

  • ✅ 用「决策变量/约束条件/目标函数」三步骤给最优化问题建模
  • ✅ 用命名范围让 Solver 设置界面好读、好核对
  • ✅ 用 Solver 求出比手动试错更好的最优解

常见错误

  • 没有先用命名范围(Name Manager),Solver 设置界面里全是单元格坐标,很难核对设对了没有
  • 忘记勾选 Make Unconstrained Variables Non-Negative,导致 Solver 算出负的运送量(现实中不可能)
  • 约束条件的等号方向搞反(比如把"总发货量 = 供应量上限"误设成"≤"或反过来),导致解不满足实际限制

Sources

Blog / Website:

  1. Transportation Problem