第五章实验报告

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

题目:

7-2 最小重量机器设计问题 (25 分)

设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设wij​是从供应商j 处购得的部件i的重量,cij​是相应的价格。 试设计一个算法,给出总价格不超过d的最小重量机器设计。

输入格式:

第一行有3 个正整数n ,m和d, 0<n<30, 0<m<30, 接下来的2n 行,每行m个数。前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

代码:

 

#include <iostream>
using namespace std;
int n,m,d; //部件数量,供应商,最高总额
int c[100][100]; //价值
int w[100][100]; //重量
int cv,cw;// 当前价值,当前重量
int x[100];
int supplier[100];//所选供应商
int min_m=10000;
void Backtrack(int t){
    if(t>n){
        if(cw<min_m){
            min_m=cw;
            for(int i=1;i<=n;i++){
                supplier[i]=x[i];
            }
        }
    }
    else{
        for(int i=1;i<=m;i++){
            x[t]=i;
            cv+=c[t][i];
            cw+=w[t][i];
            if(cv<=d&&cw<min_m){
                Backtrack(t+1);
            }
            cv-=c[t][i];
            cw-=w[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];
        }
    }
    cw=0;
    cv=0;
    Backtrack(1);
    cout<<min_m<<endl;
    for(int i=1;i<=n;i++){
        cout<<supplier[i]<<" ";
    }
}

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

答:由于每一种部件都可以从m个不同的供应商处购得,所以解空间是每个部件选择的不同供应商

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

答:若根节点为第0层,树的第一层为第一个部件所选择的供应商,树的第i层为第i个部件所选择的供应商,

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

答: ① 当前重量:价值不超过规定值的条件下,当前所选部件的总重量

② 当前价值:价值不超过规定值的条件下,当前所有所选部件的总价值

2. 你对回溯算法的理解

 答:应用回溯算法的步骤:

1.构造解空间树:子集树和排列树;

2.以深度优先的方式搜索解空间:递归或迭代;

3.设计剪枝函数避免无效搜索:使用约束函数,剪去不满足约束条件的路径或使用限界函数,剪去不能得到最优解的路径。

在任何时候,只需保存从根节点到当前扩展结点的路径。

在回溯问题中,若要求问题的所有解,就要回溯到根。

posted @ 2021-12-14 21:54  borntodie  阅读(40)  评论(0)    收藏  举报