zoukankan      html  css  js  c++  java
  • 回溯:思想,思考

     回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的随意一点时,先推断该结点是否包括问题的解。假设肯定不包括,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。

    回溯法:为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数(bounding function)来处死那些实际上不可能产生所需解的活结点,以降低问题的计算量。具有限界函数的深度优先生成法称为回溯法


    回溯法基本思想:
    (1)针对所给问题,定义问题的解空间;
    (2)确定易于搜索的解空间结构;
    (3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索

    用递归方法实现回溯法。
    void backtrack (int t)
    {
           if (t>n) output(x);
           else
             for (int i=f(n,t);i<=g(n,t);i++) {
               x[t]=h(i);
               if (constraint(t)&&bound(t)) backtrack(t+1);
               }
    }

    採用树的非递归深度优先遍历算法,可将回溯法表示为一个非递归迭代过程。
    void iterativeBacktrack ()
    {
      int t=1;
      while (t>0) {
        if (f(n,t)<=g(n,t)) 
          for (int i=f(n,t);i<=g(n,t);i++) {
            x[t]=h(i);
            if (constraint(t)&&bound(t)) {
              if (solution(t)) output(x);
              else t++;}
            }
        else t--;
        }
    }


    遍历子集树
    void backtrack (int t)
    {
      if (t>n) output(x);
        else
          for (int i=0;i<=1;i++) {
            x[t]=i;
            if (legal(t)) backtrack(t+1);
          }
    }


    遍历排列树
    void backtrack (int t)
    {
      if (t>n) output(x);
        else
          for (int i=t;i<=n;i++) {
            swap(x[t], x[i]);
            if (legal(t)) backtrack(t+1);
            swap(x[t], x[i]);
          }

  • 相关阅读:
    WORD窗体保护密码清除
    在Fedora 23 Server和Workstation上安装LAMP(Linux, Apache, MariaDB和PHP)
    firefox 提示 ssl_error_unsupported_version 的解决方法
    算法题:求一个序列S中所有包含T的子序列(distinct sub sequence)
    Django模板输出Dict所有Value的效率问题
    笔记:LNK2001不代表链接器真的需要链接相关符号
    Windows Restart Manager 重启管理器
    advapi32.dll kernel32.dll 中的两套注册表API
    使用GDI+保存带Alpha通道的图像(续)
    使用GDI+保存带Alpha通道的图像
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4027195.html
Copyright © 2011-2022 走看看