算法第五章
1.问题描述
2.请用回溯法的方法分析“最小重量机器设计问题”
if(t>n)//到达根结点 { if(minwe>curwe) { minwe=curwe; for(int i=1;i<=n;i++) { re[i]=x[i]; } } return; } for(int i=1;i<=m;i++) { x[t]=i; curmon += c[t][i]; curwe += w[t][i]; if(curmon<=d&&curwe<=minwe)//剪枝函数 { backtrack(t+1); } curmon-= c[t][i]; curwe-= w[t][i]; }
解题思路:
输入:部件有 n 个,供应商有 m 个,d 为总价格的上限。二维数组 w[i][j] 存储从供应商 j 处购得的部件 i 的重量,二维数组 c[i][j] 存储从供应商 j 处购得的部件 i 的价格。
主函数递归backtrack函数,backtrack(1) 从第一个货物开始选择供应商
backtrack:
- 用 for 循环对某个部件从 m 个不同的供应商进行选择
- curwe<=minwe——上界函数,若不满足,表示当前状态的重量已超最小重量,不是最优解,剪去相应子树,返回到 t-1 层继续执行。
- curmon<=d——约束函数,若不满足,表示当前状态的金额已超约束重量,是不可行解,剪去相应子树,返回到 t-1 层继续执行。
- 若 t > n ,表示搜索到一个叶结点,若minwe>curwe,记录当前minwe,并用 re[i] 对每个部件的供应商进行记录.
输出:最小总重量minwe,每个部件选择的供应商re[i] 。
2.1 说明“最小重量机器设计问题"的解空间
以输入样例为例,其解空间为:
(1,1,1)(1,1,2)(1,1,3)
(1,2,1)(1,2,2)(1,2,3)
(1,3,1)(1,3,2)(1,3,3)
(2,1,1)(2,1,2)(2,1,3)
(2,2,1)(2,2,2)(2,2,3)
(2,3,1)(2,3,2)(2,3,3)
(3,1,1)(3,1,2)(3,1,3)
(3,2,1)(3,2,2)(3,2,3)
(3,3,1)(3,3,2)(3,3,3)
【(X,Y,Z):x代表第1个部件选择第x个供应商,y代表第2个部件选择第y个供应商,z代表第3个部件选择第z个供应商。】
2.2 说明 “最小重量机器设计问题"的解空间树
2.3 在遍历解空间树的过程中,每个结点的状态值是什么
每个结点的状态值是选择到当前状态时的重量w和价格c
3. 你对回溯算法的理解
回溯法:
按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。
回溯算法解决问题:旅行售货员、n皇后问题、0-1背包问题。
剪枝函数:
- 用 约束函数 在扩展结点处剪去不满足约束的子树
- 用 上界函数 剪去得不到最优解的子树
子集树:
当所给问题是从n个元素的集合S中找出满足某种性质的子集时(选或不选某个结点),相应的解空间树被称为子集树。
排列树:
当所给问题是确定n个元素满足某种性质的排列时,相应的解空间树被称为排列树。