人工智能之启发式搜索

人工智能系列文章目录



前言

本博客记录本科人工智能学习过程,这篇博客主要讲AI中搜索的基本问题,从传统的盲目搜索过渡到要学习的启发式搜索。


一、什么是搜索?

根据问题的实际情况不断寻找可利用的知识,构造出 一条代价较少的推理路线,使问题得到圆满解决的过程称为搜索

包括两个方面:

◼ 找到从初始事实到问题最终答案的一条推理路径
◼ 找到的这条路径在时间和空间上复杂度最小

二、搜索策略

1.搜索分类

根据是否使用启发式信息分类:

▪ 盲目搜索:也称为无信息搜索,即只按预定的控制策略进行搜索,在搜索过程中获得的中间信息
不用来改进控制策略。
▪ 启发式搜索:在搜索中加入了与问题有关的启发性信息,用于指导搜索朝着最有希望的方向进行,加速问题的求解过程并找到最优解。

2.搜索策略评价

  1. 完备性:如果存在一个解答,该策略是否保证能够找到?
  2. 时间复杂性:需要多长时间可以找到解答?
  3. 空间复杂性:执行搜索需要多大存储空间?
  4. 最优性:如果存在不同的几个解答,该策略是否可以发现最高质量的解答?

三、盲目搜索

盲目搜索一般是按预定的搜索策略进行搜索。由于这种搜索总是按预定的路线进行,没有考虑到问题本身的特性,所以这种搜索具有很大的盲目性,效率不高,不便于复杂问题的求解。

包含:
• 深度优先搜索
• 宽度优先搜索
• 一致代价搜索
• 迭代加深搜索

1.(有界)深度优先搜索(Depth-first,DFS)

◼ 深度优先搜索生成节点并与目标节点进行比较是沿着树的最大深度方向进行的,只有当上次访问的节点不是目标节点,而且没有其他节点可以生成的时候,才转到上次访问节点的父节点。转移到父节点后,该算法会搜索父节点的其它的子节
点。
◼ 防止搜索过程沿着无益的路径扩展下去,往往给出一个节点扩展的最大深度——深度界限
在这里插入图片描述⚫ Open:未考察节点(节点已生成,已计算f(x), 但未扩展)
⚫ Closed:已考察节点(已扩展)
在这里插入图片描述步骤:
(1)把初始节点S0放入OPEN表
(2)如果OPEN表为空,则问题无解,退出
(3)把OPEN表的第一个节点(记为节点n)取出,放入CLOSED表
(4)考查节点n是否为目标节点.若是,则求得了问题的解,退出
(5)若节点n不可扩展,则转第(2)步
(6)扩展节点n,将其子节点放入OPEN表的首部,并为每一个子节点都配置指向父节 点的指针,转第(2)步

八数码问题:

在这里插入图片描述问题描述:
在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(
初始状态)和目标布局(目标状态),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。

# -*- coding: utf-8 -*-

'''
深度优先搜索实现
'''


