JAVA用爬山法解决八皇后问题_局部搜索算法.ppt

局部搜索算法

人工智能原理第2章 搜索技术(下) 本章内容2.1 搜索与问题求解2.2 无信息搜索策略2.3 启发式搜索策略2.4 局部搜索算法2.5 约束满足问题2.6 博弈搜索参考书目附录 A*算法可采纳性的证明 2.4 局部搜索算法2.4.1 局部搜索与最优化2.4.2 爬山法搜索2.4.3 模拟退火搜索2.4.4 局部剪枝搜索2.4.5 遗传算法 局部搜索算法 前面的搜索算法都是保留搜索路径的,到达目标的路径就是问题的解—然而许多问题中到达目标的路径是无关紧要的 与系统地搜索状态空间(保留各种路径)相对,不关心路径的搜索算法就是局部搜索算法 局部搜索从一个单独的当前状态出发,通常只移动到相邻状态 典型情况下搜索的路径不保留 局部搜索算法的应用 集成电路设计 工厂场地布局 车间作业调度 自动程序设计 电信网络优化 车辆寻径 文件夹管理 2.4.1 局部搜索与最优化问题 局部搜索算法的优点: 只使用很少的内存(通常是一个常数) 经常能在不适合系统化算法的很大或无限的状态空间中找到合理的解 最优化问题—根据一个目标函数找到最佳状态 / 只有目标函数,而不考虑(没有)“目标测试”和“路径耗散” 局部搜索算法适用于最优化问题 状态空间地形图(1) 状态空间地形图(2) 在状态图中,既有“位置”(用状态表示)又有“高度”(用耗散值或目标函数值表示) 如果高度对应于耗散值,则目标是找到全局最小值,即图中最低点 如果高度对应于目标函数,则目标是找到全局最大值,即图中最高峰 如果存在解,则完备的局部搜索算法能够找到解 而最优的局部搜索算法能够找到全局最大或最小值 局部搜索算法 本节简要介绍以下4种局部搜索算法 / 介绍其算法思想 爬山法搜索 模拟退火搜索 局部剪枝搜索 遗传算法 从搜索的角度看遗传算法也是搜索假设空间的一种方法(学习问题归结为搜索问题)—生成后继假设的方式 2.4.2 爬山法搜索 爬山法(hill-climbing)—就是向值增加的方向持续移动—登高过程 / 如果相邻状态中没有比它更高的值,则算法结束于顶峰 爬山法搜索算法思想: (1)令初始状态S0为当前状态 (2)若当前状态已经达标,则算法运行结束,搜索成功 (3)若存在一个动作可以作用于当前状态以产生一个新状态,使新状态的估计值优于当前状态的估计值,则放弃当前状态,并令刚产生的新状态为当前状态,转(2) (4)取当前状态为相对最优解,停止执行算法 爬山法搜索的局限 爬山法是一种局部贪婪搜索,不是最优解算法(或是不完备的) / 其问题是: 局部极大值—比其邻居状态都高的顶峰,但是小于全局最大值(参照状态空间地形图) 山脊—一系列的局部极大值 高原—评价函数平坦的一块区域(或者山肩) 爬山法搜索的变形 爬山法的变形 随机爬山法—随机选择下一步 首选爬山法—随机选择直到有优于当前节点的下一步 随机重新开始爬山法—随机生成初始状态,进行一系列爬山法搜索—这时算法是完备的概率接近1 2.4.3 模拟退火搜索 将爬山法(停留在局部山峰)和随机行走以某种方式结合,以同时获得完备性和效率 模拟退火的思想 想象在不平的表面上如何使一个乒乓球掉到最深的裂缝中—如果只让其在表面滚动,则它只会停留在局部极小点 / 如果晃动平面,可以使乒乓球弹出局部极小点 / 技巧是晃动足够大使乒乓球弹出局部极小点,但又不能太大把它从全局极小点中赶出 模拟退火的解决思路(1) 思路—开始使劲晃动(先高温加热)然后慢慢降低摇晃的强度(逐渐降温)[退火过程] 算法的核心—移动选择 选择随机移动,如果评价值改善,则移动被接受,否则以某个小于1的概率接受 概率按照移动评价值变坏的梯度ΔE而呈指数级下降 / 同时也会随着作为控制的参数—“温度”T的降低(数值减小)而降低 接受概率=eΔE/T(注意此时ΔE <0) 模拟退火的解决思路(2) 温度T是时间的函数,按照模拟退火的思想,数值应该逐渐减小(降温) 因为接受概率=eΔE/T且ΔE <0,所以当温度高时,接受概率较大(接近1) / 而T越来越低时,ΔE/T变大,因而接受概率降低 可以证明,如果T下降得足够慢,则算法找到全局最优解的概率接近1 2.4.4 局部剪枝搜索 基本思想—与只从一个单独的起始状态出发不同,局部剪枝搜索从k个随机生成的状态开始,每步生成全部k个状态的所有后继状态 / 如果其中之一是目标状态,算法停止;否则从全部后继状态中选择最佳的k个状态继续搜索 在局部剪枝搜索过程中,有用的信息在k个并行的搜索线程之间传递—算法会很快放弃没有成果的搜索而把资源放在取得最大进展的搜索上 随机剪枝搜索 如果k个状态缺乏多样性,则局部剪枝搜索会受其影响,性能变差 算法的变种—随机剪枝搜索帮助缓解这一问题—随机剪枝搜索不

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
八皇后问题是指在8x8的棋盘上放置8个皇后,使得任意两个皇后都不能在同一行、同一列或同一斜线上。这是一个经典的搜索问题,可以使用爬山法解决爬山法是一种局部搜索算法,它从一个初始解开始,不断地选择当前解的邻居中最优的解作为下一步的解,直到达到一个局部最优解。在八皇后问题中,初始解可以是任意合法的布局,如下图所示: ``` 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 ``` 其中1表示皇后的位置,0表示空位。 对于每个解,可以计算出它的冲突数,即在同一行、同一列或同一斜线上的皇后对数。通过改变一个皇后的位置,可以得到它的邻居解。在所有邻居解中选择冲突数最小的解作为下一步的解,直到达到一个局部最优解。 下面是八皇后问题的Python实现: ```python import random def conflicts(board): n = len(board) count = 0 for i in range(n): for j in range(i+1, n): if board[i] == board[j]: count += 1 elif abs(i-j) == abs(board[i]-board[j]): count += 1 return count def neighbor(board): n = len(board) i = random.randint(0, n-1) j = random.randint(0, n-1) new_board = list(board) new_board[i] = j return new_board def hill_climbing(board): while True: curr_conflicts = conflicts(board) if curr_conflicts == 0: return board neighbor_board = neighbor(board) neighbor_conflicts = conflicts(neighbor_board) if neighbor_conflicts < curr_conflicts: board = neighbor_board ``` 其中`conflicts(board)`函数计算当前解的冲突数,`neighbor(board)`函数返回一个邻居解,`hill_climbing(board)`函数实现爬山法搜索。 下面是使用爬山法求解八皇后问题的示例代码: ```python n = 8 board = [random.randint(0, n-1) for i in range(n)] print("Initial board:", board) solution = hill_climbing(board) print("Solution:", solution) ``` 运行结果如下: ``` Initial board: [0, 1, 4, 3, 2, 3, 4, 6] Solution: [1, 3, 5, 7, 2, 0, 6, 4] ``` 这个结果表示,可以在以下棋盘上放置八个皇后,满足任意两个皇后都不能在同一行、同一列或同一斜线上。 ``` 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 ``` 虽然爬山法可以求解八皇后问题,但是它存在局限性,可能会陷入局部最优解而无法到达全局最优解。为了避免这个问题,可以使用更复杂的搜索算法,如模拟退火算法和遗传算法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值