Comunidad de diseño web y desarrollo en internet online

Mejorar mi sencilla IA.

Citar            
MensajeEscrito el 27 Sep 2013 04:57 am
No está terminada y es en Flash 5 viejo (2000).

Imaginen una fila de 9 casilleros. En alguno de ellos se ubican el pacman y un fantasma, no necesariamente en el mismo. Esta IA intenta que el fantasma quede en el mismo casillero que el pacman, pero:
- Le digo muy poco sobre cómo hacerlo, lo aprende.
- Sólo puede moverse 1 casillero como máximo, cada vez.

Pseudo código:
- El criterio actual es: Sólo juzgar situaciones que logran el objetivo.
- Se plantea una situación que aún no haya resuelto.
- Prueba en dicha situación una acción que no haya juzgado aún con el criterio actual.
- Juzga la acción en base al resultado. Si es bueno, genera un archivo cuyo nombre marca cual era la situación, y el contenido del archivo es la acción que realizó y el valor 0.
- Repite el proceso desde el punto 2. Si ya probó todas las acciones en todas las situaciones, cambia el criterio de los juicios:
Una vez realizada la acción, carga info sobre la nueva situación que ha provocado. Si no se puede cargar, vuelve al punto 3. Sino, y si la info cargada contiene el valor 0, crea un archivo sobre la situación anterior, graba la acción y el valor 1.

Así sigue hasta juzgar todo. El valor va aumentando. 0 significa que en este mismo turno ya puede quedar en la mismo casillero que el pacman. 1 significa que podrá en el próximo turno. Well, entre mayor peor está.

--------------------------------------------------------------------------------------------------------

Código (incompleto):

Código :

Frame 1:
// Objeto Mem se presenta.
Mem.PacX = 1;
Mem.GhostX = 0;

Frame 2:
// Nueva situación.
Mem.Actn = -2;
Mem.GhostX = Mem.GhostX+1;
if (Mem.GhostX == 10) {
    Mem.GhostX = 1;
    Mem.PacX = Mem.PacX+1;
    if (Mem.PacX == 10) {
        Mem.Eva = 0;
        Mem.PacX = 1;
        Mem.GhostX = 0;
        gotoAndPlay (12);
    }
}

Frame 3:
// Nuevo act.
Mem.Actn = Mem.Actn+1;
if (Mem.Actn == 2) {
    gotoAndPlay (2);
} else {
    // Aplicar Act (Ghost).
    Mem.GhostXNew = Mem.GhostX + Mem.Actn;
    // Juzgar resultado, guardar si es bueno.
    if (Mem.GhostXNew == Mem.PacX) {
        BestActn = Mem.Actn;
        BestAct = 0;
        fscommand ("save", "S"+Mem.PacX+"_"+Mem.GhostX+".txt");
        gotoAndPlay (5);
    }
}

Frame 4:
gotoAndPlay (3);

Frame 5:
// Objeto Mem2 se presenta.

Frame 6:
// Preparando verificación del save.
Mem.Cargas = 0;
Mem2.BestActn = -1;
Mem2.BestAct = -1;

Frame 7:
Mem.Comp = 0;
// Cargar para confirmar.
Mem.Cargas = Mem.Cargas+1;
loadVariables ("S"+Mem.PacX+"_"+Mem.GhostX+".txt", "Mem2");

Frame 8:
// Nada.

Frame 9:
// Convertir a números (necesario para verificar load).
Mem2.BestActn = Number (Mem2.BestActn)*1;
Mem2.BestAct = Number (Mem2.BestAct)*1;
Mem.Verif = 1;
// Compara variables.
Mem.Comp = Mem.Comp+1;
if (BestActn != Mem2.BestActn) {
    Mem.Verif = 0;
} else if (BestAct != Mem2.BestAct) {
    Mem.Verif = 0;
}

Frame 10:
// Reintentar, reload, fin, o reiniciar según el caso.
if (Mem.Comp == 10) {
    if (Mem.Cargas == 3) {
        // fin
        fscommand ("save", "30 fallas en S"+Mem.PacX+"_"+Mem.GhostX+".txt");
        fscommand ("quit");
    } else {
        // reload
        gotoAndPlay (7);
    }
} else if (Mem.Verif != 1) {
    // reintentar
    gotoAndPlay (9);
}
// reiniciar

Frame 11:
// Objeto Mem2 se retira.
gotoAndPlay (2);

Frame 12:
// Nueva sit.
Mem.Actn = -2;
Mem.GhostX = Mem.GhostX+1;
if (Mem.GhostX == 10) {
    Mem.GhostX = 1;
    Mem.PacX = Mem.PacX+1;
    if (Mem.PacX == 10) {
        Mem.Eva = Mem.Eva+1;
        Mem.PacX = 1;
        Mem.GhostX = 1;
    }
}

