回溯法分析“最小重量机器设计问题”及对回溯法的理解

软工2101梁傲轩 2022-12-10 19:18:39

一、回溯法分析“最小重量机器设计问题”

问题解空间:

当有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;
}

 

二、对回溯法的理解

        回溯法要将问题所建立起来的解空间树逐步遍历到根节点,因此在实现的过程当中往往规模较大,该算法本身有穷举的成分在其中,但我们可以在求解问题的过程中通过加入约束函数和限界函数的做法,对这棵解空间树进行剪枝,减少不必要的时间开销,从而达到提升算法效率的目的。

...全文
60 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

434

社区成员

发帖
与我相关
我的任务
社区描述
广东外语外贸大学信息科学与技术学院
算法 高校
社区管理员
  • brisksea
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