算法第五章作业
1. 问题描述
1.1题目
最小重量机器设计问题
设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设wij是从供应商j 处购得的部件i的重量,cij是相应的价格。 试设计一个算法,给出总价格不超过d的最小重量机器设计。
输入格式:
第一行有3 个正整数n ,m和d, 0<n<30, 0<m<30, 接下来的2n 行,每行n个数。前n行是c,后n行是w。
输出格式:
输出计算出的最小重量,以及每个部件的供应商
输入样例:
3 3 4
1 2 3
3 2 1
2 2 2
1 2 3
3 2 1
2 2 2
结尾无空行
输出样例:
在这里给出相应的输出。例如:
4
1 3 1
核心core:
void backtrack (int t) {
if (t > n) {
minw = cw;
for (int i = 1; i <= n; i++) {
bestx[i] = x[i];
}
return;
} else {
for (int i = 1; i <= m; i++) {
if (cc + c[t][i] <= d && cw + w[t][i] < minw) {
x[t] = i;
cw += w[t][i];
cc += c[t][i];
backtrack(t+1);
cw -= w[t][i];
cc -= c[t][i];
}
}
}
}
1.2 说明“最小重量机器设计问题"的解空间
根据样例数据用枚举法搜索空间,作出以下的可能解:
(X,Y,Z)
(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、3代表不同的供应商,位置X、Y、Z代表不同的部件。
1.3 说明 “最小重量机器设计问题"的解空间树
1.4 在遍历解空间树的过程中,每个结点的状态值是什么
如上图所示,每次回溯后会根据不同选择的供应商更新对应位置的节点,每个结点的状态值是该点的重量w和价格c。
2. 你对回溯算法的理解
回溯算法是一种选优搜索法,在搜索过程中寻找问题的解,当发现已不满足求解条件时,就回溯返回,尝试别的路径。当探索到原先选择不是目前的最优解或超过边界值时,就退回上一个结点并减支。解题步骤:
(1)针对所给问题,确定问题的解空间: 首先应明确定义问题的解空间,问题的解空间应至少包含问题的一个(最优)解,还要判断边界条件。
(2)确定解空间。
(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。