您的位置:首页 > 理论基础

计算机算法设计与分析——回溯法

2020-02-02 14:29 1206 查看

回溯法的算法框架

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 (constrint(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 (constrint(i) && bound(i))
backtrack(i + 1);//满足约束条件和限界函数,继续下一层
swap(x[i], x[j]);//恢复状态
...//第i层的结点选择x[j]的恢复操作
}
}
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
可一z可再 发布了18 篇原创文章 · 获赞 1 · 访问量 242 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: