PDA

View Full Version : A ver si alguien me puede ayudar...(tener paciencia)


xyron
28-03-2006, 11:41 PM
PRIMERO Y PRINCIPAL:POR FAVOR, LEAN TODO DETENIDAMENTE; YA SE QUE ES BASTANTE Y Q PUEDE ABURRIR, PERO POR FAVOR AYUDENME.


bueno, la verdad q no entiendo mucho de programacion, se lo minimo de QB y recien ahora estoy empesando a ver un poco de visual basic. en el colegio me dieron para elegir un proyecto para fin de año, como me gusta programar (por mas q mis conocimientos no son muy amplios) ya fui pensando en un proyecto, tenia que ser algo original, interesante y q sea un desafio para mi.
Charlando con un familiar salio la idea de hacer inteligencia artificial. la idea la verdad que me encanto, y desde ese momento pense alguna forma de inteligencia artificial "primitiva". en este caso se me ocurrio hacer un programa para diseñar laberintos y una especie de "cuadradito" o algun otro objeto, que lo resuelva por si mismo (como una rata de laboratorio).
el programa para que el usuario diseñe sus propios laberintos y compruebe que el programa puede resolver por si mismo el laberinto, y q no se trata de una farza o algo asi, es DENTRO DE TODO lo mas facil, y lo q menos problemas me trae (por ahora).

bueno, al principio no parecio tan complicado, pero mientras lo pensabamos detalladamente empesaron a salir los problemas...
bueno, aqui viene la parte donde necesito ayuda, y para poder explicarme mejor voy a poner una imagen de lo q serian los problemas y la interface grafica del programa.
http://img85.imageshack.us/img85/4084/algoritmos7rf.th.jpg (http://img85.imageshack.us/my.php?image=algoritmos7rf.jpg)

<----AYUDAS NECESARIAS---->

1-los dos globitos color celeste con una letra en el medio son la entrada y la salida.

2- las dos "T" en azul es un punto donde el objeto puede tomar 3 direcciones, el problema es cual tomara. yo tenia pensado hacer q tenga la direccion hacia adelante como predeterminada, y cuando no pueda ir para adelante, que elija uno de los costados, y en caso de que no pueda en ninguna de las 3 direcciones, recien ahi que elija ir para atraz. pero mi planteo es incorrecto, porque si sigue esta rutina de dezplasamiento NUNCA va a ir hacia abajo y se va a quedar dando vueltas por todo el laberinto infinidad de veces.

3-las flechas (o intento de flechas) en color ROJO, ahi hay otro problema grande, porque si se programa al objeto con los siguientes patrones 1-ir hacia adelante, en caso de q no pueda, 2-ir hacia la izquierda en caso de q no pueda, 3- ir hacia la derecha, 4-en caso de q ninguna de las 3 anteriores sea factible, que se de vuelta.
si el programa sigue los patrones anteriores, lo mas seguro es que se quede haciendo un "loop"/ciclo interminable y se tilde el programa.
una solucion que se me ocurrio para este problema es hacer que elija al azar las direccion derecha o izquierda, pero de esta manera seria una cuestion de azar, y yo quiero hacer algo q lo pueda resolver por si mismo y no por cuestiones del azar.

4-La cruz FUCCIA ahi el problema es cual de las 4 direcciones toma. es casi el mismo problema que en el punto 2, la diferencia q son 4 direcciones, y cualquiera puede tener el camino correcto.

5-Camino en VERDE, casi lo mismo que en punto 3. al principio pense q era facil de solucionar, me dije "cambiale el patron de movimiento, q valla primero para la derecha y despues a la iquierda" GRAN ERROR, en caso de q haya un "espejo" en el lado opuesto del labarinto, estaria en la misma situacion.......TODABIA NO SE COMO HACER PARA Q LO RESUELVA SIN TENER QUE USAR AL AZAR.....


bueno, eso es todo.....despues hay otros problemas como por ejemplo:

*que haya mas de un camino, q muestre el camino mas corto.
*que no haya salida
*multiples salidas

pero no quiero q me digan la solucion a estos problemas, porque sino no seria un desafio para mi......


bueno, desde ya muchas gracias a todos los q quieran resolver 1 de los problemas. eso si POR FAVOR NO ME RESPONDAN CON COMANDOS, NO ME DIGAN LO Q TENGO Q PONER EN EL VISUAL, DIGANME LA FORMA DE RESOLVERLO O RAZONARLO, EL PROYECTO EN LO POSIBLE LO QUIERO HACER YO, SI ME LO HACE OTRA PERSONA NO TENDRIA GRACIA Y NO SERIA UN RETO!.....



nuevamente.....GRACIAS!

Ultra
28-03-2006, 11:49 PM
Una cosa que se me ocurre es que por ejemplo podes poner una variante para hacerlo mas interesante de que si avanzo una cantidad de casilleros pares gire a la derecha, si avanzo impares como primera medida gire a la izquierda, cuando giro a la izquierda en los numeros impares y no encontro camino que gire 180º (ahi estaria ya sobre la derecha) y si tampoco hay camino que gire 90º mas (ahi estaria para atras), en caso que este sobre un casillero par tendria que ser la misma formula pero invirtiendo la derecha y la izquierda.

