第五次作业
- 用回溯法分析最小重量机器设计问题
假设有 n 个部件,每个部件可以从 m 个供应商处购买。已知:第 i 个部件从第 j 个供应商购买的价格 c[i][j],第 i 个部件从第 j 个供应商购买的重量 w[i][j],要求选择每个部件的一个供应商,使得:
总价格不超过预算 d,总重量最小。
1.1 解空间
解空间是所有可能的供应商选择组合的集合。
每个部件有 m 种选择(供应商编号 1 到 m),共有 n 个部件,所以解空间的大小为 m^n(所有可能的排列)
例如:n=3, m=2,解空间为:(1,1,1), (1,1,2), (1,2,1), (1,2,2), (2,1,1),(2,1,2), (2,2,1), (2,2,2),每个元组表示每个部件选择的供应商编号。
1.2 最小重量机器设计问题的解空间树
该问题的解空间树是一棵m叉树,树的高度为 n(对应 n 个部件),具体结构如下:
1. 根节点:处于第 0 层,表示尚未选择任何部件,总重量和总成本均为 0。
2. 第 i 层节点(1 \le i \le n):表示已经确定前 i 个部件的供应商,每个节点有 m 个子节点,对应第 i+1 个部件的 m 种供应商选择。
3. 叶节点:处于第 n 层,表示所有 n 个部件的供应商都已选定,对应一个完整的采购方案,需判断是否满足总成本约束。
例如,当 n=2、m=2 时,解空间树是一棵 2 叉树,根节点生成 2 个第 1 层节点(对应部件 1 选供应商 1/2),每个第 1 层节点再生成 2 个第 2 层叶节点(对应部件 2 选供应商 1/2),共 4 个叶节点,对应 4 种采购方案。
1.3 遍历解空间树时每个结点的状态值
在回溯遍历解空间树的过程中,每个节点需要维护3个核心状态值,用于判断是否需要继续向下搜索:
1. 已选部件数量:表示当前已经确定了多少个部件的供应商,对应节点在解空间树中的层数。
2. 累计总重量:表示已经选定的这些部件的重量总和,是后续计算完整方案总重量的基础。
3. 累计总成本:表示已经选定的这些部件的成本总和,是剪枝判断的关键——如果累计总成本已经超过设定上限,该节点的所有子节点对应的方案都不合法,直接停止向下搜索。
另外,还可以维护一个全局的当前最优重量,如果当前节点的累计总重量已经大于这个最优值,即使后续部件重量为0也无法得到更优的方案,同样可以提前剪枝。
- 对回溯算法的理解
回溯算法是一种基于深度优先搜索的枚举剪枝策略,核心思想是“尝试-验证-回退”:从根节点出发,逐步构建问题的部分解,每一步扩展一个维度的选择;若当前部分解违反约束或不可能优于已知最优解,则剪枝(放弃该分支的后续搜索),回退到上一层节点尝试其他选择;若能构建出完整解,则更新最优解。
回溯算法的核心步骤可概括为:定义解的形式→构建解空间树→确定节点状态→设计剪枝条件→深度优先遍历+回溯。
浙公网安备 33010602011771号