434
社区成员
发帖
与我相关
我的任务
分享一、回溯法分析“最小重量机器设计问题”
问题解空间:
当有n个部件,m个不同的供货商时,解空间为 [(1, 1, 1, ..., 1, 1 n个1), (1, 1, 1, ..., 1, 2), (1, 1, 1, ..., 1, 3), ... , (1, 1, 1, ..., 1, m - 1), (1, 1, 1, ..., 1, m), (1, 1, 1, ..., 2, 1), (1, 1, 1, ..., 2, 2), ..., (1, 1, 1, ..., 2, m), ..., (m, m, m, ..., m, 1), (m, m, m, ..., m, 2), (m, m, m, ..., m, 3), ..., (m, m, m, ..., m, m - 1), (m, m, m, ..., m, m)]
问题解空间树:

在遍历解空间树的过程中,每个结点的状态值是当前已经选好的物品的总价值和总重量
以下是我的代码:
#include <iostream>
using namespace std;
int n, m, d, c[31][31], w[31][31], x[101], bestw = 0x3f3f3f3f, cw, lw[31], bestx[31];
void Backtrace(int t)
{
if (t > n) {
if (cw < bestw) {
bestw = cw;
for (int i = 1; i <= n; i++)
bestx[i] = x[i];
}
return;
}
for (int i = 1; i <= m; i++) {
x[t] = i;
if (d - c[t][i] >= 0 && cw + w[t][i] < bestw) {//d
cw += w[t][i];
d -= c[t][i];
Backtrace(t + 1);
cw -= w[t][i];
d += c[t][i];
}
}
}
int main()
{
cin >> n >> m >> d;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> c[i][j];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> w[i][j];
Backtrace(1);
cout << bestw << endl;
for (int i = 1; i <= n; i++)
cout << bestx[i] << " ";
return 0;
}
二、对回溯法的理解
回溯法要将问题所建立起来的解空间树逐步遍历到根节点,因此在实现的过程当中往往规模较大,该算法本身有穷举的成分在其中,但我们可以在求解问题的过程中通过加入约束函数和限界函数的做法,对这棵解空间树进行剪枝,减少不必要的时间开销,从而达到提升算法效率的目的。