4.Python算法之试探算法思想(回溯法)
1.什么是试探算法?
2.试探算法的解题的基本步骤
3.试探算法的思想
4.试探算法适合的问题
5.试探算法解决“八皇后”的问题
1.什么是试探算法?
试探算法也叫回溯法,试探算法的处事方式比较委婉,它暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。当发现当前候选解不可能是正确的解时,就选择下一个候选解。如果当前候选解不满足问题规模要求外, 能够满足所有其他要求,则继续扩大当前候选解的规模,并继续试探。如果当前候选解满足包括问题规模在内的所有要求,该候选解就是问题的一个解。在试探算法中,放弃当前候选解,并继续寻找下一个候选解的过程称为回溯。扩大当前候选解的规模,并继续试探的过程称为向前试探。
2.试探算法的解题的基本步骤
- 针对所给问题,定义问题的解空间。
- 确定易于搜索的解空间结构。
- 以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
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.1 回溯法的算法框架 1.2 详解说明 二.举例 2.1 批作业调度问题 2.2 装载问题 背景 一.概念 回溯法有"通用解题法"之称,用它可以系统地搜索 ...
- 算法设计与分析复习--回溯法
算法设计与分析期末复习 主要参考: 算法设计与分析(北京航空航天大学MOOC) 算法设计与分析(北京大学MOOC) 华中科技大学 计算机科学与技术学院 算法设计与分析 课堂教学PPT 五. ...
- 回溯算法背包问题迭代c语言,回溯法解决0_1背包问题(迭代和递归)
问题:0/1背包问题 例子:weight数组代表物品重量,value数组代表物品价值,M代表背包容量.背包是按单位价值递减的顺序排列的,即value[i]/weight[i]>value[i-1 ...
- 【算法实验二】--【回溯法】--踩气球
1142.踩气球 时限:1000ms 内存限制:10000K 总时限:3000ms 描述 六一儿童节,小朋友们做踩气球游戏,气球的编号是1-100,两位小朋友各踩了一些气球,要求他们报出自己所踩气球 ...
- python找零钱问题_Python基于回溯法子集树模板解决找零问题示例
本文实例讲述了Python基于回溯法子集树模板解决找零问题.分享给大家供大家参考,具体如下: 问题 有面额10元.5元.2元.1元的硬币,数量分别为3个.5个.7个.12个.现在需要给顾客找零16元, ...
- 回溯法基本思想_回溯算法(一)
一.什么是回溯算法 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.许多复杂的,规模较大的问题 ...
- 回溯法遵循深度优先吗_回溯算法(一)
一.什么是回溯算法 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.许多复杂的,规模较大的问题 ...
- 回溯法采用的搜索策略_五大常用算法之四:回溯法
1.概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.回溯法是一种选优搜索法,按选优条件向 ...
最新文章
- linux命令:grep
- drf-频率组件 权限组件
- HDU 4565So Easy!2012长沙邀请赛A题(共轭构造+矩阵的快速幂)
- SpringCloud教程- 服务消费者(rest+ribbon)(SpringCloud版本Finchley)
- 左右伸缩_SSFB梳齿型桥梁伸缩缝安装步骤及使用特性
- 国产品牌“爱国者”首次杀入数码相机十强
- UITablView索引列表
- vc ado连接mysql_VC用Ado接口连接和使用数据库及注意事项
- 谷歌Chrome浏览器开发者工具教程—基础功能篇
- 华为实习日记——第三十七天
- Leetcode#191Number of 1 Bits
- win7/64位下python2.7、easy_install安装经验
- 利用JS实现简单的注册界面验证小案例
- template应用之Policies和Policy Classes
- Introduction to Wireless LAN Measurements From 802.11a to 802. 11 ac
- BZOJ 5442 [Ceoi2018]Global warming
- Zookeeper一致性级别分析,含爱奇艺,小米,腾讯,阿里
- 天下没有不会这么回事!不会就学——北漂18年(28)
- 服务器热备份、虚拟,VMware虚拟机热备份的几种方法
- 认认真真推荐几个清华学霸的公众号!