Orego
29-03-2006, 01:38 AM
Bienvenido al foro, mira con lo que se presento el pibee!!!, jajajajaja.
Lo primero que se me ocurre para evitar los loops interminables es hacerlo como vos lo planteaste, pero con un condicionante de que si pasa por ejemplo 2 o 3 veces por un mismo casillero, que tome otra decisión y esta a su vez sea aleatoria, eso evitaria los loops supongo.

t-bone
29-03-2006, 04:24 AM
Hola.

Primero, si hablas de 'inteligencia artificial', esto implicaría en el desarollo de un programa q pueda ser autosuficiente en la recolección de datos y tenga la posibilidad de 'aprender' al saber que una de las opciones es q manejará es inválida, pero para ello tendría q haber tener un error, para poder aprender, verdad?...

La ingeligencia del programa, supongo, se basaría recien al resolver el cuarto o quinto laberinto, ya q en la primera encrucijada, siempre se debería tomar a la derecha, solamente por cuestiones meramente estadísticas, como hariamos todos, despues de saber q en la mayoría de los laberintos q usamos, tuvimos mas posibilidades yendo a la derecha... Hacer un programa q sea inteligente por sí solo, supongo q sería un paradigma... el aprendizaje hace a la inteligencia.
Entendés lo q quiero decir? :confused:

Igual paso a paso... yo empezaría con el generador de laberintos, q muestre siempre situaciones resolubles. :rolleyes:

GEEZETH
29-03-2006, 08:19 AM
Bienvenido!
Buena idea la del "transitador de laberintos"
Hace algun tiempo me habia agarrado la paranoia de construccion de laberintos, pero en papel. Esta muy copado. Tengo ideas de espirales con salida y sin salida y varios tipos de trampas.
Yo en parte coincido con Orego, en que el transitador deberia evitar en lo posible los caminos ya recorridos... si se traba, que recule y trate de girar :p
Hay algun metodo para generar situaciones aleatorias?? definidas matematicamente? Creo que el secreto esta ahi... utilizar el motor del random del winamp para la eleccion de recorrido :D

xyron
29-03-2006, 09:58 AM
es verdad, hay q usar un generador de derecciones aleatorias.
pero hay un problema, si se trata de evitar que el objeto no circule por los caminos antes recorridos, puede que pase como en el caso de la cruz FUCCIA, supongamos que el camino correcto esta a la derecha, el programa va a poder ir hacia la izquierda, hacia abajo y despues puede subir de nuevo, es este caso se habra pasado 3 veces sobre el mismo cacillero, y podria haber trabarse el objeto, ya q por esa direccion paso muchas veces y no la va a tener en cuenta.


eso pienso q podria llegar a pasar, es solo una suposicion...

PD: estoy de acuerdo con lo q dices t-bone, pero eso lo tendria q ir haciendo sobre la marcha, o sea cuando este programando todo....

yo creo q esto es prueba y error, asi voy a poder hacer un programa inteligente, que pueda resolver situaciones por medio del aprendisaje de errores anteriores..

pero mas que nada mi problema son los 4 q dicte al comienzo del post....a esos me costaban encontrarles una solucion...

Orego
29-03-2006, 06:11 PM
utilizar el motor del random del winamp para la eleccion de recorrido :D Exactamente, tenes la sentencia random en VB, habria que ver como se usaria en este caso.
pero hay un problema, si se trata de evitar que el objeto no circule por los caminos antes recorridos, puede que pase como en el caso de la cruz FUCCIA, supongamos que el camino correcto esta a la derecha, el programa va a poder ir hacia la izquierda, hacia abajo y despues puede subir de nuevo, es este caso se habra pasado 3 veces sobre el mismo cacillero, y podria haber trabarse el objeto, ya q por esa direccion paso muchas veces y no la va a tener en cuenta.
eso pienso q podria llegar a pasar, es solo una suposicion... Puede ser, pero si no se trataria de evitar que cruce los caminos antes recorridos, mas bien que al volver a recorrerlos tome otra elección, aleatoria pero que no vuelva a la anterior, y supongo que va a tener que ser combinada con cada encrucijada que se encuentre.

yo creo q esto es prueba y error, asi voy a poder hacer un programa inteligente, que pueda resolver situaciones por medio del aprendisaje de errores anteriores.. Si es prueba y error, y paciencia.
Pero cuando lo logres, tu programa inteligente te va a poder enseñar que aprendizaje es con Z!!!!:D:D chiste chite

xyron
29-03-2006, 07:24 PM
jaajajaj....si, mi ortografia es de terror, asique vallan acostumbrandose :D

bueno, lo q se me ocurre con el random es hacer una especie de sentencias asi...la verdad q no se si puede funcionar o no, porque la estoy pensando en el momento, pero bue...la idea la tengo...

(variable)=int(rnd*2)
if (variable)=1 then
que valla a la iquierda
else
q valla a la derecha