import copy
#棋盘的类,实现移动和扩展状态
class grid:
    def __init__(self, stat):
        self.pre = None
        self.target = [[1, 2, 3], [8, 0, 4], [7, 6, 5]]
        self.stat = stat
        self.find0()
        self.update()
    #更新深度和距离和
    def update(self):
        self.fH()
        self.fG()

    # G是深度,也就是走的步数
    def fG(self):
        if (self.pre != None):
            self.G = self.pre.G + 1
        else:
            self.G = 0

    # H是和目标状态距离之和,可以用来判断是否找到解
    def fH(self):

        self.H = 0
        for i in range(3):
            for j in range(3):
                targetX = self.target[i][j]
                nowP = self.findx(targetX)
                self.H += abs(nowP[0] - i) + abs(nowP[1] - j)

    #以三行三列的形式输出当前状态
    def see(self):
        print("depth:", self.G)
        for i in range(3):
            print(self.stat[i])
        print("-" * 10)

    # 查看找到的解是如何从头移动的
    def seeAns(self):
        ans = []
        ans.append(self)
        p = self.pre
        while (p):
            ans.append(p)
            p = p.pre
        ans.reverse()
        for i in ans:
            i.see()
    #找到数字x的位置
    def findx(self, x):
        for i in range(3):
            if (x in self.stat[i]):
                j = self.stat[i].index(x)
                return [i, j]
    #找到0的位置,也就是空白格的位置
    def find0(self):
        self.zero = self.findx(0)

    #对当前状态进行扩展,也就是上下左右移动,返回的列表中是状态的二维列表,不是对象
    def expand(self):
        i = self.zero[0]
        j = self.zero[1]
        gridList = []
        if (j == 2 or j == 1):
            gridList.append(self.left(
<think>好的,我现在需要回答用户关于头歌平台中人工智能启发式搜索算法教程实现的问题。首先,我要确保自己正确理解用户的需求。用户提到了头歌平台、人工智能启发式搜索算法、教程和实现这几个关键词,所以需要围绕这些点展开。 首先,我需要回忆一下头歌平台的相关资料。根据用户提供的引用,引用[1]提到A算法是Nilsson提出的最佳图搜索算法,使用评估函数f(n)=g(n)+h(n),其中h(n)是到目标状态的最优路径代价。引用[2]解释了启发式搜索一致代价搜索的区别,强调f(n)和g(n)的不同作用。引用[3]则涉及头歌平台的一个实验,要求输出最短路径,并用0、1、8标记区域。这些引用都是关于启发式搜索在头歌平台上的应用,特别是A*算法。 接下来,我需要整理这些信息,按照用户的要求结构清晰、分步骤说明。用户可能需要知道头歌平台上的教程是如何教授启发式搜索的,包括理论知识和代码实现。因此,我的回答应该包括理论部分(如A*算法的原理、评估函数)和实践部分(如代码示例和实验指导)。 在组织内容时,要确保行内数学表达式用$...$格式,比如$f(n)=g(n)+h(n)$。独立公式用$$...$$,并单独成段。例如,在解释评估函数时,需要正确使用LaTeX格式。同时,回答中要引用提供的引用资料,在适当的位置添加引用标识,如[^1]、[^2]、[^3]。 然后,我需要考虑用户可能遇到的问题。例如,用户可能想知道如何在头歌平台上具体实现A*算法,或者如何理解评估函数中各部分的作用。因此,在回答中需要提供具体的步骤,比如定义节点类、实现优先队列、编写启发函数等,并结合代码示例进行说明。 同时,用户要求生成相关问题,我需要根据内容提出相关的问题,如算法优化、应用场景等。这些问题应该头歌平台的教学内容相关,帮助用户进一步学习。 最后,检查回答是否符合所有系统级指令:正确使用LaTeX格式、中文回答、引用标识、问题生成等。确保没有遗漏任何要求,比如代码块的使用和引用位置的正确性。</think>### 头歌平台中启发式搜索算法教程内容梳理 头歌平台关于人工智能启发式搜索算法教程主要围绕**A*算法**展开,包含以下核心内容: --- #### 一、A*算法理论基础 1. **评估函数定义** A*算法的核心是评估函数: $$f(n) = g(n) + h(n)$$ - $g(n)$:从初始状态到当前状态的实际路径代价 - $h(n)$:当前状态到目标状态的**启发式估计代价**(需满足可采纳性,即$h(n) \leq h^*(n)$,其中$h^*(n)$为真实最优代价)[^1] 2. **一般启发式搜索的区别** A*算法通过优先队列按$f(n)$排序节点,而一致代价搜索按$g(n)$排序。A*的$f(n)$融合了实际代价和启发式估计,能更高效地引导搜索方向[^2]。 --- #### 二、头歌平台实验实现步骤 以下为头歌平台“最短路径规划”实验的实现框架(Python示例): ```python class Node: def __init__(self, pos, parent=None): self.pos = pos # 当前坐标 (x,y) self.parent = parent self.g = 0 # 实际代价 self.h = 0 # 启发式估计代价 self.f = 0 # f(n) = g(n) + h(n) def __lt__(self, other): return self.f < other.f # 优先队列按f值排序 def heuristic(a, b): # 曼哈顿距离作为启发函数(需满足可采纳性) return abs(a[0] - b[0]) + abs(a[1] - b[1]) def a_star(grid, start, end): open_list = [] heapq.heappush(open_list, start) closed_set = set() while open_list: current = heapq.heappop(open_list) if current.pos == end.pos: return reconstruct_path(current) # 回溯路径 closed_set.add(current.pos) for neighbor in get_neighbors(grid, current): if neighbor.pos in closed_set: continue tentative_g = current.g + 1 # 假设每步代价为1 if neighbor not in open_list or tentative_g < neighbor.g: neighbor.g = tentative_g neighbor.h = heuristic(neighbor.pos, end.pos) neighbor.f = neighbor.g + neighbor.h heapq.heappush(open_list, neighbor) return None # 无可行路径 ``` **关键点说明**: - 地图用二维数组`grid`表示,`0`为可通行区域,`1`为障碍物[^3] - 路径标记方法:将最终路径上的坐标值设为`8` - 启发函数选择:实验中常用曼哈顿距离或欧氏距离,需根据场景选择可采纳的$h(n)$ --- #### 三、教学实验目标 头歌平台通过以下任务训练学生能力: 1. 理解启发式函数对搜索效率的影响 2. 实现优先级队列管理(对比DFS/BFS) 3. 分析算法复杂度路径最优性 4. 掌握路径回溯可视化方法(如矩阵标记`8`) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值