<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Starco Studios &#187; Pathfinding</title>
	<atom:link href="http://www.starcostudios.com/blog/category/inteligencia-artificial/pathfinding-inteligencia-artificial/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.starcostudios.com/blog</link>
	<description>La comunidad Starco</description>
	<lastBuildDate>Wed, 18 May 2011 18:14:24 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Conceptos avanzados del Pathfinding</title>
		<link>http://www.starcostudios.com/blog/2009/12/conceptos-avanzados-del-pathfinding/</link>
		<comments>http://www.starcostudios.com/blog/2009/12/conceptos-avanzados-del-pathfinding/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 14:57:58 +0000</pubDate>
		<dc:creator>Sergio Sanchez Mendez</dc:creator>
				<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Pathfinding]]></category>

		<guid isPermaLink="false">http://www.starcostudios.com/blog/?p=298</guid>
		<description><![CDATA[Una vez terminada la serie de artículos relacionados con el pathfinding
se podría pensar que ya sabemos suficiente sobre el tema y que podemos
abordar cualquier problema que requiera del uso de esta disciplina de la inteligencia
artificial. Sin embargo, nada más lejos de la realidad puesto que esto
es solo el comienzo de una gran variedad de ramas [...]]]></description>
			<content:encoded><![CDATA[<p>Una vez terminada la serie de artículos relacionados con el pathfinding<br />
se podría pensar que ya sabemos suficiente sobre el tema y que podemos<br />
abordar cualquier problema que requiera del uso de esta disciplina de la inteligencia<br />
artificial. Sin embargo, nada más lejos de la realidad puesto que esto<br />
es solo el comienzo de una gran variedad de ramas dedicadas a este concepto.</p>
<p>A partir de aqui los interesados en el tema pueden abordar diferentes áreas<br />
siempre que las necesidades lo requieran. Una vez terminados los conceptos<br />
relacionados con el pathfinding que hemos visto, el aprendizaje usa conceptos<br />
generalmente relacionados por lo que se hace muy gratificante y comprensible en<br />
la mayoría de los casos.</p>
<p>Algunos de las disciplinas que complementan el Pathfinding son:</p>
<p><a href="http://">&gt; Caminos para Múltiples unidades. Group Pathfiding</a></p>
<p>Búsqueda de caminos para grupos. Es muy común que grupos de unidades tengan<br />
que ser desplazados. En este caso se dan varios problemas sobre todo en<br />
cuellos de botella del mapa o en casos en los que el grupo debe cambiar</p>
<p>de posición relativa.</p>
<p><a href="http://theory.stanford.edu/~amitp/GameProgramming/ImplementationNotes.html#S18">&gt;Más aqui</a></p>
<p><a href="http://">&gt; Caminos suaves. Smooth Pathfinding</a></p>
<p>Además de generar una serie de posiciones que lleven al destino, en ocasiones<br />
podemos buscar también que esta trayectoria sea más realista mediante el uso<br />
de caminos suaves. Para esto existen técnicas y conceptos a tener en cuenta que<br />
nos pueden ser muy útiles y que sirven para la mayoría de los casos en función<br />
de cada representación del mapa.</p>
<p><a href="http://theory.stanford.edu/~amitp/GameProgramming/MapRepresentations.html#S12">&gt;Ver más</a></p>
<p><a href="http://">&gt; Cálculos eficientes.</a></p>
<p>Existen técnicas que se orientan a mejorar el desempeño de estos algoritmos. En<br />
ocasiones tienen un coste muy alto en materia de cálculo y siempre están sujetos<br />
a consumir tiempo de CPU sobre todo en las aplicaciones en las que es necesario<br />
un desplazamiento contínuo de las unidades o agentes como puede ser una aplicación<br />
de estrategia en tiempo real.</p>
<p><a href="http://theory.stanford.edu/~amitp/GameProgramming/Heuristics.html#S2">&gt;Ver más</a></p>
<p><a href="http://">&gt; Diferentes representaciones</a></p>
<p>A la hora de abordar estos algoritmos de búsquedas de caminos, muchas veces tenemos la<br />
posibilidad de definir la representación del mundo en la que nos moveremos. De esa elección<br />
partirán las diferentes necesidades del algoritmo y el grado de desempeño. En determinadas<br />
situaciones será interesante utilizar representaciones como los quadtrees, en otras utilizaremos<br />
grafos y en algunas nos moveremos por el entorno de casillas que ha sido el más abordado en<br />
la lista de artículos de la materia que se ha llevado a cabo. De cualquier modo cada una de ellas<br />
tendrá sus ventajas y sus inconvenientes y de nuestro grado de conocimiento dependerá que escojamos<br />
la opción más adecuada.<br />
<a href="http://theory.stanford.edu/~amitp/GameProgramming/MapRepresentations.html"> &gt;Ver más aqui</a></p>
<p><a href="http://">&gt; Pathfinding dinámico</a></p>
<p>A veces no es necesario disponer de todo el camino sino tener de forma inmediata una dirección de<br />
desplazamiento y una velocidad de movimiento concretas. El pathfinding dinámico se centra en generar<br />
soluciones que van variando en el tiempo pero que acercan al agente a su objetivo final. Existen soluciones<br />
que emulan el comportamiento animal en el aspecto de búsqueda de caminos y que trabajan conceptos como<br />
el seguimiento de otros agentes, la evasión en caso de perseción y muchos otros comportamientos que<br />
requieren de esta disciplina para su correcto funcionamiento.</p>
<p><a href="http://theory.stanford.edu/~amitp/GameProgramming/Variations.html#S6">&gt;Ver más</a></p>
<p>Hay mucho trabajo pendiente y muchas más áreas que abordar en este campo<br />
de la inteligencia artificial por lo que todos los interesados son bienvenidos.</p>
<p>A disfrutarlo!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.starcostudios.com/blog/2009/12/conceptos-avanzados-del-pathfinding/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El maestro ninja del Pathfinding, el A* Jerárquico Anotado.</title>
		<link>http://www.starcostudios.com/blog/2009/12/el-maestro-ninja-del-pathfinding-el-a-jerarquico-anotado/</link>
		<comments>http://www.starcostudios.com/blog/2009/12/el-maestro-ninja-del-pathfinding-el-a-jerarquico-anotado/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 14:46:47 +0000</pubDate>
		<dc:creator>Sergio Sanchez Mendez</dc:creator>
				<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Pathfinding]]></category>

		<guid isPermaLink="false">http://www.starcostudios.com/blog/?p=285</guid>
		<description><![CDATA[Abordamos para terminar esta serie de artículos referentes al Pathfinding,
una solución casi óptima al problema propuesta por el Dr. Daniel Harabor.
En ella se propone hacer una búsqueda de caminos similar a la que hariamos
las personas buscando en primer lugar caminos rápidos para largas distancias
y ajustando la búsqueda una vez nos encontramos cerca del objetivo.

Nuestro problema [...]]]></description>
			<content:encoded><![CDATA[<p>Abordamos para terminar esta serie de artículos referentes al Pathfinding,<br />
una solución casi óptima al problema propuesta por el Dr. Daniel Harabor.<br />
En ella se propone hacer una búsqueda de caminos similar a la que hariamos<br />
las personas buscando en primer lugar caminos rápidos para largas distancias<br />
y ajustando la búsqueda una vez nos encontramos cerca del objetivo.</p>
<p><a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/road-graph.png"><img class="aligncenter size-full wp-image-286" title="Ejemplo de funcionamiento" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/road-graph.png" alt="Ejemplo de funcionamiento" width="400" height="408" /></a></p>
<p>Nuestro problema es, por lo tanto, definir una abstracción donde a un nivel<br />
superior se represente el mapa de una forma rápida y abordable por los algoritmos<br />
de búsqueda. Una vez tenemos esta abstracción utilizar un procedimiento más preciso<br />
para llegar al punto correcto. Dividiremos el mapa en sectores.</p>
<p><a href="http://">&gt;Abstracción jerárquica</a></p>
<p>La forma en la que nos abstraemos de una forma adecuada será la siguiente:</p>
<p>1. En primer lugar dividimos el mapa anotado en un set de clusters adyacentes conectados por Entradas.Veremos más en detalle como.</p>
<p>2. En segundo lugar compactamos el grafo generado usando algunas técnicas para mejorar el resultado eliminando innecesarios con la finalidad de tener los nodos mínimos.</p>
<p>3. Por último describimos el Algoritmo A* Jerárquico Anotado HAA* (Hierarchical Annotated A*) algorithm (HAA*).</p>
<p>El objetivo de manejar varios terrenos y abstraernos del mapa se ha conseguido pero con<br />
el coste de disponer de mucha información redundante.</p>
<p><a href="http://">&gt; Primer paso. Definir Sectores y entradas</a></p>
<p>Ahora que hemos visto el procedimiento a realizar a grandes pasos, vamos<br />
por partes. Crearemos los sectores y definiremos las entradas. Esto se puede<br />
hacer de forma jerárquica definiendo varios niveles por ejemplo doblando el<br />
tamaño de los sectores.</p>
<p><a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/foto2.png"><img class="aligncenter size-full wp-image-288" title="Sectores divididos" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/foto2.png" alt="Sectores divididos" width="250" height="250" /></a></p>
<p>-Buscamos los valores del grafo:</p>
<p>En el ejemplo de autor identificamos dos tipos de terreno, tierra (ground) y agua<br />
(water) la capacidad queda marcada como capability y el grado de claridad como clearance.<br />
En función del espacio libre el valor de claridad será mayor.</p>
<p><a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/Foto3haa-inter_edges2.png"><img class="aligncenter size-full wp-image-287" title="Entradas entre sectores" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/Foto3haa-inter_edges2.png" alt="Entradas entre sectores" width="394" height="250" /></a></p>
<p>Vemos los valores a marcar en el algoritmo entre los sectores C1 y C3.</p>
<p>-Identificamos las entradas entre clusters</p>
<p>Una entrada queda definida como un área libre de obstáculos con el máximo<br />
tamaño que existe entre el borde de los clusters. Se representa con un<br />
punto de transición que marca que un agente de tamaño menor o igual puede<br />
pasar al sector concreto. Se marca como una arista de peso 1 y con un tipo<br />
concreto y una claridad concreta. La nueva representación será por tanto<br />
una lista de aristas a modo de grafo donde cada una tendrá las transiciones<br />
de un sector a otro y la claridad y tipo de terreno asociado.</p>
<p><a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/haa-initial_abstraction1.png"><img class="aligncenter size-full wp-image-289" title="Resultado inicial" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/haa-initial_abstraction1.png" alt="Resultado inicial" width="249" height="250" /></a></p>
<p>En la foto superior se aprecia que hay gran cantidad de aristas redundantes.</p>
<p><a href="http://">&gt; Segundo paso. Eliminar información redundante.</a></p>
<p>Este segundo paso pretende compactar la información para reducir el volumen<br />
de datos que se está manejando y hacer por lo tanto que los algoritmos de búsqueda<br />
sean más rápidos a la hora de encontrar una solución.</p>
<p>Para ello vamos a aplicar dos técnicas diferentes propuestas por el autor.</p>
<p>- Dominancia fuerte. Si dos aristas de longitud igual conectan el mismo par<br />
de nodos y los dos son travesables por la mismas unidades solo es necesaria<br />
la de claridad mayor. Esto se llama así porque una de las aristas, la de mayor<br />
claridad, domina a la otra. En la foto inferior de la derecha vemos el resultado.</p>
<p><a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/Foto5.haa-strong_dominance.png"><img class="aligncenter size-full wp-image-290" title="Grafo del HAA*" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/Foto5.haa-strong_dominance.png" alt="Grafo del HAA*" width="296" height="250" /></a></p>
<p>- Dominancia débil. En este caso se tratará de minimizar el número de transiciones<br />
entre sectores. Para conseguir esto analizaremos cada par de aristas internas del<br />
sectores probando que si eliminamos una de ellas el mapa sigue representando la<br />
misma información. Solo las aristas que son travesables por el mayor número de<br />
agentes son retenidas, el resto se eliminarán. El resultado se aprecia en la foto<br />
superior de la izquierda.</p>
<p>El resultado de aplicar los dos procedimientos es el que vemos en la figura<br />
inferior.</p>
<p><a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/Foto-6.haa-weak_dominance1.png"><img class="aligncenter size-full wp-image-291" title="Aplicacion de las reglas de poda" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/Foto-6.haa-weak_dominance1.png" alt="Aplicacion de las reglas de poda" width="250" height="250" /></a></p>
<p>El resultado de aplicar estas técnicas puede suponer de un 3 a un 10% de incremento<br />
en la longitud de los caminos encontrados pero sin embargo disminuye en un 50% de media<br />
el tamaño de la memoria requerida para almacenar los mapas y el desempeño del algoritmo<br />
aumenta considerablemente.</p>
<p><a href="http://">&gt; Tercero. Aplicamos el algoritmo A* Jerárquico Anotado</a></p>
<p>El proceso de encontrar el camino será directo. Como detalle general<br />
se distinguen dos procesos.</p>
<p>1. Insertamos dos nodos temporales en el grafo abstracto que representen<br />
el inicio y final del camino. Conectamos el grafo con estos dos nodos<br />
buscando un camino desde las dos posiciones a cada transición en el<br />
sector local.</p>
<p>2. Utilimos A* para encontrar el camino más corto en el grafo abstracto<br />
que hemos generado. Al final de la búsqueda eliminamos ambos nodos que<br />
hemos incluido.</p>
<p>Se incluye en el algoritmo los conceptos de tamaño del agente y de capacidad<br />
que expresa las vias que puede recorrer el agente en cuestión.</p>
<p><a href="http://">&gt; En Resumen</a></p>
<p>Este algoritmo nos permite generar de forma rápida caminos para los entornos<br />
que nos propongamos de una forma mediante la que generando una correcta abstracción<br />
del mundo, nos acercamos a la forma en la que los seres humanos planificamos la<br />
búsqueda de caminos, es decir, partiendo de bloques más grandes conectados y afinando<br />
la precisión conforme nos acercamos al destino.</p>
<p>Se ofrece el código fuente completo, agradeciendo el material al Dr. Daniel Harabor:</p>
<p><a href="http://code.google.com/p/ahastar/downloads/list">&gt;Codigo</a><br />
<a href="http://abotea.rsise.anu.edu.au/data/hpastar.pdf" target="_blank">&gt;Artículo del algoritmo (paper)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.starcostudios.com/blog/2009/12/el-maestro-ninja-del-pathfinding-el-a-jerarquico-anotado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Algoritmo A* Anotado. Pathfinding para agentes de tamaño y capacidades arbitrarias.</title>
		<link>http://www.starcostudios.com/blog/2009/12/algoritmo-a-anotado-pathfinding-para-agentes-de-tamano-y-capacidades-arbitrarias/</link>
		<comments>http://www.starcostudios.com/blog/2009/12/algoritmo-a-anotado-pathfinding-para-agentes-de-tamano-y-capacidades-arbitrarias/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 13:02:32 +0000</pubDate>
		<dc:creator>Sergio Sanchez Mendez</dc:creator>
				<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Pathfinding]]></category>

		<guid isPermaLink="false">http://www.starcostudios.com/blog/?p=283</guid>
		<description><![CDATA[En este pequeño comentario se abordará el procedimiento para conseguir un
algoritmo de pathfinding apropiado para unidades de diferente tamaño y diferentes
capacidades (anfibias, terrestres, aereas &#8230;etc). Para ello se utilizará el concepto
de Algoritmo A Estrella Anotado.

Este algoritmo se basa en el A* Simple y tiene en cuenta un grafo de claridad
para manejar el entorno.
La variante respecto [...]]]></description>
			<content:encoded><![CDATA[<p>En este pequeño comentario se abordará el procedimiento para conseguir un<br />
algoritmo de pathfinding apropiado para unidades de diferente tamaño y diferentes<br />
capacidades (anfibias, terrestres, aereas &#8230;etc). Para ello se utilizará el concepto<br />
de Algoritmo A Estrella Anotado.</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/DMLf03as1nI&#038;hl=es_ES&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/DMLf03as1nI&#038;hl=es_ES&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p>Este algoritmo se basa en el <a href="http://www.starcostudios.com/blog/2009/12/a-pathfinding-para-samurais-informaticos/">A* Simple </a>y tiene en cuenta un <a href="http://www.starcostudios.com/blog/2009/12/creacion-del-grafo-de-claridad-para-juegos-de-estrategia/">grafo de claridad</a><br />
para manejar el entorno.</p>
<p>La variante respecto al algoritmo simple de A * es subyace en el hecho de que en el propio<br />
algoritmo tenemos que pasar el tamaño del agente y su capacidad. El pseudocódigo es el siguiente:</p>
<p><code>almacenamos posición de inicio en la lista de abiertos.<br />
para cada casilla de la lista de elementos abiertos<br />
si la casilla actual es el destino,<br />
retorna camino.<br />
sino,<br />
para cada vecino adyacente al actual<br />
si el vecino es de la lista de cerrados pasarlo<br />
sino,<br />
si el vecino ya está en la lista de abiertos, actualizamos el peso.<br />
sino,<br />
si la claridad del vecino con su capacidad &gt; tamaño de la unidad,<br />
ponemos al vecino en la lista de abiertos<br />
sino, eliminamos al vecino<br />
ponemos el nodo actual en la lista de cerrados.<br />
si la lista de abiertos está vacia, retornamos error.<br />
</code></p>
<p>Se ofrece el código fuente escrito por Daniel Harabor<br />
&gt; <a href="http://code.google.com/p/ahastar/downloads/list">Código</a><br />
&gt; <a href="http://webdocs.cs.ualberta.ca/~nathanst/research.html">Código adicional de la librería de Pathfinding de la Universidad de Alberta</a></p>
<p>Hasta la próxima</p>
]]></content:encoded>
			<wfw:commentRss>http://www.starcostudios.com/blog/2009/12/algoritmo-a-anotado-pathfinding-para-agentes-de-tamano-y-capacidades-arbitrarias/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pathfinding avanzado con Funciones Potenciales</title>
		<link>http://www.starcostudios.com/blog/2009/12/pathfinding-avanzado-enfoque-academico-con-funciones-potenciales/</link>
		<comments>http://www.starcostudios.com/blog/2009/12/pathfinding-avanzado-enfoque-academico-con-funciones-potenciales/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 20:20:45 +0000</pubDate>
		<dc:creator>Sergio Sanchez Mendez</dc:creator>
				<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Pathfinding]]></category>

		<guid isPermaLink="false">http://www.starcostudios.com/blog/?p=248</guid>
		<description><![CDATA[Abordamos el tema del Pathfinding desde un punto de vista más formal
donde definiremos una estructura matemática que nos permitirá buscar
de una forma óptima y precisa el camino a encontrar.
Este procedimiento es válido tanto en entornos virtuales aplicados a
juegos, como a entornos reales donde por ejemplo debemos fijar el modo
de desplazamiento de un robot móvil.

Estos procedimientos [...]]]></description>
			<content:encoded><![CDATA[<p>Abordamos el tema del Pathfinding desde un punto de vista más formal<br />
donde definiremos una estructura matemática que nos permitirá buscar<br />
de una forma óptima y precisa el camino a encontrar.</p>
<p>Este procedimiento es válido tanto en entornos virtuales aplicados a<br />
juegos, como a entornos reales donde por ejemplo debemos fijar el modo<br />
de desplazamiento de un robot móvil.</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/2zNoU6EYgSA&#038;hl=es_ES&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/2zNoU6EYgSA&#038;hl=es_ES&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p>Estos procedimientos tienen un coste importante en materia de cálculo<br />
por lo que no serán válidos en todos los aspectos. Mover un volumen de<br />
unidades alto en tiempo real será una tarea difícil aplicándolo desde el<br />
punto de vista convencional. Sin embargo, existen adaptaciones de los<br />
procedimientos que veremos a continuación que permiten utilizarlos tambien<br />
con un grado de desempeño importante.</p>
<p><a href="http://">&gt; Definimos el entorno</a></p>
<p>En primer lugar vamos a fijar los elementos que intervienen en este<br />
paradigma de pathfinding. El cálculo se hace en base a las 2 dimensiones<br />
pero puede ser extrapolado a 3D sin mucha complicación.</p>
<p>Sea el destino un punto g € del grupo de los reales R2<br />
Sea el agente a desplazar r € a los reales R2</p>
<p>El paradigma es el de una carga que se ve atraida por el punto de destino<br />
y repelida por los diferentes obstáculos. A partir de funciones matemáticas<br />
nos construiremos:</p>
<p><a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/1entorno.png"><img class="aligncenter size-full wp-image-254" title="Entorno del problema" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/1entorno.png" alt="Entorno del problema" width="507" height="395" /></a></p>
<p>-Primero un entorno que represente la idea<br />
-Segundo un mecanismo que nos permita desplazar la carga hasta su destino,<br />
es decir, calcular el camino.</p>
<p>En primer lugar podemos ver el mundo a construir como una forma de<br />
distribución de energía potencial. En este caso lo veríamos como una<br />
cuesta inclinada donde nuestro vehículo movil sería una bola de acero<br />
que por su energía potencial se desplaza al punto de destino (con energía<br />
potencial más bajo que el resto). Los obstáculos serían protuberancias  o<br />
badenes sobre la propia cuesta inclinada, por así decirlo.</p>
<p><a href="http://">&gt; Definimos una función potencial:</a></p>
<p><a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/2.potentialF.png"><img class="aligncenter size-full wp-image-255" title="Funcion potencial" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/2.potentialF.png" alt="Funcion potencial" width="129" height="39" /></a></p>
<p>Ahora fijamos la función potencial como una suma de dos valores, para<br />
hacernos la vida más fácil.</p>
<p>U(q) = Uatt(q) + Urep(q)</p>
<p>Donde:</p>
<p>-Uatt(q) representa las fuerzas de atracción, es decir, una cuesta inclinada<br />
que nos lleva diréctamente al punto de destino y que no contempla los obstáculos.<br />
Lo llamaremos el potencial de atracción,</p>
<p>-Urep(q) representa las fuerzas de repulsión. Aquellas que hacen que cuando la<br />
carga (nuestro agente movil) se acerque, sea repelido.</p>
<p><a href="http://">&gt; El potencial de atracción</a></p>
<p>Nos interesa que el potencia de atracción sea una cuesta inclinada<br />
sin saltos y mónotona decreciente, es decir, desde el punto de partida<br />
hasta el de destino, siempre sea decreciente. Moverse en dirección opuesta<br />
al destino debe venir acompañado de un aumento de potencial y por tanto no<br />
ser viable.</p>
<p>Algunas de las funciones a considerar pueden ser las que vemos en la figura,<br />
se muestra también el gradiente negativo, es decir, como disminuirían<br />
estas funciones:</p>
<p><a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/3.potentFunct2.png"><img class="aligncenter size-full wp-image-273" title="Varias funciones potenciales" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/3.potentFunct2.png" alt="Varias funciones potenciales" width="80%" height="80%" /></a></p>
<p>Combinamos el potencial aplicando una función si estamos a una distancia<br />
mayor de d* del destino y otra para menos de d*. Podemos ir incluyendo<br />
diferentes comportamientos añadiendo sectores nuevos en función de la distancia.</p>
<p><a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/4.comb1.png"><img class="aligncenter size-full wp-image-259" title="4.comb" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/4.comb1.png" alt="4.comb" width="503" height="327" /></a></p>
<p>El resultado es el de la figura, una función monótona decreciente sobre la que<br />
podemos aplicar mecanismos de optimización que nos lleven al mínimo absoluto, que<br />
coincide con nuestro destino.</p>
<p><a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/5.functAtt1.png"><img class="aligncenter size-full wp-image-261" title="Función de atracción potencial resultante" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/5.functAtt1.png" alt="Función de atracción potencial resultante" width="324" height="288" /></a></p>
<p>Puesto que la velocidad de nuestro agente dependerá de la velocidad con la que<br />
se descienda la &#8216;cuesta&#8217;, nos puede interesar aplicar diferentes inclinaciones<br />
a medida que nos alejamos del punto de partida.</p>
<p><a href="http://">&gt; El potencial de repulsión</a></p>
<p>Ahora tenemos que incluir los obstáculos que nos encontramos en el camino para que<br />
no hayan colisiones. Para ello utiliazremos el potencial de repulsión.</p>
<p>Para cada obstáculo buscaremos crear lo siguiente:</p>
<p><a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/6.repuls.png"><img class="aligncenter size-full wp-image-264" title="Función Potencial de repulsión" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/6.repuls.png" alt="Función Potencial de repulsión" width="307" height="242" /></a></p>
<p>Para ello utilizaremos una función que cree un &#8216;cilindro&#8217; como el que vemos. Es posible<br />
crear funciones más suaves pero para ejemplificar y entender el mecanismo ya nos vale. En<br />
general es bueno tener funciones decrecientes sin saltos y no podemos dar por válida esta<br />
función potencial por el hecho de que al sumar a la de potencial de atracción tendremos como<br />
resultado una función monótona decreciente.</p>
<p><a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/7.funct.png"><img class="aligncenter size-full wp-image-265" title="Ecuación de la Funcion potencial de repulsión" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/7.funct.png" alt="Ecuación de la Funcion potencial de repulsión" width="448" height="89" /></a></p>
<p>Se añade el gradiente, la forma en la que disminuye.</p>
<p><a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/8.grad1.png"><img class="aligncenter size-full wp-image-266" title="Gradiente de la función potencial de repulsión" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/8.grad1.png" alt="Gradiente de la función potencial de repulsión" width="576" height="88" /></a></p>
<p>El resultado conjunto será:</p>
<p><a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/9.conjunto.png"><img class="aligncenter size-full wp-image-267" title="Combinación de funciones potenciales" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/9.conjunto.png" alt="Combinación de funciones potenciales" width="587" height="329" /></a></p>
<p><a href="http://">&gt; Ahora aplicamos las fuerzas para mover al agente</a></p>
<p>Tenemos ya nuestra representación del mundo como la queriamos</p>
<p><a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/10.varias.png"><img class="aligncenter size-full wp-image-269" title="Varias vistas de las funciones potenciales" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/10.varias.png" alt="Varias vistas de las funciones potenciales" width="449" height="459" /></a></p>
<p>Utilizaremos el gradiente descendiente como una forma sencilla<br />
de llegar al mínimo de potencial</p>
<p><a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/11.grad.png"><img class="aligncenter size-full wp-image-277" title="Gradiente de la función potencial" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/11.grad.png" alt="Gradiente de la función potencial" width="317" height="45" /></a></p>
<p>El gradiente nos especifica, por así decirlo, hacia donde se movería<br />
una carga que está sometida a todas las fuerzas que actúan en ese punto.<br />
Por lo tanto indica la dirección de desplazamiento de la carga en cada uno<br />
de los puntos.</p>
<p><a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/12.fuerza.png"><img class="aligncenter size-full wp-image-278" title="Fuerza o gradiente" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/12.fuerza.png" alt="Fuerza o gradiente" width="279" height="245" /></a></p>
<p>Cada carga actúa sobre el punto concreto y el gradiente del potencial es por<br />
tanto la dirección de la fuerza resultante y el grado con el que esta actúa.</p>
<p>El algoritmo que seguiremos para aplicar el gradiente descendente será:</p>
<p><a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/13.gradPro.png"><img class="aligncenter size-full wp-image-279" title="Añgpritmo del Gradiente Descendiente" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/13.gradPro.png" alt="Añgpritmo del Gradiente Descendiente" width="239" height="135" /></a>Definimos € como la variación mínima que estamos dispuestos a tomar como un nuevo valor delalgoritmo. Si las variaciones son muy bajas ya damos por buena la solución.</p>
<p>Fijamos el parámetro alfa como un valor que escala el gradiente [0, 1] , es dicer, le da mayor o menor grado a cada paso. Reducirlo aumenta la precisión pero ralentiza el proceso. Puede ser una función que dependa de &#8216;i&#8217; como es este el caso.</p>
<p>A cada momento la nueva posición es calculada en base a la anterior y al decremento de gradiente concreto.</p>
<p>Para entenderlo mejor, un vehículo movil que este en una posición q(qx, qy) le corresponderá una nueva posición qn(qnx, qny) calculada a partir de la suma de la actual y el gradiente que en este caso será una componente en x (gx) y otra en y  (gy). Resultando:</p>
<p>qn(qnx, qny) = q(qx, qy) + g(gx, gy) como una suma de vecotores normal componente a componente.</p>
<p><a href="http://">&gt; Ajustes sobre el algoritmo </a></p>
<p>Utilizar este procedimiento matemático puede ser costoso si queremos<br />
buscar un camino desde el inicio hasta la meta, sin embargo, podemos<br />
tratar dos valores fundamentales para hacer que el coste de cálculo se<br />
facilite en detrimento de la precisión del camino y de las posiciones<br />
destino parciales a anotar.</p>
<p>En primer lugar podemos hacer un cálculo basado en un parámetro que<br />
aplique el cálculo de forma iterativa un número Ndeterminado de veces<br />
y con esto iniciar el desplazamiento en la dirección adecuada. Para N=1<br />
ya podemos calcular la dirección de este modo:</p>
<p>-Sea pactual(q) la posición actual del agente móvil<br />
-Sea p1(q) la posición obtenida por la aplicación del procedimiento anterio<br />
-La dirección de movimiento del agente ya puede ser comunicada como<br />
direccion(q) = arctg(p1(qm1)-pactual(qm1) / p1(qm1)-pactual(qm1))</p>
<p>-La fuerza de desplazamiento se corresponde con el módulo del vector generado,<br />
nos sirve como parámetro para decidir con que velocidad moveremos el<br />
agente.</p>
<p>fuerza(q) = sqrt(p1(qm1)-pactual(qm1)^2 + p1(qm2)-pactual(qm2)^2)</p>
<p>En segundo lugar podemos variar la amplitud de cada paso (nuestro parámetro alfa)<br />
del algoritmo  haciendo que la precisión baje a costa de una gran mejora en materia de coste<br />
de cálculo. Esto sería aplicado a nuestro caso, hacer que las unidades reciban<br />
menos instrucciones de movimiento a costa de tener un camino menos continuo.</p>
<p>Aunque hay muchas propuestas y documentación al respecto,<br />
un buen artículo que resume este funcionamiento es el propuesto<br />
por GDHager, <a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/Chap4-Potential-Fields.pdf">descargalo aqui</a>.</p>
<p>Y hasta aqui hemos llegado, a ver quien es el primero que envía una<br />
implementación de este procedimiento.</p>
<p>Hasta la próxima</p>
]]></content:encoded>
			<wfw:commentRss>http://www.starcostudios.com/blog/2009/12/pathfinding-avanzado-enfoque-academico-con-funciones-potenciales/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSteer. Librería para guiar entidades Autónomas</title>
		<link>http://www.starcostudios.com/blog/2009/12/opensteer-libreria-para-guiar-entidades-autonomas/</link>
		<comments>http://www.starcostudios.com/blog/2009/12/opensteer-libreria-para-guiar-entidades-autonomas/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 19:30:45 +0000</pubDate>
		<dc:creator>Sergio Sanchez Mendez</dc:creator>
				<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Pathfinding]]></category>

		<guid isPermaLink="false">http://www.starcostudios.com/blog/?p=239</guid>
		<description><![CDATA[Hoy os presento una maravilla de cara a generar trayectorias y movimientos
para entidades autónomas de forma optima y con un realismo magnífico, la
librería OpenSteer.
Se trata de un libreria creada en C++ que permite definir diferentes comportamientos
a entidades genéricas que necesitan ser dotadas de movimiento. Con ella podemos por
ejemplo guiar un elementos a una posición concreta [...]]]></description>
			<content:encoded><![CDATA[<p>Hoy os presento una maravilla de cara a generar trayectorias y movimientos<br />
para entidades autónomas de forma optima y con un realismo magnífico, la<br />
librería OpenSteer.</p>
<p>Se trata de un libreria creada en C++ que permite definir diferentes comportamientos<br />
a entidades genéricas que necesitan ser dotadas de movimiento. Con ella podemos por<br />
ejemplo guiar un elementos a una posición concreta calculando caminos de forma suave<br />
y no limitados a un mallado.</p>
<p>Es una librería muy flexible que permite ser utilizada en cualquier motor de juego que<br />
tenga un mínimo de compatibilidad con entidades externas. Simplemente por herencia podemos<br />
crear los diferentes vehículos (entidades motrices) y hacer que estos sigan un determinado<br />
comportamiento.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="560" height="340" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/CzX3My41t6I&amp;hl=es_ES&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="560" height="340" src="http://www.youtube.com/v/CzX3My41t6I&amp;hl=es_ES&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Podemos por ejemplo crear un vehiculo que huya y varios vehiculos que lo persigan de forma<br />
sencilla. Lo más destacable de esta libreria es que permite prototipar de forma muy rápida<br />
para posteriormente definir con más detalle los comportamientos. También implementa los mecanismos<br />
más avanzados de guiado realista y óptimo. Los resultados son impresionantes.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="560" height="340" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/wqmkEPSq2NY&amp;hl=es_ES&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="560" height="340" src="http://www.youtube.com/v/wqmkEPSq2NY&amp;hl=es_ES&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Nos vale tanto para Linux, como para Mac o Windows por lo que prácticamente todos podemos<br />
jugar con esta herramienta.</p>
<p>Hay que agradecer esta joya a los chicos del equipo de OpenSteer y al soporte de Sony Computer<br />
Entertainment America puesto que se ofrece como open source software bajo licencia MIT.</p>
<p>&gt; <a href="http://sourceforge.net/projects/opensteer/files/opensteer/OpenSteer%200.8.2/OpenSteerDemo_0_8_2_win32.zip/download">Aqui una demo</a><br />
&gt; <a href="http://sourceforge.net/projects/opensteer/files/opensteer/OpenSteer%200.8.2/OpenSteer_0_8_2_source.zip/download">Y aqui el código completo</a></p>
<p>No os la perdais.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.starcostudios.com/blog/2009/12/opensteer-libreria-para-guiar-entidades-autonomas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>A* Pathfinding para Samurais Informáticos</title>
		<link>http://www.starcostudios.com/blog/2009/12/a-pathfinding-para-samurais-informaticos/</link>
		<comments>http://www.starcostudios.com/blog/2009/12/a-pathfinding-para-samurais-informaticos/#comments</comments>
		<pubDate>Wed, 23 Dec 2009 19:10:18 +0000</pubDate>
		<dc:creator>Sergio Sanchez Mendez</dc:creator>
				<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Pathfinding]]></category>

		<guid isPermaLink="false">http://www.starcostudios.com/blog/?p=224</guid>
		<description><![CDATA[En algún post anterior hemos visto como funciona el algoritmo
A* o &#8216;A Estrella&#8217; pero aqui lo repasaremos aplicándolo a la noble
vía de la búsqueda de caminos.
El aprendiz de Samurai Informático no tiene porqué conocer ningún
detalle del pathfinding para aprender lo que aqui se contará.
En primer lugar nuestro entorno quedará dividido en casillas que
representarán las posiciones [...]]]></description>
			<content:encoded><![CDATA[<p>En algún post anterior hemos visto como funciona el algoritmo<br />
A* o &#8216;A Estrella&#8217; pero aqui lo repasaremos aplicándolo a la noble<br />
vía de la búsqueda de caminos.</p>
<p>El aprendiz de Samurai Informático no tiene porqué conocer ningún<br />
detalle del pathfinding para aprender lo que aqui se contará.</p>
<p>En primer lugar nuestro entorno quedará dividido en casillas que<br />
representarán las posiciones alcanzables de los elementos que van<br />
a ser desplazados. Partimos de una posición inicial y buscamos una<br />
la lista de casillas que nos llevan a la posición final.</p>
<p>En nuestro entorno encontraremos obstáculos que harán que el camino<br />
pueda variar.</p>
<p><img class="aligncenter size-full wp-image-225" title="Configuración inicial" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/aStarT1.jpg" alt="Configuración inicial" width="362" height="256" /></p>
<p>A partir de ahora cada uno de los elementos de la malla los llamaremos<br />
nodos.</p>
<p><a href="http://"><strong>&gt;El procedimiento de búsqueda</strong></a></p>
<p>Empezamos a estudiar el comportamiento del algoritmo. El estudio y la práctica<br />
hacen al maestro Samurai Informático.</p>
<p>Tenemos 3 elementos sobre los que trabajaremos, la katana, la<br />
armadura y el arco de batalla del algoritmo A Star aplicado al Pathfinding:</p>
<p>- La lista abierta de nodos. Son las casillas que requieren ser tenidas en cuenta.<br />
- El ancestro de un nodo es el nodo a través del que se accede a este último, esto<br />
se hace para que una vez sepamos los nodos o casillas que intervienen podamos recuperar<br />
el orden en el que tienen que ser visitados.<br />
- La lista cerrada de nodos. Son aquellos nodos que no deben ser tratados por el momento.</p>
<p>Ahora el código Samurai a seguir, nuestro Giri del A*. Debemos seguir el Giri bajo cualquier concepto.<br />
El Giri del A* será interiorizado por todos los verdaderos Samurais Informáticos.</p>
<p>- 1. Empezar desde el punto inicial y añadirlo a la lista abierta de casillas a tener en cuenta.</p>
<p>- 2. Mirar todos los cuadrados válidos adyacentes al punto de inicio,<br />
pasando de los inalcanzables. Añádir a la lista abierta.<br />
Por cada uno de esos cuadrados, guarda el punto A como su ancestro.</p>
<p>- 3. Sacar la casilla inicial de la lista de abiertos y ponerlos en la lista cerrada.</p>
<p><img class="aligncenter size-full wp-image-226" title="Foto Expansión inicial" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/aStarT3.jpg" alt="Foto Expansión inicial" width="362" height="255" /></p>
<p>El auténtico Samurai puede extraer ya la dinámica de lo que va a ser nuestro algoritmo de búsqueda de<br />
caminos. Ahora lo que nos queda es repetir el proceso pero no de cualquier manera sino dotando a nuestro<br />
sistema de la intuición genuina ancestral, es decir, lo que llamamos el heurístico. Con el visitaremos<br />
primero los nodos más prometedores, es decir, aquellos en los que la fuerza se detecte mayor.</p>
<p><a href="http://"><strong>&gt; Midiendo la calidad de una casilla</strong></a></p>
<p>La calidad de una casilla es el valor que le damos para comparar entre el resto y decidir cual es el camino<br />
más probable que debemos ir visitando. Aqui entra algo del conocimiento ancestral oculto, solo alcanzable por<br />
los Samurais más avanzados, las matemáticas.</p>
<p>Cada casilla tendra un valor que vendrá determinado por la función: F(x) = G(x) + h(x)</p>
<p>-Donde x es la casilla concreta.<br />
-F(x) es el valor de la función para la casilla x.<br />
-G(x) es el coste que podemos medir. La distancia al inicio del camino<br />
-h(x) es la esencia del algoritmo, el Tao. Aquello que se siente pero no puede ser explicado. El Tao que puede<br />
ser explicado no es el verdadero Tao. En general, es lo que nosotros pensamos que puede quedar para llegar, nosotros<br />
podemos calcular este valor a partir de la intuición de lo que nos queda. Siempre pueden haber obstáculos en medio<br />
que nos perjudiquen pero en general, nos guiará hacia el verdadero Camino.</p>
<p><img class="aligncenter size-full wp-image-227" title="La esencia del TAO" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/aStarT6.jpg" alt="La esencia del TAO" width="404" height="307" />Como medimos las distancias no es problema aqui. El Samurai Verdadero buscará estas respuestas en otras fuentes, lo<br />
realmente interesante es comprender el funcionamiento de nuestra Técnica de Combate A Estrella. No nos preocuparemos<br />
de mejorar la eficiencia de los cálculos por el momento, esto es tarea del Experto Samurai Informático y no entra aqui<br />
ahora, todo a su debido tiempo.</p>
<p><a href="http://"><strong>&gt; El estimador o herístico h(x)</strong></a></p>
<p>Este valor puede calcularse de diferentes maneras bajo diferentes conceptos, orientados a obtener una respuesta rápida<br />
o una respuesta precisa. Generalmente nos pelearemos por buscar un compromiso entre lo rápido y lo preciso.</p>
<p>¿Como lo hacemos? Tenemos varias opciones.</p>
<p>-Primera opción. Sabemos donde estamos y donde queremos llegar, lo de en medio es una incognita. Pues bien, calcularemos la distancia<br />
en línea recta desde nuestro punto al punto final. A esto se le llama distancia Euclidea y sin entrar en detalles será<br />
algo del estilo d(x,y) = sqrt((y1-x1)^2 + (y2-x2)^2), es decir la raiz cuadrada de la suma de los cuadrados de las diferencias<br />
entre las coordenadas correspondientes. Los Samurais que comprendan este concepto adquieren automáticamente una grado<br />
adicional en materia de &#8216;Combate Matematico&#8217;.</p>
<p><img class="aligncenter size-full wp-image-232" title="euclidean" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/euclidean.jpg" alt="euclidean" width="181" height="154" /></p>
<p>-Segunda opción. Lo hacemos más sencillo. Utilizamos lo que se llama la distancia Manhattan. Es decir, calculamos lo<br />
que nos costaría llegar si recorrieramos el tablero siguiendo las lineas de las mallas como si fueran las calles de<br />
una ciudad dividida en manzanas. A efectos prácticos sería algo por el estilo dM(x, y) = abs(y1-x1) + abs(y2-x2), es decir<br />
el valor absouto de la distancia en coordenadas X (pongamosle horizontal) y coordenadas y (pongamosle vertical).</p>
<p><img class="aligncenter size-full wp-image-229" title="Distancia Manhattan" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/image028.jpg" alt="Distancia Manhattan" width="281" height="286" />En la foto las distancias marcadas con color amarillo, azul y rojo son las que representan la distancia Manhattan, cualquiera de ellas es válida. Para el cálculo nos quedamos con la amarilla o la roja (suma de distancia vertical y de distancia horizontal o al revés).<br />
-Otras formas. Para aquellos Samurais más versados comentar que existen más métodos que intentan mejorar la eficacia y<br />
eficiencia de este cálculo, ya que en definitiva es un estimador de lo buena que creemos que es la solución. Una de ellas<br />
es el uso de la distancia Euclidea cuadrada, d2(x,y) = (y1-x1)^2 + (y2-x2)^2 donde se elimina el cálculo de la raiz. Esta<br />
no es propiamente la distancia entre los puntos x e y pero al aplicarlo sobre todos los elementos, el valor relativo de<br />
cada uno sigue representando la calidad estimada y por tanto nos sirve para guiar a la Espada del A Estrella hacia su objetivo.</p>
<p><img class="aligncenter size-full wp-image-233" title="Distancia Euclidea Cuadrada" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/euclideanSquared.gif" alt="Distancia Euclidea Cuadrada" width="479" height="312" /></p>
<p><a href="http://"><strong>&gt; Seguimos la búsqueda.</strong></a></p>
<p>De entre todos los bloques que hemos insertado en la lista de abiertos elegimos el que menos valor tenga en F, es decir,<br />
el que la suma de la distancia al origen G y la distancia estimada h sea menor. Con esto dirigiremos la búsqueda.</p>
<p>Ahora el Samurai Informático novicio adquirirá los conceptos necesarios para ampliar definitivamente su conocimiento en<br />
materia de IA para Juegos por lo que se recomienda atención.</p>
<p>Primero &#8211; Sacar este elemento de la lista de abiertos y añadir a la lista de cerrados.</p>
<p>Segundo &#8211; Repetir el paso de añadir los adyacentes que sean transitables pasando de los que están en la lista de cerrados<br />
Añadirlos a la lista de abiertos si no están ya y poner al cuadro actual como Ancestro de los nuevos cuadros.</p>
<p>Tercero &#8211; Si el cuadro adyacente ya está en la lista de abiertos, mira si el camino a ese cuadro es mejor que este.<br />
es decir, si la G de ese cuadro es más baja que la del que estamos usando para ir allí (llegamos más rápido por aqui)<br />
. Si el coste G del nuevo camino es más bajo, cambia el ancestro del cuadro adyacente al cuadro seleccionado<br />
y recalcula la F y la G de ese cuadrado.</p>
<p>Este paso es el que representa el mayor desafio al Samurai novicio, una vez superado le servirá tanto para generar<br />
caminos como para otras muchas cosas en su vida de Samurai Informático.</p>
<p><img class="aligncenter size-full wp-image-228" title="aStarT7" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/aStarT7.jpg" alt="aStarT7" width="411" height="308" /></p>
<p>Para terminar, comentaros que esta es la base del aprendizaje. A partir de aqui se puede trabajar en mejorar las soluciones<br />
creando caminos más suaves, haciendo cálculos más rápidos y adaptando la solución a nuestro problema en concreto por ejemplo con<br />
diferentes tamaños de unidades y diferentes tipos de terreno transitable (arena/asfalto/etc&#8230;).</p>
<p>Aqui teneis el <a href="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/AStar.zip">código fuente del A* </a> para el Pathfinding provisto por el Samurai Informático Experto Patrick Lester.</p>
<p>Disfrutadlo!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.starcostudios.com/blog/2009/12/a-pathfinding-para-samurais-informaticos/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Creación del grafo de claridad para juegos de estrategia</title>
		<link>http://www.starcostudios.com/blog/2009/12/creacion-del-grafo-de-claridad-para-juegos-de-estrategia/</link>
		<comments>http://www.starcostudios.com/blog/2009/12/creacion-del-grafo-de-claridad-para-juegos-de-estrategia/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 17:52:41 +0000</pubDate>
		<dc:creator>Sergio Sanchez Mendez</dc:creator>
				<category><![CDATA[Game Dev]]></category>
		<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Pathfinding]]></category>

		<guid isPermaLink="false">http://www.starcostudios.com/blog/?p=216</guid>
		<description><![CDATA[Cuando trabajamos con representaciones del mundo como las
que se utilizan en los juegos de estrategia, nos interesa
tener una abstracción máxima del entorno que represente toda
la información necesaria para el correcto desarrollo, con el
mínimo espacio.
Esto se consigue con el grafo de claridad, que en cada posición
definirá a que distancia se encuentran los obstáculos de la casilla
en [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando trabajamos con representaciones del mundo como las<br />
que se utilizan en los juegos de estrategia, nos interesa<br />
tener una abstracción máxima del entorno que represente toda<br />
la información necesaria para el correcto desarrollo, con el<br />
mínimo espacio.</p>
<p>Esto se consigue con el grafo de claridad, que en cada posición<br />
definirá a que distancia se encuentran los obstáculos de la casilla<br />
en cuestión.</p>
<p><img class="aligncenter size-full wp-image-217" title="Grafo de claridad" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/haa-brushfire_annotatedmap.png" alt="Grafo de claridad" width="251" height="250" /></p>
<p>Se propone para crear este grafo el algoritmo de Brushfire o tambien<br />
llamado Wavefront. Sin embargo, este algoritmo presenta algunos problemas<br />
desde el punto de vista de un entorno en el que se moverán elementos<br />
de diferente tamaño. Podemos encontrar cuellos de botella que interfieren<br />
en el correcto desarrollo.</p>
<p><img class="aligncenter size-full wp-image-218" title="Fallo por cuello de botella" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/haa-brushfire_tankfail.png" alt="Fallo por cuello de botella" width="250" height="250" /></p>
<p>Debido a esto, se propone una variante del cálculo para la obtención del<br />
grafo de claridad para diferentes tamaños de unidades. El método en cuestión<br />
se trata de, para cada celda ir ampliando un bloque de NxN creciente hasta<br />
colisionar con un obstáculo, es decir, hasta que en las celdas que pertenecen<br />
al bloque incluyan algún elemento no travesable.</p>
<p>Vemos un ejemplo extremadamente sencillo en las siguientes imágenes donde el<br />
tamaño del bloque crece de izquierda a derecha y de arriba a abajo.</p>
<p><img class="aligncenter size-full wp-image-219" title="Expansión correcta" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/haa-computing_trueclearance3.png" alt="Expansión correcta" width="246" height="250" /></p>
<p>Quedando de esta forma:</p>
<p><img class="aligncenter size-full wp-image-220" title="Forma definitiva" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/haa-trueclearance_annotatedmap.png" alt="Forma definitiva" width="240" height="250" /></p>
<p>Este procedimiento solventa parcialmente el problema pero no lo resuelve completamente.<br />
Existen, del mismo modo, puntos que no son alcanzables cuando si debieran serlo. Esto es debido<br />
a la orientación del crecimiento de los bloques que crecen en una dirección concreta.</p>
<p>Para esto se propone añadir complejidad O(1) al algoritmo, que no supone un impacto excesivo<br />
al desempeño y que consigue resultados mucho mejores. Se trata de, por un lado repetir el proceso desde<br />
las 4 esquinas del entorno, creciendo en direcciones diferentes para cada propuesta y adquiriendo<br />
el máximo de las distancias obtenidas, esto indica que si bien no se puede llegar desde una dirección<br />
concreta, se puede llegar perfectamente por otra.</p>
<p>Con esto ya tenemos una abstracción adecuada al cálculo de nuestro problema. Conseguir un camino será cuestión<br />
de establecer un procedimiento que respete las restricciones. Esto es lo que veremos más adelante.</p>
<p>Os animo a implementarlo por vuestra cuenta, se trata de un ejercicio sencillo y un buen entrenamiento!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.starcostudios.com/blog/2009/12/creacion-del-grafo-de-claridad-para-juegos-de-estrategia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Variante del Algoritmo de Brushfire con varios emisores</title>
		<link>http://www.starcostudios.com/blog/2009/12/variante-del-algoritmo-de-brushfire-con-varios-emisores/</link>
		<comments>http://www.starcostudios.com/blog/2009/12/variante-del-algoritmo-de-brushfire-con-varios-emisores/#comments</comments>
		<pubDate>Mon, 14 Dec 2009 14:17:17 +0000</pubDate>
		<dc:creator>Sergio Sanchez Mendez</dc:creator>
				<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Pathfinding]]></category>

		<guid isPermaLink="false">http://www.starcostudios.com/blog/?p=208</guid>
		<description><![CDATA[En el anterior artículo hemos visto que en el algoritmo de Brushfire
sencillo podemos encontrar un camino aplicando un valor creciente desde
el punto de destino propagando valores hasta el punto final.
Esto sin embargo, no genera un grafo adecuado para ser calculado desde
cualquier punto sino que es necesario propagar la &#8216;ola&#8217; para cada una
de las posiciones de [...]]]></description>
			<content:encoded><![CDATA[<p>En el anterior artículo hemos visto que en el algoritmo de Brushfire<br />
sencillo podemos encontrar un camino aplicando un valor creciente desde<br />
el punto de destino propagando valores hasta el punto final.</p>
<p>Esto sin embargo, no genera un grafo adecuado para ser calculado desde<br />
cualquier punto sino que es necesario propagar la &#8216;ola&#8217; para cada una<br />
de las posiciones de destino.</p>
<p>La variante que se propone ahora es válida para cualquier posición del<br />
entorno. En este caso cada elemento no travesable, es decir, cada obstáculo<br />
es considerado como un generador de &#8216;Ola&#8217; por lo que en cada posición<br />
se representará la distancia al obstáculo más cercano.</p>
<p>El procedimiento de cálculo será el que vemos en la fotografía inferior.</p>
<p><img class="aligncenter size-full wp-image-209" title="Desarrollo del algoritmo" src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/propagacionbrushfire.png" alt="Desarrollo del algoritmo" width="484" height="367" /></p>
<p>Definido en pseudocódigo lo podremos calcular de la siguiente manera para conectividad 4:</p>
<p><code>check node A at [0][0]</code></p>
<p>now look north, south, east, and west of this node<br />
(boundary nodes)</p>
<p>if (boundary node is a wall)<br />
ignore this node, go to next node B</p>
<p>else if (boundary node is robot location &amp;&amp; has a number in it)<br />
path found!<br />
find the boundary node with the smallest number<br />
return that direction to robot controller<br />
robot moves to that new node</p>
<p>else if (boundary node has a goal)<br />
mark node A with the number 3</p>
<p>else if (boundary node is marked with a number)<br />
find the boundary node with the smallest number<br />
mark node A with (smallest number + 1)</p>
<p>if (no path found)<br />
go to next node B at [0][1]<br />
(sort through entire matrix in order)</p>
<p>if (no path still found after full scan)<br />
go to node A at [0][0]<br />
(start over, but do not clear map)<br />
(sort through entire matrix in order)<br />
repeat until path found</p>
<p>if (no path still found &amp;&amp; matrix is full)<br />
this means there is no solution<br />
clear entire matrix of obstacles and start over<br />
this accounts for moving objects! adaptivity!</p>
<p>Os incluyo el código fuente de la variante más sencilla del algoritmo de<br />
Wavefront para que modifiqueis libremente y lo convirtais en la variante<br />
que se explica aqui.</p>
<p>&gt;<a href="http://www.societyofrobots.com/downloads/wave_front_simulation_software.zip">Codigo fuente del algortimo Wavefront</a>, cortesía de John Palmisano</p>
<p>Nos vemos!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.starcostudios.com/blog/2009/12/variante-del-algoritmo-de-brushfire-con-varios-emisores/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grafos de claridad. Algoritmo de Brushfire o Wavefront</title>
		<link>http://www.starcostudios.com/blog/2009/12/grafos-de-claridad-algoritmo-de-brushfire-o-wavefront/</link>
		<comments>http://www.starcostudios.com/blog/2009/12/grafos-de-claridad-algoritmo-de-brushfire-o-wavefront/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 14:13:09 +0000</pubDate>
		<dc:creator>Sergio Sanchez Mendez</dc:creator>
				<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Pathfinding]]></category>

		<guid isPermaLink="false">http://www.starcostudios.com/blog/?p=198</guid>
		<description><![CDATA[El algoritmo Brushfire o Wavefront para grafos de Claridad presenta dos variantes, la de un solo emisor y la de varios emisores. Veremos las dos variantes.
Los grafos de claridad representan el mundo donde se mueven los agentes como medidas al obstáculo más cercano, es decir, se abstraen del entorno generando una representación más ligera del [...]]]></description>
			<content:encoded><![CDATA[<p>El algoritmo Brushfire o Wavefront para grafos de Claridad presenta dos variantes, la de un solo emisor y la de varios emisores. Veremos las dos variantes.</p>
<p>Los grafos de claridad representan el mundo donde se mueven los agentes como medidas al obstáculo más cercano, es decir, se abstraen del entorno generando una representación más ligera del mismo y computacionalmente más apropiada. </p>
<p>Un ejemplo de grafo de claridad es el que vemos a continuación, en el se<br />
pueden apreciar las distancias al objeto no travesable más cercano. En este<br />
caso para simplificar el cálculo se divide en zeldas el mundo y se calcula a partir de<br />
aqui. Para generalizar se define una unidad de grid o generalizada, que define que tamaño tiene cada una de ellas en pixels. Las unidades usarán tambien esta medida, por ejemplo un soldado ocupará 1&#215;1 grids un tanque 2&#215;2 &#8230;etc. </p>
<p><img src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/pf1.png" alt="Grafo de claridad simple" title="Grafo de claridad simple" width="267" height="256" class="aligncenter size-full wp-image-200" /></p>
<p>Conforme la complejidad del entorno crece, se necesitan los Grafos de claridad con varios tipos de terreno,<br />
es decir, cada zelda vendrá identificada con un valor de terreno {agua/tierra/aire&#8230;etc}.</p>
<p><img src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/pfvarios-300x134.png" alt="Grafo de claridad con diferentes terrenos" title="Grafo de claridad con diferentes terrenos" width="300" height="134" class="aligncenter size-medium wp-image-202" /></p>
<p>Para calcular este grafo de claridad se emplea el algoritmo Brushfire o tambien llamado wavefront.<br />
Este algoritmo se utiliza tambien en robótica móvil para generar caminos de forma dinámica en función del entorno.<br />
De esta forma, lo que aprendeis aqui os sirve también para cualquier entorno donde podamos dividir en<br />
malla el mundo: robots moviles, juegos, aplicaciones industriales&#8230;etc. Esta variante se centra en la meta como único<br />
emisor de la &#8216;Ola&#8217;</p>
<p>Cómo calculamos la distancia a los obstaculos. Lo vemos mediante un ejemplo, en el que de momento no se tienen en cuenta los tamaños de las unidades.</p>
<p>-Primero.Creamos el mundo<br />
-Segundo. Rellenamos con los valores adecuados.<br />
-Tercero. Aplicamos el Wavefront o Brushfire</p>
<p>>1.Creando el mundo</p>
<p>Lo primero que tenemos que hacer es calcular el mallado a partir de nuestro mundo. Esto se hará<br />
como hemos comentado anteriormente definiendo el tamaño de malla y creando el entorno a partir de<br />
estos valores.</p>
<p>>2. Rellenando con valores adecuados</p>
<p>En este paso definimos un punto de inicio y otro de meta. {Start/Goal points} </p>
<p>Marcamos todos los elementos de la malla que no son obstáculos con un 0<br />
y todos los demás con un 1. El punto de meta lo marcamos con un 2, por ejemplo. </p>
<p><img src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/pf2wavefront0.png" alt="Wavefront de un solo emisor" title="Wavefront de un solo emisor" width="436" height="229" class="aligncenter size-full wp-image-203" /></p>
<p>>3. Desde la casilla de meta aplicamos la ola o el wavefront asignando a todos los<br />
valores adyacentes el valor de la casilla mas una unidad. </p>
<p><img src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/pfwavefront3.png" alt="Wavefront rellenado" title="Wavefront rellenado" width="442" height="235" class="aligncenter size-full wp-image-205" /></p>
<p>>4. Buscamos el camino recorriendo los adyacentes de la casilla desde el punto de<br />
partida siempre disminuyendo en 1 los valores. Esto hace que sobre caminos cerrados<br />
no se propague la &#8216;ola&#8217; y siempre encuentre el camino a la meta, si este existe. </p>
<p>En este caso el camino será:<br />
(0,7) -> (1,7) -> (2,7) -> (3,7) -> (4,7) -> (5,7) -> (6,7) -> (7,7)<br />
-> (8,7) -> (9,7) -> (10,7) -> (10,6) -> (11,6) -> (11,5) -> (12,5) -><br />
(12,4) -> (12,3) -> (13,3) -> (13,2) -> (14,2) -> (14,1) -> (15,1) -> (15,0)</p>
<p>Este es uno de los métodos más sencillos para aplicar pathfinding, hay otros mucho más<br />
eficientes que veremos posteriormente. Lo siguiente será ver la variante de este algoritmo donde no solo el destino genera la &#8216;Ola&#8217; sino cada obstáculo es emisor, por lo que se puede aplicar a diferentes tamaños de unidades.</p>
<p>Hasta la próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.starcostudios.com/blog/2009/12/grafos-de-claridad-algoritmo-de-brushfire-o-wavefront/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El pathfinding en los juegos de estrategia</title>
		<link>http://www.starcostudios.com/blog/2009/12/el-pathfinding-en-los-juegos-de-estrategia/</link>
		<comments>http://www.starcostudios.com/blog/2009/12/el-pathfinding-en-los-juegos-de-estrategia/#comments</comments>
		<pubDate>Sat, 05 Dec 2009 17:54:50 +0000</pubDate>
		<dc:creator>Sergio Sanchez Mendez</dc:creator>
				<category><![CDATA[Game Dev]]></category>
		<category><![CDATA[Inteligencia Artificial]]></category>
		<category><![CDATA[Pathfinding]]></category>
		<category><![CDATA[AI detección de caminos]]></category>
		<category><![CDATA[pathfinder]]></category>
		<category><![CDATA[pathfinding]]></category>

		<guid isPermaLink="false">http://www.starcostudios.com/blog/?p=172</guid>
		<description><![CDATA[
Entramos en materia en una de las ramas de la IA aplicada a los juegos que
casi siempre está presente en los juegos de actualidad. En este caso nos centramos
en los juegos de estrategia en los que independientemente de la visión que tengamos
del mundo en el que nos movemos, generalmente se puede representar por una malla
cuadrada. [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/age_of_empires_3_screen_140405.jpg" alt="Age of Empires III" title="Age of Empires III" width="455" height="342" class="aligncenter size-full wp-image-175" /></p>
<p>Entramos en materia en una de las ramas de la IA aplicada a los juegos que<br />
casi siempre está presente en los juegos de actualidad. En este caso nos centramos<br />
en los juegos de estrategia en los que independientemente de la visión que tengamos<br />
del mundo en el que nos movemos, generalmente se puede representar por una malla<br />
cuadrada.   </p>
<p>Generar una estrategia de búsqueda de caminos o pathfinding en un juego de estrategia<br />
y en general para cualquier juego, calculando teniendo en cuenta todos los píxeles o<br />
incluso a una resolución menor, a nivel interno por ejemplo mediante cálculos matemáticos<br />
es una tarea tanto ineficiente como ineficaz ya que generalmente no es necesario un nivel<br />
de precisión tan ajustado, ni siquiera a la mínima unidad que podemos medir (no calcular),<br />
el píxel. </p>
<p><img src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/starcraft2screenshot8impreciso1-300x225.jpg" alt="Starcraft II. Volumen alto de unidades  " title="Starcraft II. Volumen alto de unidades  " width="300" height="225" class="aligncenter size-medium wp-image-180" /></p>
<p>Lo adecuado en este caso es generar una malla que se situa sobre el entorno y que define<br />
las posiciones que una unidad puede ocupar. Para aumentar el realismo se puede definir<br />
un sistema de posicionamiento aleatorio que genera una posición exacta a nivel de píxel<br />
que hace que la unidad se coloque de forma aleatoria en cualquier lugar de la malla.   </p>
<p>Centrandonos en los juegos de estrategia nuestros algoritmos tendrán que tratar principalmente<br />
con dos particularidades: los diferentes tamaños de unidades y los diferentes terrenos.</p>
<p>En cuanto a los tamaños de las unidades, para simplificar y hacer más rápidos y sencillos<br />
nuestros algoritmos utilizaremos unidades enteras. De este modo una unidad militar puede tener<br />
un tamaño de 1, 2 o N. </p>
<p><img src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/grouppic.jpg" alt="Diferentes unidades" title="Diferentes unidades" width="500" height="313" class="aligncenter size-full wp-image-184" /></p>
<p>Los diferentes terrenos pueden ser por ejemplo tierra, espacio solo para unidades voladoras,<br />
agua para vehículos acuáticos o cualquier otro tipo. Los diferentes vehículos pueden no solo<br />
ceñirse a terreno, por ejemplo anfibios o aéreos.  </p>
<p><img src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/out-of-the-box-iage-of-empires-iiii-first-impressions-20051017043453002.jpg" alt="Diferentes unidades Age of Empires" title="Diferentes unidades Age of Empires" width="390" height="293" class="aligncenter size-full wp-image-185" /></p>
<p>El mundo se convierte en una malla como la que vemos a continuación donde cada posición de la<br />
estructura es una posición abarcable por las unidades, en caso de que puedan moverse por el tipo<br />
de terreno. De este modo, la representación del mundo queda definida por un conjunto de posiciones<br />
con un tipo de terreno en cada posición. Las unidades se definen además de por sus características<br />
usuales, por su capacidad para moverse por diferentes terrenos.</p>
<p>Por ejemplo.    Vehículo terrestre: Movilidad { tierra }. Marine<br />
		Vehículo marino: Movilidad { agua }. Barco<br />
		Vehículo aereo: Movilidad {agua, tierra, etc}</p>
<p><img src="http://www.starcostudios.com/blog/wp-content/uploads/2009/12/ss29-hires-300x225.jpg" alt="Vista del mallado" title="Vista del mallado" width="300" height="225" class="aligncenter size-medium wp-image-181" /></p>
<p>Una vez definidos los elementos que permiten hacer el problema abarcable y manejable, nos preocuparemos<br />
en ver que algoritmos y procedimientos nos permiten generar una trayectoria o camino válido<br />
para las posiciones de las unidades: Grafos de ckaridad, A estrella simple, A estrella anotado,<br />
algoritmo de Brushfire, Algoritmo A estrella Anotado Jerárquico. Hierarquical Anotated A Star (HAA*),<br />
Pathfinding basado en grafos de claridad y búsqueda con el Algoritmo A estrella anotado jerárquico<br />
, Planificación de caminos jerárquico para agentes de múltiples tamaños en entornos heterogéneos,<br />
Búsqueda de caminos Jerárquica Casi óptima<br />
o Pathfinding y funciones potenciales.</p>
<p>A partir de Ahora cuando vayais a comprar el pan o a hacer algun recado acordaros de dividir vuestra escena en mallas para optimizar el proceso. El procedimiento automático también es valido por eso.</p>
<p>Por lo pronto hasta aqui llegamos hoy. Lo demás lo veremos en detalle.</p>
<p>Hasta la próxima</p>
]]></content:encoded>
			<wfw:commentRss>http://www.starcostudios.com/blog/2009/12/el-pathfinding-en-los-juegos-de-estrategia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

