算法第五章作业

1. 问题描述

1.1题目

 最小重量机器设计问题

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

输入格式:

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

核心core:

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

 

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

根据样例数据用枚举法搜索空间,作出以下的可能解:

(X,Y,Z)

(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、3代表不同的供应商,位置X、Y、Z代表不同的部件。

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

   

 

 

 

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

如上图所示,每次回溯后会根据不同选择的供应商更新对应位置的节点,每个结点的状态值是该点的重量w和价格c。

2. 你对回溯算法的理解

回溯算法是一种选优搜索法,在搜索过程中寻找问题的解,当发现已不满足求解条件时,就回溯返回,尝试别的路径。当探索到原先选择不是目前的最优解或超过边界值时,就退回上一个结点并减支。解题步骤:

    (1)针对所给问题,确定问题的解空间: 首先应明确定义问题的解空间,问题的解空间应至少包含问题的一个(最优)解,还要判断边界条件。 

    (2)确定解空间。

    (3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。

 

posted @ 2021-12-14 21:05  小二脸  阅读(45)  评论(0编辑  收藏  举报