第五章实验报告

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

#include <iostream>
using namespace std;
int n,m,d;
int w[40][40];//重量 
int c[40][40];//价格 
int bestx[40];//最优解
int x[40];//当前解 
int cw=0,cc=0,mw=9999999;//当前重量 当前价格 当前解
void Backtrack(int depth){
if(depth>n){//找到根节点 
if(cw<mw){//当前值小于最小值 
for(int i=1;i<=n;i++) 
bestx[i]=x[i];
mw=cw;
}
return;
}
for(int i=1;i<=m;i++){ //m个商店对应n层分叉树 
x[depth]=i;
cc+=c[depth][i];
cw+=w[depth][i];
if(cc<=d&&cw<mw){// 当前价格小于最优价格 当前重量小于最优重量 
Backtrack(depth+1);
}
x[depth]=0;//回溯 更新信息 
cc-=c[depth][i];
cw-=w[depth][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];
}
}
Backtrack(1);
cout<<mw<<endl;
for(int i=1;i<=n;i++){
cout<<bestx[i]<<" ";
}
return 0;
}

1.1 说明“最小重量机器设计问题"的解空间

对于n个部件,每一个部件可以从m个不同的供应商处获得,每一个供应商都有对应的重量w和价格c。

1.2 说明 “最小重量机器设计问题"的解空间树

解空间数的每一层为一个部件对m个供应商的选择

1.3 在遍历解空间树的过程中,每个结点的状态值是什么

每个节点对应的总价值和总重量

2. 你对回溯算法的理解

    回溯法按深度优先策略搜索问题的解空间树。首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(即能得到问题的解)。如果不可行,则跳过对该节点为根的子树的搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索。剪枝函数包括两类:1. 使用约束函数,剪去不满足约束条件的路径;2.使用限界函数,剪去不能得到最优解的路径。

posted @ 2021-12-16 21:14  马尔济斯面包狗  阅读(26)  评论(0编辑  收藏  举报