Как мне запустить Lisp-код Саттона и Бартона “Обучение с подкреплением”?

StackOverflow https://stackoverflow.com/questions/533960

Вопрос

Я много читал о Обучение с подкреплением в последнее время, и я нашел "Обучение с подкреплением:Введение" быть отличным гидом.Услужливо предоставленный автором исходный код за множество их проработанных примеров.

Прежде чем я начну задавать вопрос, я должен отметить, что мои практические знания lisp минимальны.Я знаю основные концепции и как это работает, но я никогда по-настоящему осмысленно не использовал lisp, так что, скорее всего, я просто делаю что-то невероятно n00b-иш.:)

Кроме того, автор заявляет на своей странице, что он не будет отвечать на вопросы о своем коде, поэтому я не связывался с ним и решил, что Stack Overflow будет гораздо лучшим выбором.

Я пытался запустить код на компьютере с Linux, используя как GNU CLISP, так и SBCL, но не смог его запустить.Я продолжаю получать целый список ошибок, используя любой интерпретатор.В частности, большая часть кода, по-видимому, использует множество утилит, содержащихся в файле utilities.lisp, который содержит строки

(defpackage :rss-utilities
  (:use :common-lisp :ccl)
  (:nicknames :ut))

(in-package :ut)

:ccl, похоже, ссылается на какую-то версию lisp для Mac, но я не смог это подтвердить, это мог быть просто какой-то другой пакет кода.

> * (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

У кого-нибудь есть какие-нибудь идеи, как я могу запустить этот код?Неужели я просто совершенно ничего не смыслю в шепелявости?

ОБНОВЛЕНИЕ [март 2009]: Я установил 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.Вы должны портировать его на portable Common Lisp (создать-случайное-состояние, и т.д.).Кроме того, имена файлов являются специальными для Mac.

Clozure CL является ответвлением от Macintosh Common Lisp, но был изменен на соглашения Unix (пути, ...) и не включает специальный графический код MCL.

Другие советы

Я предполагаю, что код зависит от CCL, поэтому используйте CCL вместо CLISP или SBCL.Вы можете скачать его отсюда: http://trac.clozure.com/openmcl

Используя последнюю версию CCL в linux x86, с этим файлом, сохраненным как 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)

Чтобы вычислить требуемый #'defun случайного состояния, я предположил, что “#.(СЛУЧАЙНОЕ СОСТОЯНИЕ 64497 9)” был сериализованным объектом случайного состояния из MCL.Чтобы увидеть, как CCL справляется с этим, я проверил, какие выходные данные MAKE-RANDOM-STATE в CCL:

$ ~/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-числа.lisp?rev=13327

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top