算法第五章作业

  1. 用回溯法分析“最小重量机器设计问题”

1.1 解空间
解空间就是“所有可能的选择组合”。比如有2个部件,每个部件有3个供应商,那解空间就是3×3=9种组合(部件1选供应商1+部件2选供应商1、部件1选供应商1+部件2选供应商2……以此类推)。
抽象点说:解是一个长度为n的数组x[1..n]x[i]表示第i个部件选的供应商编号(范围是1到m),解空间就是所有这样的数组的集合。

1.2 解空间树
解空间树是把“选供应商”的过程拆成步骤的树:
根节点:还没选任何部件;
第1层节点:第1个部件选不同供应商的情况(比如m个供应商,就有m个分支);
第2层节点:在第1个部件选好的基础上,第2个部件选不同供应商的情况;
……
第n层节点:选完最后一个部件,每个节点对应一个完整的组合(叶子节点)。
比如n=2、m=3的话,解空间树是一棵“2层分支(根+2层)、叶子节点有9个”的树。

1.3 每个节点的状态值
遍历树的时候,每个节点得记两个关键状态:

  1. 已选部件的总重量:比如走到第k层节点,就是前k个部件选完后的总重量;

  2. 当前选到第几个部件:比如第k层节点,对应“正在选第k+1个部件”。
    另外,为了剪枝(少走没用的路),还会记“剩余部件的最小可能重量之和”——如果“当前总重量 + 剩余最小重量”已经比当前找到的最优解大,那就不用往下走了(这就是回溯的“剪枝”)。

  3. 我对回溯算法的理解
    回溯法其实就是“试错法”:像走迷宫,走一步记一步,走不通就退回去换条路走。
    它适合“需要从很多组合里找满足条件的解(比如最优解、可行解)”的问题,但组合太多的话直接暴力枚举会超时,所以回溯法加了“剪枝”——提前判断某条路肯定到不了目标,就直接放弃这条分支,省时间。

比如这个机器设计问题,要是暴力枚举所有组合,n=10、m=5的话就得算5^10种,肯定慢;但回溯的时候,算到某一步发现“当前重量已经比之前找到的最小总重量大了”,后面的部件再选再轻也没用,直接退回去换个供应商选,能省很多计算。

不过回溯法也有缺点:要是问题的解空间太大,就算剪枝也可能很慢,这时候可能得用动态规划之类的方法,但回溯法胜在思路简单,能解决很多“组合选择类”的问题。

posted @ 2025-12-20 20:27  软工2403朱德宝  阅读(0)  评论(0)    收藏  举报