AI编程范式 第4章 GPS:The General Problem Solver(五)

4.15 重复第五阶段:版本2的分析

关于GPS在多个问题领域内的扩展性我们已经展示过了。重点就在于我们不需要改变程序本身来适应新的问题;我们仅仅改变传递给GPS的操作符列表就可以了。在不同问题上的经验确实也显示要做出一些更改,我们也展示了如何去适应一些改变。虽然版本2比版本1 有了大的改进,仍然还是有很多问题。现在我们就发现了一些最棘手的问题。

4.16 不跳就不看的问题

我们解决跳之前看一看问题的方式是引入一些变量来保存一个未来可能的程序状态的表示,而不是仅仅使用单一变量来存储当前的状态。这防止了GPS做出一些不好的行为,但是我们也会看到即使是所有的预防手段在最后一节都引入之后,还是不能保证可用的解决方法可以计算得出。
为了找到这个问题,在school-ops列表之前加上另一个操作符,并且把调试输出打开。
(use (push (op ‘taxi-son-to-school
:preconds ‘(son-at-home have-money)
:add-list ‘(son-at-school)
:del-list ‘(son-at-home have-money))
*school-ops*))
(debug :gps)

现在设想一下不适用任何钱就把孩子送到学校的问题:
> (gps '(son-at-home have-money car-works)
'(son-at-school have-money))
Goal: SON-AT-SCHOOL
Consider: TAXI-SON-TO-SCHOOL
Goal: SON-AT-HOME
Goal: HAVE-MONEY
Action: TAXI-SON-TO-SCHOOL
Goal: HAVE-MONEY
Goal: HAVE-MONEY
Goal: SON-AT-SCHOOL
Consider: TAXI-SON-TO-SCHOOL
Goal: SON-AT-HOME
Goal: HAVE-MONEY
Action: TAXI-SON-TO-SCHOOL
NIL

头五行输出显示成功解决了儿子在学校这个目标,但是后面遇到还有钱的目标是显示失败了。下一步就是尝试换一下顺序。这一次,首先尝试有钱这个目标,成功了,之后孩子在学校这个目标被行为打出租去学校行为完成。但是在achieve-all检查一致性的时候失败了,而且没有挽回的手段。目标失败,即使是说有一个合法的方法存在:开车去学校。
问题在于achieve使用some来寻找appropriate-ops。因此,如果有合适的操作符,achieve就完成了。如果仅仅是有一个目标的话,这的确是一个好方法。然而,如果是有多个目标,就像上面的情况,achieve会只找到一个满足第一个目标的方法,如果这个方法失败,为一个挽救方法就是尝试修补这个方法。在如积木世界和迷宫世界的问题中,修补常常是可行的,因为所有的步骤都是可逆的。但是在出租车这个例子中的话,钱一旦花出去了,就没有修补方案可以挽回了,整个计划就会失败。
解决这个问题主要有两种方式,第一种是事先检测所有可能的解决方案,而不仅仅是满足子目标的第一个方案。Prolog语言,会在第11章讨论的内容中,就是这么干的。第二种方式是让achieve和achieve-all追踪一个被保护的目标的列表。在出租车这个例子中,我们先完成了还有钱这个目标之后尝试完成把孩子送学校这个目标,但是会先把还有钱这个目标保护起来,有所保留。如果一个操作符仅仅是因为被保护目标的删除而合适的话,就会要求程序进行一些修补,检索更多的方案。

4.17 描述力缺乏的问题

在迷宫问题中,如果是有一个操作符可以将我们从这里移到那里,如果说这里到那里有一个连接存在的话,那么就会显得简单高效很多了。对于一些特定问题的输入也哭了一列出一些合法的连接,我们可以使用单一的操作符来解决迷宫问题。相似的,我们可以定义一个操作符在猴子把椅子从门口推向屋里的动作,一般化成吧邻近的任意位置的可以推的东西推向任意位置,只要中间没有障碍物就好了。这个结论可以到处操作符中会有变量,所以我们可以这么说:
(op ‘(push X from A to B)
:preconds ‘((monkey at A) (X at A) (pushable X) (path A B))
:add-list ‘((monkey at B) (X at B))
:del-list ‘((monkey at A) (X at A)))

经常性的,我们庙会一些特征是根据比一系列的条件更加抽象的事物来描述的。例如,在下棋问题中,目标是将对手的军,是一种难以用简单断言来描述的情况,比如(black king A 4),所以我们在结果状态中需要一种常量来能够做出描述,而不是仅仅列出它的组件。我们可能希望能够获取条件的分离或者否决,在当前状态下只允许一种组合的时候。
在很多问题中,能够描述处理时间的问题也是很重要的:我们想要在时间T0之前大城目标X,之后在时间T2之前但是一定要在T1之后,达成目标Y。时间表在工厂中的应用就是个例子,时间扮演了很重要的角色。
花费,经常是和行为有相关性的,所以我们就寻找最小花费的解决方法,或者是接近最小花费。花费的意思也许就是解决方法所要求的操作符执行的数量,在积木世界问题中我们看到一个呗应用的操作符可以被马上忽略,转而被一个需要满足一些先决条件的操作符取代。或者我们可能只蛮夷一部分的解决方案,如果整体的解决方案不可行或者太火昂贵的话,我们也许会想要花费计算空间来换取时间。

4.18 完美信息问题

我们之前遇到过的所有操作符都有明晰的结果;从当前状态中增加或者删除指定的东西,GPS总是准确的知道他要做什么。在真实世界中,事情不是这么明了和干脆的。我们回到变有钱这个问题上来,一个比较中肯的操作符是去买彩票。这操作符的效果是花费一些钞票来换取中彩票的几率。但是这仅仅是几率,小的可怜。相似的,我们不能忽视具体事情执行的时候,会发生意想不到的困难。在送孩子去学校问题中,我们说的是车子的问题在于电池,GPS的显式检查来看看车子是不是可以工作。或者需要电池,每一次程序都会考虑开车这个操作符。在现实世界中,很少会这么小心,我们坐进车子里,仅仅是在不能开的时候才会想到是电池的问题。

4.19 相互作用的目标问题

人们往往倾向于同时有多个目标,而不是一次搞定一个再去想下一个。不仅仅是开车送孩子去学校,还要同时注意不被别的车子撞上,准时上班,搞定工作任务,见见朋友,找点乐子,保持呼吸,等等等等。也是要不得不自己去发现目标,而不是由其他人来告诉你一些预先定义好的目标。有一些目标我们可以放在心里好几年之久,之后等时机成熟了在执行完成。没有一种合适所有目标的标记方法。但是却有一中完成一些目标的可持续过程,完成一部分,放弃或者推迟另外一部分。
除了达成既有的目标之外,人们还会注意防止需要避免的情况出现。例如,假设我有一个朋友住医院了,我想去看望看望他,这就需要我人到医院这么一个行为。一个可用的操作符就是走去医院,还有另一个操作符是故意把自己弄伤等救护车来送我去,或许会更快。第二个操作符仅仅是达成了目标,但是去产生了人们不想要的副作用。这可能会记录在方案花费的标记中,人们会避免对一些背景的目标有所损害,比如个人的健康。
Herb Simon提出了术语满意度来描述达成一个合理水平的合理目标的策略,也包含了同时推迟或者放弃的其他目标的影响。GPS仅仅知道成功和失败,因此仅仅是片面成功的最大化罢了。

4.20 GPS的最后

最后四个小节的内容给出了对于GPS局限的领域的一些暗示。事实上,GPS并不是一个完全通用的问题解决程序。在算法没有绑定特定领域问题的层面上,他的确是个通用的程序;我们也可以通过更改操作符来更改问题领域。但是GPS在无法解决很多有趣的问题的时候就是去了通用性。限制在一些小的技巧和游戏之中。
GPS最终失败的原因很是微妙,其中一个就是说他出现在不被世人欣赏的1957年,去爱现在成了计算机科学的核心。现在一些被认为是计算机无法解决的问题,并不是说理论上正确的程序写不出来,而是因为程序执行的时间实在是太长。很多问题都被归类为这类叫做NP困难问题。计算这些问题的时间随着问题的规模的增长,时间呈指数级增长。这是因为问题本身的特性导致的,跟程序员本身的质素没有关系。指数级增长的意思是五个输入会花费几秒钟求解的问题,100个输入就需要几亿年的时间来处理了。即使买更快的电脑也无济于事。最终来说,如果你有一个需要几亿年才能解决的问题,买了100台比现在的电脑快1000倍的电脑来处理,也还是要等上几百万年的。对于理论计算机科学家来说,发现问题是NP困难问题就是答案本身了,但是对于AI来说,就以为这被问了错误的问题。很多NP困难问题在我们不坚持最佳解决方案,退而求其次的时候就会简单很多了。
GPS的输入基本上就是一个程序,GPS的执行也就是程序的执行。如果GPS的输入语言组足够通用可以用来表达任何程序。那他不能解决的问题要么没有答案要么时间太长。现代的问题解决程序会辨认这些基础的制限,或者限制问题的规模,或者找一个接近的解决方法或者部分的解决。一些问题解决程序也会监视执行时间,当问题太过困难就会放弃执行。
下面引用的话是出自Drew McDermott的文章《人工智能遇上天然的愚蠢》,概括了当时对于GPS的感觉。记住它,下次你不得不评价一个程序的时候会有用的。
GPS?现在,GPS就是一个没有意义的术语,仅仅是给出了一个解谜语的愚蠢程序。但是他既然叫做一般问题解决器,但是仅仅是吊起了人们没有意义的兴奋和好奇。他应该叫做LFGNS,本地特定导引万罗搜索器。
尽管如此,GPS还是一个用来浏览编程技巧的有用程序,特别是在AI编程这方面。更重要的是,他会是一个来看纯粹的思考的工具。当然我们承认亚里士多德要比你我聪明的多,用隐喻来说明计算模型的概念,使人们更加欣赏目的手段分析法了,至少是在计算模型这个方面。我们也必须坚持并不是所有的思考都是按照这个模型走的。
AI的吸引力在于一种目的和手段的分离。一个成功的AI项目的结果可以使一个程序,吧之前能做的事情做的更好更快。在这意义上来说,GPS是一个失败之作,没有很好地解决特定的问题。但是他对于问题解决过程的调查和格式化,从某种程度上来说是陈宫的,让读者对整个过程有个更好的理解。

你可能感兴趣的:(AI编程范式 第4章 GPS:The General Problem Solver(五))