算法第五章

1.问题描述

 

 

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

    if(t>n)//到达根结点
    {
        if(minwe>curwe)
        {
            minwe=curwe; 
            for(int i=1;i<=n;i++)
            {
                re[i]=x[i];
            }    
        } 
        return;
    }
        for(int i=1;i<=m;i++)
        {
            x[t]=i;
            curmon += c[t][i];
            curwe += w[t][i];
            if(curmon<=d&&curwe<=minwe)//剪枝函数
            {
                backtrack(t+1);
            }
            curmon-= c[t][i];
            curwe-= w[t][i];
        }        

解题思路:

 输入:部件有 n 个,供应商有 m 个,d 为总价格的上限。二维数组 w[i][j] 存储从供应商 j  处购得的部件 i 的重量,二维数组  c[i][j] 存储从供应商 j  处购得的部件 i 的价格。

  主函数递归backtrack函数,backtrack(1) 从第一个货物开始选择供应商

 backtrack:

  1. 用 for 循环对某个部件从 m 个不同的供应商进行选择
  2. curwe<=minwe——上界函数,若不满足,表示当前状态的重量已超最小重量,不是最优解,剪去相应子树,返回到 t-1 层继续执行。
  3. curmon<=d——约束函数,若不满足,表示当前状态的金额已超约束重量,是不可行解,剪去相应子树,返回到 t-1 层继续执行。 
  4. 若 t > n ,表示搜索到一个叶结点,若minwe>curwe,记录当前minwe,并用 re[i] 对每个部件的供应商进行记录. 

  输出:最小总重量minwe,每个部件选择的供应商re[i] 。 

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

  以输入样例为例,其解空间为:

(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)

【(X,Y,Z):x代表第1个部件选择第x个供应商,y代表第2个部件选择第y个供应商,z代表第3个部件选择第z个供应商。】

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

 

 

 

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

每个结点的状态值是选择到当前状态时的重量w和价格c

3. 你对回溯算法的理解

回溯法:

  按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。

  回溯算法解决问题:旅行售货员、n皇后问题、0-1背包问题。

剪枝函数:

  • 用 约束函数 在扩展结点处剪去不满足约束的子树
  • 用 上界函数 剪去得不到最优解的子树

子集树:

  当所给问题是从n个元素的集合S中找出满足某种性质的子集时(选或不选某个结点),相应的解空间树被称为子集树。

排列树:

  当所给问题是确定n个元素满足某种性质的排列时,相应的解空间树被称为排列树。

posted @ 2021-12-16 17:36  vivi耶嘿  阅读(44)  评论(0编辑  收藏  举报