用搜索法对问题求解

      本章将描述一种基于目标的智能体,称为问题求解智能体。将会提出几个通用的搜索算法,但这些算法是无信息的,除了问题的定义,没有其他关于问题的信息,下一章将探讨有信息的搜索算法。

1.问题求解智能体

     通过评价多个未知的行动序列来选择最佳行动序列的智能体叫做问题求解智能体。寻找这样序列的过程叫做搜索。一个简单的问题求解智能体的算法如下。

function SIMPLE-PROBLEM-SOLVING-AGENT(percept) returns action
  inputs percept, a percept
  static seq, an action sequence, initially empty
         state, some description of the current world state
         goal, a goal, initially null
         problem, a problem formulation
 
   state <--- UPDATE-STATE(state,percept)
   if seq is empty then do
      goal <--- FORMULATE-GOAL(state)
      problem <--- FORMULATE-PROBLEM(state,goal)
      seq <- SEARCH(problem)
   action <--- FIRST(seq)
   seq <--- RESET(seq)
   return action

     该算法输入当前感知,内部静态量有行动序列、状态、目标和问题。行动序列初始化为空,目标初始化为null。智能体每得到一个感知,就调用该算法进行动作求解。每次进入该程序时首先通过当前状态和感知更新状态。初始seq为空时,先格式化目标、完成目标遇到的问题、通过问题来搜索出最佳序列,当seq不为空时省略这一步。之后将序列的第一个动作赋予action,并将该动作从seq中删除(即重置seq),最后返回action。

       该算法相当于人类有一个目标之后,分析问题,指定计划,一步步实施。缺点在于不能通过当前状态来时时更新计划(即seq)。使用环境属性来描述的话,该智能体的环境是:静态的、可观察的、离散的、确定的。本章剩下的篇幅主要介绍SEARCH函数。

1.1定义明确的问题及解

       一个问题可以形式化地定义为四个组成部分。

  1. 初始状态。
  2. 智能体可采纳的行动的描述,常用的如后继函数
  3. 目标测试,用来测试给定的状态是不是目标状态。
  4. 路径耗散

1.2把问题形式化

       状态抽象化、行动抽象化、去除无关状态与行动。通俗的话说,把握重点,蝴蝶效应显然不能考虑在内。

2.对解的搜索

       我们把所有可能的解通过节点来连成树,求解实际上就成为在树中搜索一个枝。节点的表示有很多中,我们可以假设其含有如下几个数据结构:

  1. STATE 状态空间中与节点相对应的状态。
  2. PARENT-NODE 父节点。
  3. ACTION 由父节点产生该节点所用的行动。
  4. PATH-COST 路径耗散
  5. DEPTH 初始状态到达该节点路径上最少的步骤
      树搜索的非形式化描述为

function TREE-SEARCH(problem,strategy) returns a solution, or failure
     initialize the search tree using the initial state of problem
 
     loop do
         if there are no candidates for expansion then return failure
         choose a leaf node for expansion according to strategy
         if the node contains a goal state the return the corresponding solution
         else expand the node and add the resulting nodes to the search tree 

     我们还需要表示生成出来,但没有被扩展的节点,这些点的集合成为边缘,边缘的每个元素都是叶节点,即搜索树中没有后继的节点。如果使用一个集合来表示边缘,概念上很直接,但是计算代价是昂贵的,因此我们使用队列来实现,下面是对队列的一些操作。

  1. MAKE-QUEUE(element, ...) 用给定的元素创建一个队列。
  2. EMPTY?(queue) 当且仅当队列为空时返回一真.
  3. FIRST(queue) 返回队列中第一个元素。
  4. REMOVE-FIRST(queue) 返回FIRST(queue)并将其从queue中删除。
  5. INSERT(element,queue) 在队列中插入一个元素并返回结果队列,在不同队列中插入新元素顺序是不同的。
  6. INSERT-ALL(elements,queue) 在队列中插入元素集合
         通过一闪定义,可以写一个更形式化的搜索算法

function TREE-SEARCH(problem, fringe) returns a solution, or failure
  fringe <--- INSERT(MAKE-NODE(INITIAL-STATE[problem]),fringe)
  loop do
     if EMPTY?(fringe) then return failure
     node <--- REMOVE-FIRST(fringe)
     if GOAL-TEST[problem] applied to STATE[node] succeeds
         then return SOLUTION(node)
     fringe <--- INSERT-ALL(EXPAND(node,problem),fringe)
 

<hr>
function EXPAND(node,problem) returns a set of nodes
  successors <--- the empty set
  for each(action, result) in SUCCESSOR-FN[problem](STATE[node]) do
      s <--- a new node
      STATE[s] <--- result
      PARENT-NODE[s] <--- node
      ACTION[s] <--- action
      PATH-COST[s] <--- PATH-COST[node] + STEP-COST(node,action,s)
      DEPTH[s] <--- DEPTH[node] + 1
      add s to successors
  return successors

度量问题求解的性能

  1. 完备性 能否在有解的时候总能够到一个解
  2. 最有性 能够总是找到最优解
  3. 时间复杂度 找到解需要多长时间
  4. 空间复杂度 找到解需要多少内存

