一、 请用回溯法的方法分析“最小重量机器设计问题”
题目内容:设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设wij是从供应商j 处购得的部件i的重量,cij是相应的价格。
试设计一个算法,给出总价格不超过d的最小重量机器设计。
1.1 说明“最小重量机器设计问题"的解空间
在样例n=3,m=3时,解空间为
(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)
1.2 说明 “最小重量机器设计问题"的解空间树
广度优先遍历:
1.3 在遍历解空间树的过程中,每个结点的状态值是什么
是当前已选部件的总价值和当前已选部件占有的总重量
二、 对回溯算法的理解
回溯算法有一个大体不变的框架,类似遍历,但又记录下了变化状态,可以通过剪枝和约束条件减少回溯的数量,提高效率。本质是将问题的解空间以树或图的结构表示,然后使用深度优先搜索策略进行遍历,在遍历的过程中给出所有可行解或者最优解。
其中数据回溯的特点将数据记录量大大减少,仅取最优解。
void back(int t){
if ( t == n){
bestc = 当前最优解(可以是最大,也可以是最小,根据题目决定);
}
for(int i = 1;i <= n;i++){
//当只有两个选择,如0-1背包问题,则只需要判断选择左子树还是右子树即可,相当于n = 2
记录数据变化;
向下遍历;//可以添加一些约束条件
回溯数据;
}
}