Páginas

miércoles, 26 de septiembre de 2012

Java: ¿Cómo evaluar expresiones matemáticas en el computador?

Evaluador de Expresiones Matemáticas


He encontrado este interesante artículo donde su autor Alexander Borbón A. 
explica como hacer un evaluador de expresiones matemáticas.

Además ha dejado disponible el código fuente tanto en java como en visual basic.
 
"En este artículo se muestra una forma de programar un evaluador de expresiones matemáticas en JAVA. El programa se construye paso a paso y se explican detalladamente las partes más importantes del mismo. El evaluador consta de dos partes o módulos, el primero se encarga de convertir la expresión digitada a notación postfija que es más sencilla para el computador; el segundo es el que evalúa la expresión que se obtuvo en un valor específico. Para poder comprender y reescribir este programa se necesita tener conocimientos básicos en la programación en JAVA, sin embargo, se explicará el uso de varias primitivas utilizadas y de algunos conceptos básicos de programación."
Para que veáis la calidad de la explicación y el código, se pueden evaluar este tipo de expresiones:

jueves, 20 de septiembre de 2012

Resolver puzzles deslizantes de 8 y 15 piezas con Gambas3








He desarrollado un pequeño programa donde se pueden definir la posición de las piezas y resolver tableros de 8 piezas (3x3) y tableros de 15 piezas (4x4) y  se puede resolver automáticamente (si tiene solución ) usando el algoritmo A estrella (A *).

Se basan en este algoritmo, aunque los tableros de 15 piezas (y en general los de orden superior a 4x4), se resuelven con un paso "intermedio"... os explico...



Tenemos que llegar a la posición de la figura 1, para resolver el puzzle.


El primer paso es conseguir que la columna 1 y fila 1 queden ordenadas:

Figura 2



Una vez conseguido esto, resolvermos el puzzle 8 (3x3) que nos queda.


En mi programa uso el algoritmo A* para resolver el puzzle. Haciendo los siguientes pasos.
  1. El usuario define el tablero, y pulsa el botón de "Resolver"
  2. Con el tablero ya  definido, se  lleva a la posicion de las fichas que indica en la figura 2. Para ello definimos el tableroFin como el de la figura 2 (teniendo en cuenta solo la fila 1 y columna 1, el resto me da igual lo que valgan)
  3. Luego resuelvo el puzzle de 3x3, que ha quedado, llevandolo al estado final de la figura 3
Figura 3
 Al terminar estos dos procesos, conseguimos ordenar el puzzle 15 (4x4).

En mi caso los cuadros se numeran del 1 al 16, siendo el 16 el cuadro "vacio".


He "aprovechado" , las mismas funciones de calculo algoritmo Start, F, H, para los dos tipos de tablero, añadiendo un parametro opcional que indicaba como era el tablero (de 8 o 15) y asi conocer cual es el estado fin al que hay que llegar.ç

 De ese modo el programa puede resolver los dos tipos de de puzzles.






Aqui os dejo los archivos del código fuente y el ejecutable en gambas3.2:

Código Fuente: codigo 0.0.12 (actualizado)
Ejecutable Gambas 3.2: .gambas


Notas:
Mejoras Rendimiento:
Si se ejecuta como root y con el comando nice se le dice que le de la maxima prioridad se mejora el rendimiento de la aplicacion:
$nice -n -19 ./Puzzle15slide.gambas

21/9/12: Actualizado. Corregido bug a la hora de introducir datos en el tablero, y añadido un reloj para indicar el tiempo que se ha tardado en encontrar la solución.

Fuente:
  Resolucion de puzzle deslizantes de Lara Rojo Celemín e Iván Suárez Morejudo 


Nota:
Si no ve completo este articulo es que tienes adblock activado. Por favor desactive adblock para este blog. Gracias

sábado, 15 de septiembre de 2012

Algoritmo MiniMax-Poda Alfa Beta: Creando la IA de los juegos



¿como piensa un ordenador que juega al ajedrez?
Esta es una de las cuestiones que siempre me plantee cuando tuve mi primer ordenador y empece a programar en Basic....

Pues bien, gracias a internet, he encontrado mucha información... el algoritmo que se usa es el minimax  (o variantes sobre este)...

En la wikipedia, en ingles,  encontre el algoritmo, ademas de varios enlaces interesantes... entre ellos uno que desarrolla gráficamente cualquier "arbol" que le demos...




Me hecho un pequeño esquema, con los pasos y los cambio de valores: Enlace

PseudoCódigo:

function alphabeta(node, depth, α, β, Player)         
    if  depth = 0 or node is a terminal node
        return the heuristic value of node
    if  Player = MaxPlayer
        for each child of node
            α := max(α, alphabeta(child, depth-1, α, β, not(Player) ))     
            if β ≤ α
                break                             (* Beta cut-off *)
        return α
    else
        for each child of node
            β := min(β, alphabeta(child, depth-1, α, β, not(Player) ))     
            if β ≤ α
                break                             (* Alpha cut-off *)
        return β


