算法第五章上机实验报告

算法第五章上机实验报告

 

 

一、实验题目:

题目名称:

最小重量机器设计问题

题目概述:

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

输入格式:

第一行有3 个正整数n ,m和d, 0<n<30, 0<m<30, 接下来的2n 行,每行m个数。前n行是c,后n行是w。

输出格式:

输出计算出的最小重量,以及每个部件的供应商。

 

二、用回溯法分析

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

对于每个部件来说,有m个供应商可供选择,这样就会有m^n种可选方案,其中有问题想要的最优解,这m^n种可选方案就是问题的解空间。然后把解空间组织成一棵m叉树,然后以深度优先搜索的方式纵深向下搜索,当不满足约束函数或者是限界函数时(在本题,约束函数就是本题给出的约束条件d;限界函数是之前搜索过的可行方案中最小的质量总和),回溯,寻求尝试另一种方案,然后继续纵深向下搜索。当向下搜索到叶子节点时,不再向下搜索,转去更新最优值。

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

 解空间为长度为n的供应商各种组合向量的集合。

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

 解空间树是一棵m叉树,m个分支表示对于每个零件的来说有m个供应商可以选择。

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

 累计的重量和价格。

 

三、回溯算法的理解和思考 

1.用回溯法解题通常包含三个步骤:(1)针对所给问题,定义问题的解空间;(2)确定易于搜索的解空间结构;(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。

2.回溯法既可以求问题的所有解;也可以求问题的某一解或是最优解。

3.用回溯法解题一般有通解模板,如下:

void Backtrack(int t)
{
    if(t > n)
        Output(x);
    else
    {
        for(int i = f(n, t); i <= g(n, t); i++) // f(n, t) 和 g(n, t) 分别表示当前扩展结点未搜索过的子树的起始编号和终止编号
        {
            x[t] = h(i); 
            if(Constraint(t)&&Bound(t))
                Backtrack(t + 1);
        }
    }
} 

4.回溯法适合解组合数较大的问题。

5.为了提高回溯搜索效率,应在搜索过程进行适当的剪枝。剪枝策略通常有两种,一种是用约束函数在扩展结点处 剪去不满足约束条件的子树;另一种是用限界函数剪去得不到最优解的子树。

posted @ 2021-12-13 16:16  xiaomeiman  阅读(56)  评论(0编辑  收藏  举报