EP01. “Transportation Problem 运输问题”
🔒 登录后可标记已读- Solver(规划求解)是 Excel 内建的最优化加载项,能在一堆限制条件下自动找出让某个目标(成本最低/利润最高)最优的方案
- 这篇笔记用经典的"运输问题"入门——从几个工厂运货到几个客户,工厂各自有固定供应量,客户各自有固定需求量,要找出总运输成本最低的运送方案
- 前置知识是基本的 SUM / SUMPRODUCT 函数
- 学完能掌握用 Solver 解最优化问题的完整流程(建模 → 试算 → 求解)
重点内容
适用版本
桌面版通用(Excel 365 / 2021 / 2019 等)。Solver 是加载项,不是内建功能,需要先启用。
启用 Solver 加载项
如果 Data(数据)选项卡右侧看不到 Solver 按钮:
- File(文件)→ Options(选项)→ Add-ins(加载项)
- 在底部 Manage(管理)下拉选单选择 Excel Add-ins(Excel 加载项),点击 Go
- 勾选 Solver Add-in(规划求解加载项)
- 点击 OK,Solver 就会出现在 Data 选项卡的 Analyze(分析)组里
📌 后面所有用到 Solver 的笔记(Assignment Problem、Shortest Path Problem 等)都要先做这一步,之后不再重复说明。
第一步:建立模型(Formulate the Model)
建模时要想清楚三个问题:
- 决策变量:需要 Excel 决定的是"每个工厂要给每个客户运送多少单位货物"
- 约束条件:每个工厂有固定供应量上限,每个客户有固定需求量要满足
- 目标函数:让总运输成本最小化
命名范围(方便公式和 Solver 设置里直接读名字):
| 范围名称 | 单元格 |
|---|---|
| UnitCost | C4:E6 |
| Shipments | C10:E12 |
| TotalIn | C14:E14 |
| Demand | C16:E16 |
| TotalOut | G10:G12 |
| Supply | I10:I12 |
| TotalCost | I16 |
用到的函数:
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 求解
- Data 选项卡 → Analyze 组 → 点击 Solver
- Set Objective(设置目标)选 TotalCost
- 选择 Min(最小化)
- By Changing Variable Cells(可变单元格)选 Shipments
- Add Constraint(添加约束):TotalIn = Demand
- 再 Add Constraint:TotalOut = Supply
- 勾选 Make Unconstrained Variables Non-Negative(无约束变量为非负数),Solving Method 选 Simplex LP(单纯形线性规划)
- 点击 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: