1.什么是试探算法?

2.试探算法的解题的基本步骤

3.试探算法的思想

4.试探算法适合的问题

5.试探算法解决“八皇后”的问题


1.什么是试探算法?

  试探算法也叫回溯法,试探算法的处事方式比较委婉,它暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。当发现当前候选解不可能是正确的解时,就选择下一个候选解。如果当前候选解不满足问题规模要求外, 能够满足所有其他要求,则继续扩大当前候选解的规模,并继续试探。如果当前候选解满足包括问题规模在内的所有要求,该候选解就是问题的一个解。在试探算法中,放弃当前候选解,并继续寻找下一个候选解的过程称为回溯。扩大当前候选解的规模,并继续试探的过程称为向前试探。

2.试探算法的解题的基本步骤

  1. 针对所给问题,定义问题的解空间。
  2. 确定易于搜索的解空间结构。
  3. 以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。

3.试探算法的思想

为了求得问题的正确解,试探算法会先委婉地试探某种可能的情况。在进行试探的过程中,一旦发现原来选择的假设情况是不正确的,立即会自觉的退回一步重新选择,然后继续向前试探,如此这般反复进行,直至得到解或证明无解时才死心.

4.试探算法适合的问题

比如有一个元组n组成的一个状态空间,关于元组n,有多个条件组成的约束集合,满足这个条件约束集合的任一n元组为问题的一个解。只要检测出元组中有一个违反了约束,就可以肯定这个元组就不是问题的解,因而不必去搜素和检测它们,试探算法就是针对这类问题而推出的,比枚举算法的效率更高。

5.试探算法解决“八皇后”的问题

“八皇后”问题是一个古老而著名的问题,是试探法的典型例题。该问题由19世纪的数学家高斯于1850年手工解决:在8×8的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

可以将整个问题简化为4×4的棋盘,就有两种摆法,每行摆在列2、4、1、3或列3、1、4、2上

试探算法将每行的可行位置入栈(就是放入数组a[5],用的是a[1]~a[4]),不行就退栈还列重新试,直到找到一套方案并输出,接着从第一行换列重试其他方案。

为了简化问题,考虑到8个皇后不同行,则每一行放置一个皇后,每一行的皇后可以放置于第0~7列,我们认为每一行的皇后有8种状态。那么,只要套用子集树模板,从第0行开始,自上而下,对每一行的皇后,遍历它的8个状态即可。

n = 8
x = []  # 一个解(n元数组)
X = []  # 一组解# 冲突检测:判断x[k] 是否与前面的x[0] ~ x[k-1]
def conflict(k):global xfor i in range(k):  # 遍历前面的x[0] ~ x[k-1]:if x[i] == x[k] or abs(x[i] - x[k]) == abs(i - k):  # 判断是否与x[k]冲突return Truereturn False# 套用子集树模板
def queens(k):  # 到达第k行global n, x, Xif k >= n:  # 超出最底行X.append(x[:])  # 保存(一个解),注意x[:]else:for i in range(n):  # 遍历第0~n-1列(即n个状态)x.append(i)  # 皇后置于第i列,入栈if not conflict(k):  # 剪枝queens(k + 1)x.pop()  # 回溯,出栈def show(x):global nfor i in range(n):print('. ' * (x[i]) + 'X ' + '. ' * (n - x[i] - 1))if __name__ == '__main__':queens(0)  # 从第0行开始print(X[-1], '\n')show(X[-1])

程序运行结果:

