第五章:回溯法

3 篇文章 0 订阅
3 篇文章 0 订阅

1. 请用回溯法的方法分析“最小重量机器设计问题”

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 在遍历解空间树的过程中,每个结点的状态值是什么

        在用回溯法解决“最小重量机器设计问题"中,每个节点的状态值包括当前的总成本cc总重量cw前面已选部件的数量其对应的供应商编号

1.4 如何利用限界函数进行剪枝

设当前总成本cc,最大成本d,当前总重量cw,当前最优解bestw

if(cc <= d && cw <= bestw) {
	backtrack(t + 1);
}

2. 你对回溯算法的理解

        回溯算法是一种通过不断试错来搜索解的算法,它是穷举方法的一种改进。通过回溯,算法能够遍历整个解空间,找到问题的最优解。当达到问题的边界条件或发现当前选择不满足约束条件时,算法会进行回溯,撤销之前的选择,尝试其他可能的选择。回溯算法的关键是在搜索的过程中进行剪枝,即在某个节点判断是否有必要继续探索其子树,这通常涉及到限界函数和约束条件,以确定是否有可能找到更优的解。通过合理设计状态值和剪枝条件,回溯算法能够高效地搜索解空间。

3. “最小重量机器设计问题”代码

#include<iostream>
using namespace std;
const int MAX = 35;

int n, m, d;
int cc, cw;
int x[MAX];
int bestx[MAX];
int weight[MAX][MAX];
int cost[MAX][MAX];
int bestw = 100000000;

void backtrack(int t) {
	if(t > n) {
		if(cw < bestw) {
			bestw = cw;
			for(int i = 1; i <= n; i++) {
				bestx[i] = x[i];
			}
		}
	}
	
	else {
		for(int i = 1; i <= m; i++) {
			x[t] = i;
			cw += weight[t][i];
			cc += cost[t][i];
			
			if(cc <= d && cw <= bestw) {
				backtrack(t + 1);
			}
			
			cc -= cost[t][i];
			cw -= weight[t][i];
		}
	}
}

int main() {
	cin >> n >> m >> d;
	
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= m; j++) {
			cin >> cost[i][j];
		}
	}
	
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= m; j++) {
			cin >> weight[i][j];
		}
	}
	
	backtrack(1);
	
	cout << bestw << endl;
	
	for(int i = 1; i <= n; i++) {
		cout << bestx[i] << " ";
	}
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值