回溯法基本框架

1.非递归回溯框架

int x[n];				//x存放解向量,全局变量
void backtrack(int n)			//非递归框架
{  int i=1;				//根结点层次为1
   while (i>=1)			//尚未回溯到头
   {  if(ExistSubNode(t)) 		//当前结点存在子结点
      {  for (j=下界;j<=上界;j++)	//对于子集树,j=0到1循环
         {  x[i]取一个可能的值;
            if (constraint(i) && bound(i)) 
					//x[i]满足约束条件或界限函数
            {  if (x是一个可行解)
		   输出x;
               else	i++;		//进入下一层次
	     }
         }
      }
      else  i--;			//回溯:不存在子结点,返回上一层
   }
}

2.递归算法框架

(1)解空间为子集树
子集树是每个元素只有两种扩展,要么选择要么不选择

int x[n];			   //x存放解向量,全局变量
void backtrack(int i)		   //求解子集树的递归框架
{  if(i>n)			   //搜索到叶子结点,输出一个可行解
      输出结果;
   else
   {  for (j=下界;j<=上界;j++)   //用j枚举i所有可能的路径
      {  x[i]=j;		   //产生一个可能的解分量//其他操作
         if (constraint(i) && bound(i))
            backtrack(i+1);	   //满足约束条件和限界函数,继续下一层
      }
   }
}

(2)解空间为排列树

int x[n];			//x存放解向量,并初始化
void backtrack(int i)		//求解排列树的递归框架
{  if(i>n)			//搜索到叶子结点,输出一个可行解
	输出结果;
   else
   {  for (j=i;j<=n;j++)	//用j枚举i所有可能的路径
      {//第i层的结点选择x[j]的操作
         swap(x[i],x[j]);	//为保证排列中每个元素不同,通过交换来实现
         if (constraint(i) && bound(i))
	     backtrack(i+1);	//满足约束条件和限界函数,进入下一层
         swap(x[i],x[j]);	//恢复状态//第i层的结点选择x[j]的恢复操作
      }
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值