(* Llamada INicial: *)
alphabeta(ORIGEN NODO, depth, -infinity, +infinity, MaxPlayer


Aqui teneis un código de ejemplo realizado en java:
intart/source/browse/trunk/juegos/base/_AgenteHeuristico.java?r=35





Enlaces:
http://en.wikipedia.org/wiki/Alpha-beta_pruning
http://homepage.ufp.pt/~jtorres/ensino/ia/alfabeta.html
http://joshi.ueuo.com/proyectoU1.php
Programacion de Ajedrez mediante minimax poda alfa beta.Pdf

lunes, 10 de septiembre de 2012

A* Pathfinder Algoritmo A estrella: Usandolo en Gambas3 El León y la Gacela

 Pathfinder Algoritmo A Star A estrella A*


 
El algoritmo A estrella (A*), se usa para hallar el camino más corto (de menor coste) entre dos puntos de un mapa dado, teniendo encuentra los obstáculos. (ver wiki  ). Se usa mucho por ejemplo en los juegos gráficos.



Explicación gráfica del Algoritmo:


Documento donde se describre la resolución del diagrama: Descarga Hoja de Calculo




He encontrado un blog ( ver fuente) , donde su autor lo codifica en javascript.

Lo he podido traducir a Gambas3, haciendo un pequeño ejemplo, donde se crea el mapa de forma aleatoria y la posición inicial (un león) y la posición final (una gacela), imprimiéndose el camino que une a los dos, e informando de cuando pasos se dán.

Enlace de descarga código fuente: Descarga vesion inicial



Versión: 2.2
He mejorado algunas cosas:
-> Ahora incluyo en el mapa celdas que dejan pasar pero con dificultades (hierva y agua). El arbol no deja pasar al leon, como en la primera versión.

-> Puedes ver distintas funciones heuristicas (Por defecto, Manhathan, Euclidea o sin uso de función), y se puede ver el  coste de cada opción (valoración del camino) y un parámetro que mide el número de operaciones que se realizan (exactamente no es eso), pero sirve para darse cuenta cuanto "trabaja" el ordenador para encontrar la solución.

-> La ruta es marcada con flechas, indicando la dirección que toma el león hasta llegar la Gacela.


Enlace de descarga código fuente: fuente 2.2

Enlace Version 3.2: fuente 3.2
Corregido el algoritmo, ya que no daba el camino más óptimo.


Espero que os sea útil, sobre todo para el desarrollo de juegos !!!




Paginas web fuente o de referencia:
 http://46dogs.blogspot.com.es/2009/10/star-pathroute-finding-javascript-code.html

http://devpro.it/code/137.html

iconos:  http://animales.m-y-d-s.com/animal/


Como añadir un indice a tu blog ordenado por fecha de publicacion

¿Cómo añadir a tu blog, un indice por fecha de publicación de los post?

La solución la encontré en este blog: http://www.miltrucosblogger.info/2011/06/indice-por-fecha-en-blogger.html

Simplemente se añade a una nueva entrada este código:

<script src="https://sites.google.com/site/miltrucosblogger/script/Indicefecha.js">
</script>
<script src="http://NOMBRE DE TU BLOG.blogspot.com/feeds/posts/default?max-results=500&amp;alt=json-in-script&amp;callback=loadtoc">
</script>

Cambiando  NOMBRE DE TU BLOG por el nombre de tu blog, evidentemente :)


Para añadir algo más de información, es interesante descargar el archivo IndiceFecha.js, a otro servidor (para no sobrecargar el servidor donde esta alojado, por si se esta usando muchas veces o simultáneamente por otros usuarios).

Por ejemplo, lo podemos alojar en un sitio de google site propio, y desde alli enlazarlo al script  (sustiyendo la ruta en roja por la nuestra). Y así siempre estará a nuestra disposición porque solo lo estamos usando nosotros. Os comento esto porque me ha pasado que a veces no esta disponible el archivo (porque esta usado por otros, o sobrecargado el servidor) y no se generaban los indices. Con este pequeño truco esta resuelto.


Saludos



Indice Por Fechas

domingo, 9 de septiembre de 2012

Truco para Blogspot: Poner fija una misma pagina de inicio.

Crear una entrada 

"Fija de Presentación" 

de nuestro blog


Normalmente en los blogs, cada vez que añadimos una entrada, esta va a ser la que se muestre cuando entre el visitante al blog.

Pero alguna veces, no nos interesa ese comportamiento. Necesitamos que una entrada quede "Fija" de "Presentación" y siempre sea la misma cada vez que entre el visitante...


Por ejemplo en los cursos que estoy  subiendo, me interesa que no salga las entradas que voy añadiendo, sino dejar fija una "Presentación" para que el usuario vaya al indice del blog, y allí vea la entradas ya ordenadas del curso.

Hay un truco muy simple, sin tener que tocar nada de código de la plantilla de blogger: se trata de modificar la fecha del post que queremos que sea el que siempre muestre a una fecha futura, para que siempre sea este el post de presentación, aunque sigamos añadiendo entradas...

Pasos:
1) Crea en tu blog una entrada, puedes poner un texto explicando que contenido tiene tu blog, y un enlace a tu Indice, y la publicas.
2) Luego editas la entrada
3) Mira el menu de la derecha:
3) Modifica el año, poniendo por ejemplo 2019, en vez de 2012.


4) Guarda los cambios...



5) Y esta será la página que siempre se muestre cuando se acceda a tu blog.





Saludos.




Fuente: http://www.youtube.com/watch?v=pR0Oy3ubYFo