人智导(一):无信息搜索

人智导(一):无信息搜索

搜索

状态空间模型:
定义两个基本元素(本体):

  • 动作(action)
  • 状态(state)
    用来描述及表示:
  • 问题(problem)
  • 目标(goal)
  • 解决问题的途径(solution)
    状态空间模型中的一些概念:
  • 环境(世界):一系列的状态集合、
  • 动作:导致状态转移 s ′ = r e s u l t ( s , a ) s' = result(s,a) s=result(s,a)
  • 目标:世界中的某些状态,使目标得以满足
    智能体(agent)的任务:
  • 已知目前所处的状态,和动作的效果
  • 发现一个动作序列(solution)以达到目标(goal)状态

搜索算法的设计

步骤如下:

  • 目标形式化描述:问题求解的第一步
  • 问题形式化描述:针对目标,需要考虑(抽象出)什么动作与状态
  • 问题求解:一个搜索过程,即发现从一个初始状态到目标状态的动作序列
  • 设计搜索算法:输入问题的形式化描述,返回一个解决途径(即动作序列)
    伪代码:
Function SIMPLE-PROBLEM-SOLVING-AGENT(p) returns an action
	inputs: p      \\a percept
	static: s      \\an action ssequence, intially empty
	        state  \\some description of the current world state
	        g      \\a goal
	        problem\\a problem formulation
	state <--- UPDATE-STATE(state,p)
	if s is empty then
		g <--- FORMULATE-GOAL(state)
		problem <--- FORMULATE-PROBLEM(state, g)
		s <--- SEARCH(problem)
	action <--- FIRST(s)
	s <--- REST(s)
	return action

举例:
地图如下:
人智导(一):无信息搜索_第1张图片
从Arad到Bucharest
于是有:

  • 目标:到Bucharest
  • 问题描述:
    • 状态空间:罗马尼亚各个城市
    • 动作:开车从一个城市到另一座城市
  • 解决方法(动作序列): A r a d → S i b i u → F a g a r a s → B u c h a r e s t Arad\to Sibiu\to Fagaras\to Bucharest AradSibiuFagarasBucharest

问题的形式化表示

问题的类型

  1. 单一状态(single-state)类型的问题
    • 环境可观测:能精确地感知到其所在状态
    • 动作效果确定:能准确地知道其每个动作及其效果
  2. 多状态(multiple-state)类型的问题
    • 环境不可/部分观测:不能感知或部分感知到其所在状态
    • 动作效果确定:能准确地知道每个动作及其效果
  3. 不可测(contingency)类型问题
    • 环境不可/部分观测:不能感知到或部分感知到其所在状态
    • 动作效果非确定(non-deterministic):智能体不知道其动作的确切效果
    • 问题解决途径:一个动作树结构,而非动作序列
    • 由于精确预测是不可能的,因此智能体需要与环境实时交互
    • 试行错误(trail and error)的过程(即学习)
  4. 探查(exploration)类型的问题
    • 对环境及动作的效果没有先验信息,甚至一无所知
    • 只能通过实践逐步在其经历中发现有何状态存在、动作有何效果
    • 不再通过模型来实现搜索,经验可用于学习
      举例:真空吸尘器世界

问题的形式化表示

四个组成部分:

  • 初始状态(initial state):智能体初始时所在的状态
  • 后继函数 SUCCESSOR-FN(s):给定状态s,返回集合 { < a 1 , s 1 ′ > , … , < a n , s n ′ > } \{,\dots ,\} {<a1,s1>,,<an,sn>}
  • 目标测试(goal test):判断一个状态是否是目标状态
  • 代价函数:动作的代价ACTION-COST(s,a,s’),路径代价(path cost)是其中每个动作代价的总和
    举例:旅行路径发现

问题求解通用框架