4.Python算法之试探算法思想(回溯法)相关推荐

  1. 算法设计与分析之回溯法

    文章目录 前言 一.回溯法概述 二.回溯法的基本思想 三.回溯法的设计步骤 四.回溯法效率分析 五.回溯法示例 总结 前言 大家好,越努力,越幸运,我是程序猿小猿.本篇文章小猿将跟您分享算法设计与分析 ...

  2. 算法与程序设计(五):回溯法

    目录 背景 一.概念 1.1 回溯法的算法框架 1.2 详解说明 二.举例 2.1 批作业调度问题 2.2 装载问题 背景 一.概念 回溯法有"通用解题法"之称,用它可以系统地搜索 ...

  3. 算法设计与分析复习--回溯法

    算法设计与分析期末复习 主要参考: ​ 算法设计与分析(北京航空航天大学MOOC) ​ 算法设计与分析(北京大学MOOC) ​ 华中科技大学 计算机科学与技术学院 算法设计与分析 课堂教学PPT 五. ...

  4. 回溯算法背包问题迭代c语言,回溯法解决0_1背包问题(迭代和递归)

    问题:0/1背包问题 例子:weight数组代表物品重量,value数组代表物品价值,M代表背包容量.背包是按单位价值递减的顺序排列的,即value[i]/weight[i]>value[i-1 ...

  5. 【算法实验二】--【回溯法】--踩气球

    1142.踩气球 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 六一儿童节,小朋友们做踩气球游戏,气球的编号是1-100,两位小朋友各踩了一些气球,要求他们报出自己所踩气球 ...

  6. python找零钱问题_Python基于回溯法子集树模板解决找零问题示例

    本文实例讲述了Python基于回溯法子集树模板解决找零问题.分享给大家供大家参考,具体如下: 问题 有面额10元.5元.2元.1元的硬币,数量分别为3个.5个.7个.12个.现在需要给顾客找零16元, ...

  7. 回溯法基本思想_回溯算法(一)

    一.什么是回溯算法 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.许多复杂的,规模较大的问题 ...

  8. 回溯法遵循深度优先吗_回溯算法(一)

    一.什么是回溯算法 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.许多复杂的,规模较大的问题 ...

  9. 回溯法采用的搜索策略_五大常用算法之四:回溯法

    1.概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.回溯法是一种选优搜索法,按选优条件向 ...

最新文章

  1. linux命令:grep
  2. drf-频率组件 权限组件
  3. HDU 4565So Easy!2012长沙邀请赛A题(共轭构造+矩阵的快速幂)
  4. SpringCloud教程- 服务消费者(rest+ribbon)(SpringCloud版本Finchley)
  5. 左右伸缩_SSFB梳齿型桥梁伸缩缝安装步骤及使用特性
  6. 国产品牌“爱国者”首次杀入数码相机十强
  7. UITablView索引列表
  8. vc ado连接mysql_VC用Ado接口连接和使用数据库及注意事项
  9. 谷歌Chrome浏览器开发者工具教程—基础功能篇
  10. 华为实习日记——第三十七天
  11. Leetcode#191Number of 1 Bits
  12. win7/64位下python2.7、easy_install安装经验
  13. 利用JS实现简单的注册界面验证小案例
  14. template应用之Policies和Policy Classes
  15. Introduction to Wireless LAN Measurements From 802.11a to 802. 11 ac
  16. BZOJ 5442 [Ceoi2018]Global warming
  17. Zookeeper一致性级别分析,含爱奇艺,小米,腾讯,阿里
  18. 天下没有不会这么回事!不会就学——北漂18年(28)
  19. 服务器热备份、虚拟,VMware虚拟机热备份的几种方法
  20. 认认真真推荐几个清华学霸的公众号!

热门文章

  1. 分析约瑟夫问题(循环单链表)
  2. 第一阶段:Java基础之OOP
  3. 计算机IO系列「零」计算机IO【硬件部分】
  4. 操作系统——磁盘寻道练习题及答案
  5. 离散数学关系的基本运算和关系的性质闭包
  6. shell读取文件到变量、管道重定向、if和while嵌套使用、命令替换
  7. 【python网络编程】创建TCP/UDP服务器进行客户端/服务器间通信
  8. Android 缓存
  9. Android 开源库和项目 2
  10. 【pnglib】解析png格式的图像