Translate

jueves, 6 de mayo de 2021

Tablas Hash en Lisp

 Las tablas hash guardan datos de la forma (clave valor). Se usan para guardar grandes cantidades de registros, donde la lectura de un registro se hace de forma muy rapida, sin importar el tamaño de la tabla. 

Para crear una tabla hash usamos:

(setf *mi-tabla* (make-hash-table))

Tanto para generar un registro como para leer se usa la funcion gethash en la forma (gethash clave *tabla-hash*)

Para crear registros:     

(setf (gethash 'clave1 *mi-tabla*) "arbolito")

(setf (gethash 'clave2 *mi-tabla*) "manteca")

(setf (gethash 'clave3 *mi-tabla*) "crema pastelera")

Para lectura:

(setf valor (gethash 'clave2 *mi-tabla*))

"manteca"

La funcion maphash permite aplicar una funcion especifica a cada par clave/valor de una tabla hash:

(maphash #'(lambda (clave valor) 

                (format t "~&~a --> ~a" clave valor)) 

         *mi-tabla*)         

CLAVE3 --> crema pastelera

CLAVE1 --> arbolito

CLAVE2 --> manteca

La clave siempre debe ser un simbolo. Si hay alguna duda le preguntamos al Peluca



Por ultimo veremos como guardar y leer desde el almacenamiento, porque no lo vi en todo el internet.

Usaremos las siguientes funciones:


(defun guardar (archivo dato)

  (with-open-file (out archivo

         :direction :output

         :if-exists :supersede)

    (with-standard-io-syntax

     (print dato out))))


(defun cargar (archivo)

  (with-open-file (in archivo)

    (with-standard-io-syntax

     (read in))))

     

Ok, para guardar en un archivo, aclaro que en ejemplo omito la carpeta donde guardo:                               

(guardar "tabla.dat" *mi-tabla*)


Ahora a cerrar el entorno de desarrollo, y lo abrimos nuevamente para probar la carga: (en la misma carpeta donde guardamos)                                                      

(setf *mi-tabla* (cargar "tabla.dat")


En algunas plataformas para usar ciertas carpetas debes tener permisos de administrador, root o superusuario, asi que asegurate que la carpeta usada no necesita permisos de lectura/escritura.  .-)   

lunes, 26 de abril de 2021

Ajedrez: algoritmos de busqueda

 Hola amigos. Dejo el enlace pet-rock-chess de un juego de ajedrez hecho en lisp. El objeto de mostrarlo es puramente educativo, pues las funciones de evaluacion que tiene son muy basicas. En el se muestran los algoritmos minimax y el alfa-beta. 

Por ejemplo, para un juego entre dos estrategias de ordenador distintas a 1 min:

> (ajedrez #'random-estrategia (alfa-beta-searcher3 1 #'combina-eval) t 1 )

Donde la profundidad de busqueda del alfa-beta es a un solo nivel. La funcion de evaluacion es combina-eval. El jugador blanco siempre va primero, el negro segundo. Otro ejemplo, un juego de 5 min entre un humano y el ordenador con una profundidad de busqueda de 2 niveles:

> (ajedrez #'humano (alfa-beta-searcher3 2 #'combina-eval) t 5 )

Para jugar cuando le toca a humano debera escribir, por ejemplo: 

(caballo-blanco b1 c3)

Obviamente que no tiene una interfaz grafica aun. Un ejemplo mas: busqueda minimax y busqueda alfa-beta, a un min y con distintas funciones de evaluacion: 

(ajedrez (minimax-searcher 1 #'movilidad) (alfa-beta-searcher3 1 #'movilidad-contraria) t 1)

Saludos ;-)