3.无信息的搜索策略

        本节包括无信息搜索中的五种搜索策略。无信息搜索即除了问题定义之外,没有状态的其他附加信息。

1.广度优先搜索

         广度优先搜索即首先扩展根节点,接着扩展根节点的所有后继,然后再扩展它们的后继,以此类推。

特点是在下一层任何节点被扩展之前,当前层所有节点都已经被扩展。它可以通过一个先进先出(FIFO)队列实现。

缺点:空间复杂度高、时间复杂度高

2.代价一致搜索

      当所有单步耗散相等的时候,广度优先算法是最优的,因为它总是扩展深度最浅的未扩展节点。将其延伸,代价一致搜索是首先扩展路径耗散最低的节点。如果单步耗散一致的话,两种搜索是一致的。

3.深度优先搜索

         深度优先搜索总是扩展搜索树的当前边缘的最深的节点。搜索直接推进到搜索树的最深层,那里的节点没有后继节点。那些节点扩展完之后,它们被从边缘中去掉,然后搜索算法“向上回到”下一个还有未扩展后继节点的 稍浅的节点。

   这个搜索策略可以通过后进先出队列(LIFO)(栈)来实现。

   深度优先搜索的一个变形称之为回溯搜索。回溯搜素中每个被部分扩展的节点要记住下一个要生成的节点是哪一个。这两种算法空间复杂度小。

4.深度有限搜索

     即深度优先搜索中设定一个最大深度。深度有限搜索可能会引入不完备,但具体情况通过给出适合的深度限制,能够筛除不必要的搜索。

5.迭代深入深度优先搜索

      迭代深入搜索是一个用来寻找最合适的深度限制的通用策略。它经常和深度优先搜索结合使用。他的做法是不断的增大深度限制,以此类推,直至找到目标节点。

6.双向搜索

      运行两个同时的搜索, 一个从初始状态向前搜索,一个从目标状态向后搜索。当它们在中间相遇时终止搜索。

4.去除重复

     算法中记录它访问过的每一个状态,相当于它直接探索状态空间图。为了做到这一点,我们可以在普通搜索算法中加入一个数据结构,成为closed表, 用它储存每一个扩展过的节点,储存未扩展过的边缘的表有时称之为open表。如果当前节点与closed表中的某一个节点相匹配,那么它将被放弃而不是被扩展。这个新的算法称之为图搜索——GRAPH-SEARCH。图搜索很有效,在最坏的情况下,它的时间和空间需求和状态空间成正比。

      图搜索算法的优异性能给它带了一个棘手的问题。当一个重复状态被删除时,实际上算法找到了到达同一状态的不同路径。GRAPH-SEARCH会放弃后面找到的路径,如果之后找到的路径其耗散小一些,那么GRAPH-SEARCH就错过了最佳解。幸运的是,在单步耗散为常数的代价一致搜索和广度优先搜索的情况下这不会发生。另一方面,迭代深入算法使用深度优先扩展,很容易在找到最优解之前就找到一个非最优解, 因此迭代深入算法需要检测新发现的路径是否比以前的好,如果是则使用当前的代替以前的。

       以下是GRAPH-SEARCH算法的一般版本。

function GRAPH-SEARCH(problem,fringe) returns a solution, or failure
 
   closed <--- an empty set
   fringe <--- INSERT(MAKE-NODE(INITIAL-STATE[problem]),fringe)
   loop do
       if  EMPTY?(fringe) then return failure
       node <--- REMOVE-FIRST(fringe)
       if GOAL-TEST[problem](STATE[node]) then return SOLUTION(node)
       if STATE[node] is not in closed then
          add STATE[node] to closed
          fringe <--- INSERT-ALL(EXPAND(node,problem),fringe)

5.使用不完全信息的搜索

       不同的不完全会导致三种不同的情况。

  1. 无传感问题(也称构造问题)。
  2. 偶发性问题。如果环境是部分可观察的或者行动不确定的,那么智能体在感知每个行动之后将会提供新的信息。每个可能的感知信息定义了一个必须提前准备处理计划的偶发事件。如果不确定性是由另外一个智能体引起的,就称其为对抗性的
  3. 探索问题。当感知和行动都未知的时候,称之为探索问题。探索问题可以看做是偶发性问题的一种极端情况。
     当环境是部分可观察的,智能体可以在信念状态空间,也就是也就是只能所处的可能状态集中应用搜索算法。在某些情况下,可以构造出唯一的序列解。:而其他情况下,智能体需要一个偶发性计划来处理可能出现的未知情况。

以上!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 在本章中,我们将看到关于状态空间的信息是如何能够防止算法在黑暗中跌跌撞撞的。 1.有信息的搜索策略 我们要考虑的...
    张文峰阅读 1,704评论 0 2
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,128评论 25 707
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,102评论 0 12
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,656评论 18 139
  • 时间来了,我看见了你的方向 你来时的灯塔还依然在亮 我作为一个路人被你的容颜打动 我贪念上你的美貌,可是我也知我不...
    导演张升志阅读 158评论 0 0