Frame 13:
// Nuevo act.
Mem.Actn = Mem.Actn+1;
if (Mem.Actn == 2) {
    gotoAndPlay (12);
} else {
    // Aplicar Act (Ghost).
    Mem.GhostXNew = Mem.GhostX + Mem.Actn;
    // Cargar nueva Sit para ver su BestAct.
}


Hay cosas que posiblemente no entiendan, pero que no es importante que lo hagan. A lo que deben prestar atención es a:
- Cuando llega al frame 12 ya generó los archivos e info sobre las situaciones en que es posible lograr el objetivo en 1 movimiento. PERO en el frame 12 las va a volver a analizar, lo cual es una pérdida de tiempo, quiero evitar que lo haga.

Lo explicaré mejor, con un ejemplo.

Cuando llega al frame 12, ya hay un archivo que se llama S1_1.txt cuyo contenido es m´ças o menos así:
BestActn=0
BestAct=0

Significa que en el archivo *pacman está en el casillero 1*_*el fantasma está en el casillero 1*.txt ya está marcado, que en la situación que describe, conviene realizar el movimiento *BestActn* y tiene un valor de 0. O sea, es una situación en la que el pacman y fantasma están en el mismo casillero, ergo conviene moverse 0 casilleros, eso marca BestActn, y como el objetivo se logra en este mismo turno, BestAct marca 0.

Ya está.

No obstante, en el frame 12 se plantea otra vez esa situación, para probar otra vez acciones, pero eso no tiene sentido.

¿Qué puedo hacer para que no se pierda tiempo? O mejor dicho, en definitiva, cómo optimizar ese aprendizaje de la IA.

Puedo hacer que cargue la info de la situación y si BestAct es menor o igual que el criterio (Mem.Eva) entonces no prueba acciones en ella, pero ya eso de cargar es bastante tiempo...

Puedo generar una lista de las que debe analizar. ¿No haría que el programa sea más pesado? La lista se alargaría a medida que intente resolver situaciones de otro estilo, más complejas. Y si la lista estuviera en archivos externos entonces tendría que hacer 2 cargas cada vez, en vez de 1.

...

Quisiera empezar a usar tablas en vez de archivos txt, o arreglos.

No uso arreglos porque hace tiempo cuando no tenía Internet intenté guardarlos y cargarlos tal y como lo hago con variables comunes -ver el código- y no funcionaba. Así que no quise perder más tiempo y energía con ellas.

Y usar tablas no sé, leí algo sobre php o no sé qué hace tiempo, y no entendí mucho.

Creo que necesito un nuevo programa, SENCILLO -como Flash 5, he probado el 8 y hacer un save me pareció mucho más complicado-, pero que me permita hacer mejor lo que quiero hacer.

Muchas gracias.

Por Tachikomaia

73 de clabLevel



 

chrome
Citar            
MensajeEscrito el 27 Sep 2013 05:40 pm
No está terminada y es en Flash 5 viejo (2000).


Mmm ... además el código (a vuelo de pájaro) es viejo y desparramado en frames. No llegué a leer la explicación porque es un poco extensa ... pero no consideraste empezar algo de cero? (manteniendo solo la trama)

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

chrome
Citar            
MensajeEscrito el 27 Sep 2013 06:15 pm
No veo por qué el ser viejo y desparramado en frames sea un problema...

Y no entendí tu comentario. Esto no está hecho desde 0, eso es cierto, está basado en 2 otras IAs, una como esta pero que hice hace mucho, y otra que es más sencilla. A su vez esas 2 están basadas en versiones anteriores, es decir, las he ido mejorando, o rehaciendo.

Voy a pensar hacerlo desde 0, pero la cuestión es cómo lo harían uds... y sinceramente pensarlo desde 0 -otra vez- es un ejercicio mental bastante duro para mí.

Por Tachikomaia

73 de clabLevel



 

chrome
Citar            
MensajeEscrito el 27 Sep 2013 06:18 pm
Por cierto creo que este tema lo puse en general porque lo más importante no es el código AS1 o 2, sino el pseudocódigo, y cómo se podría hacer con otro programa.

Por Tachikomaia

73 de clabLevel



 

chrome
Citar            
MensajeEscrito el 27 Sep 2013 09:20 pm
No veo por qué el ser viejo y desparramado en frames sea un problema...


Porque es un mal diseño, y por mas pilas que le pongas, si el diseño es malo, arrancas para atrás. Minimamente una estructura en clases, variables encapsuladas, menos gotoAndPlay, un loop principal para la animación ... en fin, lo básico de un juego. Si es un pacman, hay varios hechos al que le puedes echar un ojo, aunque hace mucho perdi esos links

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

chrome
Citar            
MensajeEscrito el 27 Sep 2013 11:52 pm
Tal vez tengo mucho que aprender. No obstante, este asunto es independiente de las animaciones.

Por Tachikomaia

73 de clabLevel



 

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.