算法第五章上机实验报告
算法第五章上机实验报告
一、实验题目:
题目名称:
最小重量机器设计问题
题目概述:
设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设wij是从供应商j 处购得的部件i的重量,cij是相应的价格。求总价格不超过d的最小重量机器设计。
输入格式:
第一行有3 个正整数n ,m和d, 0<n<30, 0<m<30, 接下来的2n 行,每行m个数。前n行是c,后n行是w。
输出格式:
输出计算出的最小重量,以及每个部件的供应商。
二、用回溯法分析
1.请用回溯法的方法分析“最小重量机器设计问题”
对于每个部件来说,有m个供应商可供选择,这样就会有m^n种可选方案,其中有问题想要的最优解,这m^n种可选方案就是问题的解空间。然后把解空间组织成一棵m叉树,然后以深度优先搜索的方式纵深向下搜索,当不满足约束函数或者是限界函数时(在本题,约束函数就是本题给出的约束条件d;限界函数是之前搜索过的可行方案中最小的质量总和),回溯,寻求尝试另一种方案,然后继续纵深向下搜索。当向下搜索到叶子节点时,不再向下搜索,转去更新最优值。
2.说明“最小重量机器设计问题"的解空间
解空间为长度为n的供应商各种组合向量的集合。
3.说明 “最小重量机器设计问题"的解空间树
解空间树是一棵m叉树,m个分支表示对于每个零件的来说有m个供应商可以选择。
4.在遍历解空间树的过程中,每个结点的状态值是什么?
累计的重量和价格。
三、回溯算法的理解和思考
1.用回溯法解题通常包含三个步骤:(1)针对所给问题,定义问题的解空间;(2)确定易于搜索的解空间结构;(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
2.回溯法既可以求问题的所有解;也可以求问题的某一解或是最优解。
3.用回溯法解题一般有通解模板,如下:
void Backtrack(int t) { if(t > n) Output(x); else { for(int i = f(n, t); i <= g(n, t); i++) // f(n, t) 和 g(n, t) 分别表示当前扩展结点未搜索过的子树的起始编号和终止编号 { x[t] = h(i); if(Constraint(t)&&Bound(t)) Backtrack(t + 1); } } }
4.回溯法适合解组合数较大的问题。
5.为了提高回溯搜索效率,应在搜索过程进行适当的剪枝。剪枝策略通常有两种,一种是用约束函数在扩展结点处 剪去不满足约束条件的子树;另一种是用限界函数剪去得不到最优解的子树。