如何运行Sutton和Barton的“强化学习”Lisp代码?

7

最近我一直在阅读强化学习方面的内容,我发现"强化学习:导论"是一本非常好的指南。作者还提供了源代码作为他们许多实例的帮助。

在开始问题之前,我应该指出我的Lisp实践知识很少。我知道基本概念和它的工作原理,但我从来没有真正有意义地使用过Lisp,所以我可能只是做了一些极其新手的事情。 :)

另外,作者在他的页面上声明他不会回答关于他的代码的问题,所以我没有联系他,而是想到Stack Overflow会是一个更好的选择。

我一直在尝试在Linux机器上运行代码,使用GNU的CLISP和SBCL都无法运行。我使用任何一个解释器都会出现一大堆错误。特别是,大部分代码似乎使用了一个名为“utilities.lisp”的文件中包含的许多实用程序,其中包含以下行:
(defpackage :rss-utilities
  (:use :common-lisp :ccl)
  (:nicknames :ut))

(in-package :ut)
似乎指的是基于Mac的Lisp版本,但我无法确认,它可能只是其他代码包。
> * (load "utilities.lisp")
>
> debugger invoked on a
> SB-KERNEL:SIMPLE-PACKAGE-ERROR in
> thread #<THREAD "initial thread"
> RUNNING {100266AC51}>:   The name
> "CCL" does not designate any package.
> 
> Type HELP for debugger help, or
> (SB-EXT:QUIT) to exit from SBCL.
> 
> restarts (invokable by number or by
> possibly-abbreviated name):   0:
> [ABORT] Exit debugger, returning to
> top level.
> 
> (SB-INT:%FIND-PACKAGE-OR-LOSE "CCL")

我尝试移除这个特定的部分(将该行更改为
  (:use :common-lisp)

但这只是创建了更多的错误。
> ; in: LAMBDA NIL ;     (+
> RSS-UTILITIES::*MENUBAR-BOTTOM* ;     
> (/ (- RSS-UTILITIES::MAX-V
> RSS-UTILITIES::V-SIZE) 2)) ;  ; caught
> WARNING: ;   undefined variable:
> *MENUBAR-BOTTOM*
> 
> ;     (-
> RSS-UTILITIES::*SCREEN-HEIGHT*
> RSS-UTILITIES::*MENUBAR-BOTTOM*) ;  ;
> caught WARNING: ;   undefined
> variable: *SCREEN-HEIGHT*
> 
> ;     (IF RSS-UTILITIES::CONTAINER ;  
> (RSS-UTILITIES::POINT-H ;         
> (RSS-UTILITIES::VIEW-SIZE
> RSS-UTILITIES::CONTAINER)) ;        
> RSS-UTILITIES::*SCREEN-WIDTH*) ;  ;
> caught WARNING: ;   undefined
> variable: *SCREEN-WIDTH*
> 
> ;     (RSS-UTILITIES::POINT-H
> (RSS-UTILITIES::VIEW-SIZE
> RSS-UTILITIES::VIEW)) ;  ; caught
> STYLE-WARNING: ;   undefined function:
> POINT-H
> 
> ;     (RSS-UTILITIES::POINT-V
> (RSS-UTILITIES::VIEW-SIZE
> RSS-UTILITIES::VIEW)) ;  ; caught
> STYLE-WARNING: ;   undefined function:
> POINT-V

请问有人知道我如何运行这段代码吗?是不是我对Lisp一无所知?

更新 [2009年3月]: 我安装了Clozure,但仍无法运行该代码。

在CCL命令提示符下,输入以下命令:

(load "utilities.lisp")

结果会产生以下错误输出:

;Compiler warnings :
;   In CENTER-VIEW: Undeclared free variable *SCREEN-HEIGHT*
;   In CENTER-VIEW: Undeclared free variable *SCREEN-WIDTH*
;   In CENTER-VIEW: Undeclared free variable *MENUBAR-BOTTOM* (2 references)
> Error: Undefined function RANDOM-STATE called with arguments (64497 9) .
> While executing: CCL::READ-DISPATCH, in process listener(1).
> Type :GO to continue, :POP to abort, :R for a list of available restarts.
> If continued: Retry applying RANDOM-STATE to (64497 9).
> Type :? for other options.
1 >

不幸的是,我仍在学习Lisp,因此虽然我有一种感觉表明某些内容没有完全定义,但我确实不理解如何阅读这些错误消息。

5个回答

4

3
那段代码是为Macintosh Common Lisp (MCL)编写的,只能在该平台上运行。使用Clozure CL (CCL)无法解决问题。您需要注释掉图形代码。随机状态也略有不同,需要将其移植到可移植的Common Lisp中 (make-random-state等)。此外,文件名在Mac上也是特殊的。
Clozure CL是从Macintosh Common Lisp分支出来的,但已更改为Unix约定(路径名等),并且不包括MCL的特殊图形代码。

2
如果您从未以有意义的方式使用过Lisp,那么“强化学习:导论”中有一个Matlab代码

2

使用linux x86上最新版本的CCL,将此文件保存为foo.lisp:

#+ccl (defun random-state (x y)
        (ccl::initialize-random-state x y))

(load "utilities.lisp")
(use-package 'rss-utilities)


(load "testbed.lisp")

(setup)
(init)

(print (runs 10 10 .1))

运行中

~/svn/ccl/lx86cl -l foo.lisp

打印一堆警告信息和所需的答案:

(-0.77201915 0.59691894 0.78171235 0.41514033 0.6744591 0.26383805 0.8981678 1.1274683 0.50265205 0.4081622)

为了确定所需的 #'random-state defun,我猜测“#.(RANDOM-STATE 64497 9)”是MCL中序列化的随机状态对象。为了查看CCL处理方式,我检查了CCL中MAKE-RANDOM-STATE的输出结果。
$ ~/svn/ccl/lx86cl 
Welcome to Clozure Common Lisp Version 1.3-r11936  (LinuxX8632)!
? (make-random-state)
#.(CCL::INITIALIZE-RANDOM-STATE 64497 9)

0
除了Rainer Joswig的回答之外:一旦您安装Clozure,您将需要更新utilities.lisp中对函数RANDOM-STATE的引用为random-mrg31k3p-state
更具体地说,将#.(RANDOM-STATE 64497 9)替换为#.(ccl::random-mrg31k3p-state) 在代码编写后的某个时候,random-mrg31k3p-state似乎已经取代了random-state,请参见l1-numbers.lisp?rev=13327

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接