サットンとバートンの「強化学習」Lisp コードを実行するにはどうすればよいですか?
-
22-08-2019 - |
質問
についてたくさん読んできました 強化学習 最近、そして私は見つけました 「強化学習:はじめに」 優れたガイドになるために。著者の親切なアドバイス ソースコード 彼らの多くの成功例について。
質問を始める前に、私の Lisp に関する実践的な知識は最小限であることを指摘しておく必要があります。基本的な概念とそれがどのように機能するかは知っていますが、実際に Lisp を意味のある方法で使用したことがないので、信じられないほど n00b っぽいことをしているだけかもしれません。:)
また、作者は自分のページで、自分のコードに関する質問には答えないと述べているため、私は彼に連絡せず、Stack Overflow の方がはるかに良い選択であると考えました。
GNU の CLISP と SBCL の両方を使用して Linux マシンでコードを実行しようとしましたが、実行できませんでした。どちらのインタープリターを使用しても、エラーのリスト全体が取得され続けます。特に、コードの大部分は、次の行を含むファイル 'utilities.lisp' に含まれる多くのユーティリティを使用しているようです。
(defpackage :rss-utilities
(:use :common-lisp :ccl)
(:nicknames :ut))
(in-package :ut)
:ccl は、ある種の 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 について勉強しているところなので、何かが完全に定義されていないという感覚はありますが、これらのエラー メッセージの読み方はよくわかりません。
解決
そのコードは Macintosh Common Lisp (MCL) 用です。そこでのみ実行されます。Clozure CL (CCL) を使用しても役に立ちません。グラフィックス コードをコメントする必要があります。ランダムな状態のものも MCL にとっては少し特別です。それをポータブル Common Lisp に移植する必要があります (ランダムな状態にする, 、など)。また、ファイル名も Mac 用に特殊です。
Clozure CL は Macintosh Common Lisp からのフォークですが、Unix の規則 (パス名など) に変更されており、MCL の特別なグラフィックス コードは含まれていません。
他のヒント
私の推測では、コードはCCLに依存しているため、次を使用します CCL CLISP または SBCL の代わりに。ここからダウンロードできます。 http://trac.clozure.com/openmcl
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)
Lisp を有意義な方法で使用したことがない場合は、次の方法があります。 MATLAB コード 「強化学習」の場合:はじめに」。
に加えて ライナー・ジョスウィグの答え:Clozure をインストールしたら、関数への参照を更新する必要があります RANDOM-STATE
で utilities.lisp
に random-mrg31k3p-state
.
より具体的には以下を置き換えます。 #.(RANDOM-STATE 64497 9)
と #.(ccl::random-mrg31k3p-state)
random-mrg31k3p-state
入れ替わったようです random-state
コードが書かれた後のいつかを参照してください。 l1-numbers.lisp?rev=13327