una cosa asi seria lo del random, o eso creo yo.......
bueno, de esta manera va a generar 2 variables al azar, 0 o 1.
le pongo el INT adelante de la funcion porq el rnd genera variables decimales al azar, entonces lo hago para q den numero enteros...

orchiz87
31-03-2006, 05:50 PM
Antes que nada quiero aclarar que este es un ejemplo de AI simple y no tiene por q el programa ir "aprendiendo", si recien
esta empezando en AI, q empece con lo sencilo. Como en todo

Unas de las cosas para mi mas importantes es ver de forma estas guardando el "mapa" del laberinto. Yo usaria algo al
estilo de una HashTable (una key y un value). Trata de guardarlos en un archivo para aprender algo de I/O en archivos.
Yo lo plantearia de la siguiente manera:
Dentro del mapa tiene q haber un puntero que va a ser donde se encuentre el "raton":
Este va empezara en la largada, avanza hasta q encuentra un punto de quiebre. Bueno aca hay dos opciones, darle una
estrategia de eleccion (Yo le pondria varias estrategias de eleccion, dependiendo de algunos factores, para no explayarme
mucho voy a dar como ejemplo uno solo, para q veas a q me refiero con estrategia) o simplemente hacer q pruebe TODOS los
caminos.
Siguiendo el laberinto q posteaste cuando llega al primer T(azul). Si queres q pruebe todos los caminos, simplemente
q empiece por izq o derecha o centro como quieras. Si queres q elija uno en particular, yo haria q calcule el area de los
cuadrados q forman el proximo espacio "caminable" (como esta "estrategia" deberia haber varias).

El tema de como hacer para que no se quede dando vueltas infinitamente yo lo pensaria asi:


El puntero tiene q ir teniendo una serie de Cheack points, de safe points con jerarquias, llega a la primera T azul:
ahi nomas graba un safepoint, al ser el primero va a ser el de mayor jerarquia. Asi cuando se trabe en uno tiene q volver
al safe point anterior. Te tiro un hint: NO TENES Q TOMAR CADA CUADRADITO, tenes q ver bloques de camino. (esto es la base
de tu problema, si entendiste realmente esto, lo sacas al toque). NO tiene sentido q te tire mas info. sino q te pongas a
resolverlo no tiene sentido...

como conclusion para q nos se te formen bucles infinitos:
1) NO tomes cuadradito por cuadradito
2) Sistema de Check Points Jerarquicos

y con el otro tema, pensa bien q estrategias puede utilizar: para mi eso es lo mas interesante del problema.

Saludos.

Gentileza De Alejandro Daniel Bertolo Progrmador Semi-Senior Java IBM

Orego
31-03-2006, 06:16 PM
Muy buena data Orchiz, sera agradecida seguramente por xyron al Sr Bertolo :D

xyron
01-04-2006, 11:19 AM
me encanto la idea de los checkpoints jerarqicos. esa puede ser la idea que me haga triunfar :rolleyes:. ensima lo voy pensando y no me parece algo complicado, pero bue....habria q esperar a hacerlo :D

orchiz87
02-04-2006, 06:01 PM
Me alegro de ke la info te halla servido y puedas concretar tu proyecto :D

xyron
13-02-2007, 04:48 PM
bueno, revivo el thread solo para decir q el proyecto no lo hice, nos dimos cuenta que era muy jodido y que para hacerlo ibamos a terminar copiando y pegando el codigo de otra persona.
terminamos haciendo un programa en el cual vos controlas a un personaje y tenes q dispararle a los enemigos q t aparecen en ambos extremos de la pantalla.
no lo pudimos terminar al 100%, nos faltaron algunos graficos y agregar un par de niveles. pero lo que seria el "engine" funcionaba lo mas bien. y hasta nos dimos cuenta, con el correr de las clases, q los profesores no eran de gran ayuda. cada vez q les pediamos ayuda terminaban haciendo cagadas y teniamos q retroceder bastante.
algun dia si tengo ganas subo el programita para q lo prueben. no es la gran cosa, ya q lo tuvimos q hacer en VB (ni siquiera en el .net). a demas nuestro nivel no es el mejor.
igualmente fue muyyy injusta la correccion de los trabajos. habia grupos q habian hecho como trabajo principal un PONG (q es MUYYYY facil de hacer), encima no andaba bien, ya q las barras no tenian un movimiento fluido, o sea q vos no podias mantener apretado la flechita para q se deslice, sino q tenias q apretar muchas veces para q baje.
hubo otro grupo q hizo un proyecto de mini juegos en los cuales venian incluidos un pong (mucho mejor q el otro, hasta tenia diferentes opciones para jugar), un Galaga y el clasico juego de los 100M en el cual tenias q apretar la barra espaciadora hasta romperla. lo mas loco es q los 2 grupos se sacaron 10. es medio injusto pero a su vez es lo correcto, ya q no todos tienen el mismo conocimiento y las mismas facultades para la programacion.


bueno. saludos para todos y gracias por los consejos q, en algun momento, me sirvieron mucho.