Section five Homework
当预算有限时,如何造出最轻的机器?——用回溯法解“最小重量机器设计问题”
在工程与算法的交汇处,我们常常要回答这样一个问题:如何在约束下做到“刚刚好”?
今天想和大家聊一个经典但容易被忽略的组合优化问题——最小重量机器设计问题。它不像旅行商那样广为人知,却真实反映了现实中的权衡艺术:在有限成本下,如何让产品尽可能轻?
而解决它的利器之一,就是我们熟悉的——回溯法。
- 问题是什么?
假设我们要设计一台机器,它由 \(n\) 个部件组成。
每个部件可以从 \(m\) 家不同的供应商中选择。
第 \(i\) 个部件从第 \(j\) 家供应商采购,会带来两个属性:重量 \(w_{ij}\)、价格 \(c_{ij}\)
我们的目标是:
为每个部件选一个供应商;使得总价格不超过预算 \(d\);同时总重量尽可能小。
这本质上是一个带约束的最优化问题,属于 NP-hard 范畴。当 \(n\) 和 \(m\) 不大时,回溯法是一种直观且可行的解法。
1.1 解空间:所有可能的“组装方案”
首先,我们要明确:这个问题的解空间到底长什么样?
每个部件有 \(m\) 种选择;
共有 \(n\) 个部件;
所有可能的组合数是:\(m^n\)。
比如,3 个部件,每种有 2 家供应商 → 总共 \(2^3 = 8\) 种组装方案。
这些方案构成了问题的完整解空间。我们的任务,就是在这些方案中:
筛选出总成本 ≤ 预算 \(d\) 的可行解;
在可行解中,找到总重量最小的那个。
注意:解空间 ≠ 可行解空间。很多组合会超预算,直接被剪掉。
1.2 解空间树:一棵“决策树”
为了系统地遍历所有可能,我们把解空间组织成一棵树——称为解空间树(或状态空间树)。
树的深度:\(n+1\) 层(第 0 层是根,第 1~n 层分别对应第 1~n 个部件的选择)
每个非叶节点有 \(m\) 个子节点,代表当前部件选择哪家供应商
从根到叶子的一条路径,就对应一种完整的组装方案
举个例子(\(n=3, m=2\)):
(根)
/ \
选1号 选2号 ← 第1个部件
/ \ / \
... ... ... ... ← 第2个部件
/ \ / \ / \ / \
... ... ... ... ... ... ← 第3个部件(叶子)
这样一棵树,共有 \(m^n\) 个叶子节点,每个叶子就是一个候选解。
1.3 遍历时,每个节点“记住”了什么?
在回溯过程中,我们并不是盲目地走到叶子再判断。为了高效剪枝,每个节点都需要维护当前的状态信息。
具体来说,当我们处在第 \(k\) 层(即已经为前 \(k-1\) 个部件做了选择),需要记录:
| 状态值 | 含义 |
|---|---|
| current_cost | 前 \(k-1\) 个部件的总价格 |
| current_weight | 前 \(k-1\) 个部件的总重量 |
| best_weight(全局) | 当前找到的最优可行解的重量(用于剪枝) |
剪枝策略(关键!)
-
可行性剪枝:
如果 current_cost > d,说明已经超预算,无需继续向下搜索,直接回溯。 -
最优性剪枝(限界):
即使还没超预算,但如果 current_weight ≥ best_weight,
那么就算后面全选最轻的部件,也不可能比当前最优解更好——也可以剪掉。
这些状态值就像“背包里的账本”,让我们在探索过程中随时知道:“还剩多少钱?已经多重了?还有没有必要继续?” -
我对回溯算法的理解
回溯法,常被称作“聪明的暴力搜索”。
它不像动态规划那样依赖重叠子问题,也不像贪心那样追求一步到位。
它更像是一个有记忆、会反思的探险家:
他一步步做选择(比如“这个部件选哪家?”);
每走一步,就检查当前状态是否还有希望;
一旦发现前方无路可走(超预算、不可能更优),就立刻退回上一步,尝试其他选项;
直到遍历完所有可能性,或者提前找到最优解。
回溯的核心三要素:
- 选择(Choice):在当前步骤有哪些可选项?
- 约束(Constraint):哪些选择是合法的?(如预算限制)
- 目标(Objective):如何判断一个解是否“更好”?(如重量更小)
它的优点与局限:
✅ 优点:
思路直观,易于实现;
能找到精确最优解(不是近似);
配合剪枝,效率远高于纯暴力。
❌ 局限:
时间复杂度仍是指数级(\(O(m^n)\)),只适用于小规模问题;
剪枝效果高度依赖问题结构和数据分布。
所以,回溯法不是万能的,但在“小而精”的组合优化场景中,它依然是我们的可靠伙伴。
🧩 结语:在约束中寻找最优,是工程师的日常
最小重量机器设计问题,看似抽象,实则映射了无数现实场景:
电路板选型(成本 vs 功耗)
供应链采购(价格 vs 交付时间)
甚至人生选择(时间 vs 收益)
而回溯法教会我们的,不仅是算法技巧,更是一种思维方式:
在有限资源下,系统性地探索可能性,并及时止损、调整方向。
或许,这才是算法真正迷人的地方。

浙公网安备 33010602011771号