如何产生动作序列?

  • 搜索的本质:后记状态(节点)扩展的次序
    • 如果选择的后继状态不是目标状态,继续扩展所选状态
  • 搜索策略
    • 针对多个后继状态,决定哪一个首先进行扩展(不同策略对应于不同的搜索算法
  • 搜索过程:
    • 选择–>测试–>扩展

搜索树的数据结构

树节点:

  • 节点所对应状态(state)
  • 父节点指针
  • 动作(action),达到该节点状态的动作
  • 当前节点深度
  • 路径代价:从初始状态到当前节点

搜索策略:一个队列函数

待扩展的节点集合:Frontier
策略:在Frontier中选择下一个扩展的节点
队列操作:

  • Make-Queue(Elements)
  • Empty?(Queue)
  • Remove-Front(Queue)
  • Queuing-Fn(Elements, Queue)

搜索的通用框架

// 搜索算法
Function GENERAL-SEARCH(problem, QUEUING-FN) returns a solution or failure
	frontier <--- MAKE-QUEUE(MAKE-NODE(INITIAL-STATE[problem]))
	loop do
		if frontier is empty then return failure
		node <--- REMOVE-FRONT(frontier)
		if GOAL-TEST[problem] applied to STATE(node) succeeds
		then return solution(node)
		frontier <--- QUEUING-FN(frontier, EXPAND(node, OPERATORS[problem]))
	end
// 节点扩展算法
Function EXPAND(node, OPERATORS[problem])returns a set of nodes
	successors <--- the empty set
	for each  in OPERATORS[problem][STATE[node]] do
		s <--- a new Node
		STATE[s] <--- result
		PARENT-NODE[s] <--- node
		ACTION[s] <--- action
		PATH-COST[s] <--- PATH-COST[node]+ACTION-COST(node, action, s)
		DEPTH[s] <--- DEPTH[node]+1
		add s to successors
	return successors

无信息搜索

搜索策略性能评价标准

  • 完备性(conpleteness):如果存在一个求解途径,那么保证能够发现这个途径
  • 最优性(optimality):如果存在多个解决途径,搜索策略能够发现最佳的(最低路径代价)
  • 时间复杂度(Time complexity):需要多少时间才能发现问题的解决途径(搜索代价)
  • 空间复杂度(Space complexity):完成一个搜索需要多少内存空间(搜索代价)

无信息搜索概述

智能体对其当前状态到目标状态的步骤数目或路径代价等没有任何信息,仅知道目标状态和非目标状态的区分,包括:

  • 广度优先搜索
  • 最小路径代价搜索
  • 深度优先搜索
  • 限定深度搜索
  • 深度迭代搜索

广度优先搜索

人智导(一):无信息搜索_第2张图片
算法:

function Breadth-First-Search(problem) returns a solution or failure
return General-Search(problem, ENQUEUE-AT-END)

特点:

  • 完备的
  • 最优的
  • 时间和空间复杂度: O ( b d + 1 ) O(b^{d+1}) O(bd+1),其中b为搜索树最大分支数目,d为搜索树中最浅解的深度
  • 复杂度高,故而许多情况下不适用
    举例:

最小路径代价搜索

人智导(一):无信息搜索_第3张图片
在Frontier集合中扩展最小的路径代价节点而非最浅深度节点
特点:

  • g ( n ) = D E P T H ( n ) g(n)=DEPTH(n) g(n)=DEPTH(n)时,广度优先搜索即为最小路径代价搜索
  • g ( S U C C E S S O R ( n ) ) ≥ g ( n ) g(SUCCESSOR(n))\ge g(n) g(SUCCESSOR(n))g(n)条件下最小路径代价搜索能发现最佳solution
  • 完备的
  • 最优的
  • 时间和空间复杂度: O ( b p / q ) O(b^{p/q}) O(bp/q),其中p为最优解的路径代价,q为动作代价最小值
    举例:

深度优先搜索

人智导(一):无信息搜索_第4张图片
每次在搜索树的最深层扩展一个节点
算法:

Function DEPTH-FIRST-SEARCH(problem) returns solution or failure
GENERAL-SEARCH(problem, ENQUEUE-AT-FRONT)

特点:

  • 既不完备,也不最优
  • 空间复杂度: O ( b m ) O(bm) O(bm)
  • 时间复杂度: O ( b m ) O(b^m) O(bm)
  • 对于许多问题的解决,快于广度优先算法
  • 应避免搜索过大的深度
    举例:

限定深度搜索

  • 限定深度搜索 = 深度优先搜索 + 深度限定阈值 I I I
  • 算法实现:在深度为 I I I的节点不再有后继
  • 如果最浅层的目标状态出现在深度为 I I I的层,那么时间和空间复杂度都是最小的
  • I > d I>d I>d,则限定深度搜索是完备的,但不一定是最优的
  • 时间复杂度: O ( b l ) O(b^l) O(bl)
  • 空间复杂度: O ( b l ) O(bl) O(bl)

迭代深度搜索

限定深度搜索 + 迭代地增加深度阈值:直到目标状态被发现
算法:

Function ITERATIVE-DEEPENING-SEARCH(problem) returns a solution sequence
input: problem
for depth <--- 0 to oo do
	if DEPTH-LIMITED-SEARCH(problem, depth) succeeds
	then return its result
end
return failure

特点:

  • 融合了深度优先搜索与广度优先搜索的特点
  • 迭代深度优先搜索:完备的且最优的
  • 时间复杂度: O ( b d ) O(b^d) O(bd)
  • 空间复杂度: O ( b d ) O(bd) O(bd)
  • 迭代深度优先搜索在以下情况多被采用:
    • 搜索空间较大
    • 解的深度完全未知

图搜索

特点:

  • 避免树搜索过程中的状态重复出现
  • 增加数据结构closed表,记录每个扩展过的状态
  • 探查状态空间过程(存储代价)
    算法:
Function GRAPH-SEARCH(problem, QUEUING-FN) returns a solution or failure
	closed <--- an empty set
	frontier <--- MAKE-QUEUE(MAKE_NODE(INITIAL-STATE[problem]))
	loop do
		if frontier is empty then return failure
		node <--- REMOVE-FRONT(frontier)
		if GOAL-TEST[problem] applied to STATE(node) then return solution(node)
		if STATE[node] is not in closed then
			add STATE[node] to closed
			frontier <--- QUEUING-FN(frontier,EXPAND(node, OPERATIONS[problem]))
	end

你可能感兴趣的:(数学与逻辑)