<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Angel "Java" Lopez : Computer Go</title><link>http://msmvps.com/blogs/lopez/archive/tags/Computer+Go/default.aspx</link><description>Tags: Computer Go</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Computer Go y Windows HPC Server</title><link>http://msmvps.com/blogs/lopez/archive/2009/02/18/computer-go-y-windows-hpc-server.aspx</link><pubDate>Wed, 18 Feb 2009 08:25:56 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1672802</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1672802</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2009/02/18/computer-go-y-windows-hpc-server.aspx#comments</comments><description>&lt;p&gt;El último año, en el&amp;nbsp;PDC 2008, el equipo de Windows HPC Server presentó un cluster de computadores jugando el juego del Go. Este video muestra la estupenda interfaz Surface que montaron:&lt;/p&gt; &lt;p&gt;(Please visit the site to view this media)&lt;/p&gt; &lt;p&gt;(Si no conocen el juego del Go, visiten:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.gobase.org"&gt;http://www.gobase.org&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Hay mucha información sobre el juego y sus reglas. Hay una sección dedicada solamente a&amp;nbsp; Computer Go:&lt;/p&gt; &lt;p&gt;&lt;a title="http://gobase.org/information/computers/" href="http://gobase.org/information/computers/"&gt;http://gobase.org/information/computers/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;)&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.smart-games.com/david.html"&gt;David Fotland&lt;/a&gt; es el autor del programa original que se muestra en el video. David es un reconocido programador de computer go. Este es el email de David, explicando este programa y su trato con la gente de Windows HPC Server:&lt;/p&gt; &lt;p&gt;&lt;a title="http://computer-go.org/pipermail/computer-go/2008-November/017025.html" href="http://computer-go.org/pipermail/computer-go/2008-November/017025.html"&gt;http://computer-go.org/pipermail/computer-go/2008-November/017025.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;(Esa es LA lista de correo a seguir, si queremos conocer más sobre el ploblema de Computer Go). David programó una solución tipo MonteCarlo, usando MPI y Windows HPC Cluster.&lt;/p&gt; &lt;p&gt;ManyFacesOfGo, el programa de Fotland, ganó el campeonato mundial de computer go, el año pasado, corriendo sobre un Windows HPC&amp;nbsp;Server cluster (&lt;a href="http://www.grappa.univ-lille3.fr/icga/tournament.php?id=181" target="_blank"&gt;ver los resultados&lt;/a&gt;). Nota: el programa que quedó segunda también se ejecutó sobre un cluster. Hay más información sobre el programa (comercial) ManyFacesOfGo en:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.smart-games.com/" href="http://www.smart-games.com/"&gt;http://www.smart-games.com/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;2008 fue un año lleno de sorpresas en el ámbito de computer go. Actualmente, los programas no pueden ganarle a un profesional o a un amateur fuerte humano, pero algo está cambiando. Pueden leer:&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.prnewswire.com/cgi-bin/stories.pl?ACCT=104&amp;amp;STORY=/www/story/04-09-2008/0004789446&amp;amp;EDATE=" target="_blank"&gt;Latest Advance in Artificial Intelligence: Computer Wins a Game Against a Go Master&lt;/a&gt;&lt;/p&gt; &lt;p&gt;y los últimos avances en la página de Wikipedia sobre Computer Go:&lt;/p&gt; &lt;p&gt;&lt;a title="http://en.wikipedia.org/wiki/Computer_Go" href="http://en.wikipedia.org/wiki/Computer_Go"&gt;http://en.wikipedia.org/wiki/Computer_Go&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Después de décadas de pobres resultados, los programas de computación comienzan a ganar a jugadores humanos, pero hay mucho por mejorar. La complejidad del juego evita el uso puro de métodos de fuerza bruto: pienso que la solución vendrá de una mezcla de fuerza bruta, clustering, Monte Carlo, y métodos más clasicos de planeamiento.&lt;/p&gt; &lt;p&gt;I tengo mi propio programa, &lt;a href="http://www.codeplex.com/ajgo" target="_blank"&gt;AjGo&lt;/a&gt;&amp;nbsp;para explorar algoritmos que puedan usar este juego fascinante, el &amp;quot;hard problem&amp;quot; en Inteligencia Artificial de juegos de tablero. Un&amp;nbsp;ejemplo de formulario de ese programa:&lt;/p&gt; &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajgomatches.png" alt="" /&gt; &lt;br /&gt;&lt;/p&gt; &lt;p&gt;Posts explicando algo del programa:&lt;/p&gt; &lt;p&gt;&lt;a title="AjGo- hacia un programa que juegue al go" href="http://msmvps.com/blogs/lopez/archive/2008/03/31/ajgo-hacia-un-programa-que-juegue-al-go.aspx"&gt;AjGo- hacia un programa que juegue al go&lt;/a&gt;&lt;br /&gt;&lt;a title="Computer Go y el programa AjGo" href="http://ajlopez.zoomblog.com/archivo/2008/03/31/computer-Go-y-el-programa-Ajgo.html"&gt;Computer Go y el programa AjGo&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Mantengo una colección de enlaces sobre Computer Go en delicious y en mi sitio personal:&lt;/p&gt; &lt;p&gt;&lt;a href="http://delicious.com/ajlopez/computergo"&gt;http://delicious.com/ajlopez/computergo&lt;/a&gt;&lt;br /&gt;&lt;a title="Computer Go links" href="http://www.ajlopez.net/Tema.php?Id=64"&gt;Computer Go links&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/en"&gt;http://www.ajlopez.com/en&lt;/a&gt;&lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1672802" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Computer+Go/default.aspx">Computer Go</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/High+Performance+Computing/default.aspx">High Performance Computing</category></item><item><title>AjGo: hacia un programa que juegue al go</title><link>http://msmvps.com/blogs/lopez/archive/2008/03/31/ajgo-hacia-un-programa-que-juegue-al-go.aspx</link><pubDate>Mon, 31 Mar 2008 00:40:43 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1562803</guid><dc:creator>lopez</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=1562803</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2008/03/31/ajgo-hacia-un-programa-que-juegue-al-go.aspx#comments</comments><description>&lt;p&gt;El hacer un programa que pueda jugar al go ha sido un problema duro de roer en el ámbito de la inteligencia artificial. Para ir explorando algunas ideas, he escrito un programa que me sirve de framework para esa investigación. Pueden descargarlo desde&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.codeplex.com/ajgo"&gt;http://www.codeplex.com/ajgo&lt;/a&gt;&lt;/p&gt; &lt;p&gt;(esté el código fuente sin tener aún un release).&lt;/p&gt; &lt;p&gt;Lo comencé a programar hace unos años, y lo presenté el año pasado, en una charla que dí en el Segundo Congreso Argentino de Go, organizado por la &lt;a href="http://www.go.org.ar" target="_blank"&gt;Asociación Argentina de Go&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Este año me invitaron de nuevo a dar la charla en el &lt;a href="http://ajlopez.zoomblog.com/archivo/2008/03/08/tercer-Congreso-Argentino-de-Go.html" target="_blank"&gt;Tercer Congreso&lt;/a&gt; (parece que no escarmentaron con la primera... ;-), y esta vez presenté más en profundidad este programa (el año pasado había estado dedicado a temas más generales, como Inteligencia Artificial, juegos y el estado del arte en Computer Go).&lt;/p&gt; &lt;p&gt;He dejado un post menos técnico, más dedicado al tema del juego que a la programación, en mi blog no técnico:&lt;/p&gt; &lt;p&gt;&lt;a href="http://ajlopez.zoomblog.com/archivo/2008/03/31/computer-Go-y-el-programa-Ajgo.html" target="_blank"&gt;Computer Go y el programa AjGo&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Hay otros programas mejores de Computer Go, pero siempre me gusta explorar por mí mismo algunos caminos, para comprender mejor el programa, y además, es más divertido... ;-). Pueden ver un programa más acabado, en la implementación de GNUGo&lt;/p&gt; &lt;p&gt;&lt;a title="GNU Go - GNU Project - Free Software Foundation (FSF)" href="http://www.gnu.org/software/gnugo/gnugo.html"&gt;GNU Go - GNU Project - Free Software Foundation (FSF)&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="GNU Go - Wikipedia, the free encyclopedia" href="http://en.wikipedia.org/wiki/GNU_Go"&gt;GNU Go - Wikipedia, the free encyclopedia&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a title="Sensei&amp;#39;s Library- GNU Go" href="http://senseis.xmp.net/?GNUGo"&gt;Sensei&amp;#39;s Library- GNU Go&lt;/a&gt;&lt;/p&gt; &lt;h3&gt;El AjGo&lt;/h3&gt; &lt;p&gt;Está escrito en C# (antes lo había escrito en VBNet, pero preferí reescribirlo en C# para aprovechar algunos temas de refactoring, y con la esperanza de portarlo a otras plataformas más fácilmente, si a alguien le interesa).&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajgoformdesign.png" alt="" /&gt; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;La solución consta de tres proyectos:&lt;/p&gt; &lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.ajlopez.com/images/articles/ajgosolution.png" align="left" alt="" /&gt; &lt;/p&gt; &lt;p&gt;El proyecto &lt;strong&gt;AjGo&lt;/strong&gt; es una librería de clases donde está codificado el &amp;quot;core&amp;quot; del sistema. &lt;/p&gt; &lt;p&gt;El proyecto &lt;strong&gt;AjGo.Test&lt;/strong&gt; es una serie de test automatizados usando NUnit, que me ha resultado de gran ayuda en la exploración de alternativas de programación. Cada vez que necesitaba escribir alguna funcionalidad nueva, siguiendo los preceptos de Test Driven Development, escribía primero el test, y luego el código que lo cumplía. Tengo todavía dos test en &amp;quot;rojo&amp;quot;, pero que no afectan a la funcionalidad actual del programa.&lt;/p&gt; &lt;p&gt;El proyecto &lt;strong&gt;AjGo.WinForm&lt;/strong&gt; es el que permite probar interactivamente el programa. La idea es colgar desde ese proyecto un formulario windows que me permita probar en el momento, la efectividad de algunos algoritmos y estrategias.&lt;/p&gt; &lt;p&gt;Si lanzan el proyecto de test, pueden ejecutarlo directamente. He colocado que, aunque sea un proyecto de librería de clases, igualmente ejecute el NUnit, necesitarán el NUnit instalado en alguna parte de su entorno de ejecución. Bajarlo de&lt;/p&gt; &lt;p&gt;&lt;a title="NUnit - Home" href="http://www.nunit.org/"&gt;NUnit - Home&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Para conseguir que ese proyecto pueda lanzarse en modo de ejecución, deben modificar las propiedades del proyecto de test:&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajgonunit.png" alt="" /&gt; &lt;/p&gt; &lt;p align="left"&gt;Si lo ejecutan, lanza la interface GUI del NUnit:&lt;/p&gt; &lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajgonunitrun.png" alt="" /&gt; &lt;/p&gt; &lt;h3&gt;Detalles de implementación&lt;/h3&gt; &lt;p&gt;Hay varias clases interesantes de comentar incluidas en el proyecto AjGo,&amp;nbsp;quisiera hoy ocuparme brevemente de algunas. &lt;/p&gt; &lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;" src="http://www.ajlopez.com/images/articles/ajgoproject.png" align="left" alt="" /&gt; Para los que conocen el juego, verán que están implementados los conceptos de:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Color&lt;/li&gt; &lt;li&gt;Position&lt;/li&gt; &lt;li&gt;Game&lt;/li&gt; &lt;li&gt;Group&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Desde el año pasado estoy estudiando el tema de usar, aparte de color blanco y negro, otros colores para evaluar una posición.&lt;/p&gt; &lt;p&gt; &lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:a6b1868b-edb7-4e58-8060-dc5ee98c3f74" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;enum&lt;/span&gt;&lt;span style="color:#000000;"&gt; Color
    {
        Empty &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        Black &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;1&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        White &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;2&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        Border &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;3&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        Blue &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;4&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        Red &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;5&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        Green &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;6&lt;/span&gt;&lt;span style="color:#000000;"&gt;,
        Yellow &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#000000;"&gt;7&lt;/span&gt;&lt;span style="color:#000000;"&gt;
    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Verán que tengo entonces una enumeración que abarca otros colores, a explicar más abajo. Está incluido también el color &amp;quot;vacío&amp;quot; y el color &amp;quot;borde&amp;quot;.&lt;/p&gt;
&lt;p&gt;La clase &lt;strong&gt;Point&lt;/strong&gt; representa un lugar en el tablero:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:6270b568-e6cb-4192-812f-4b5d405d3cf5" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Point
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;short&lt;/span&gt;&lt;span style="color:#000000;"&gt; X;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;short&lt;/span&gt;&lt;span style="color:#000000;"&gt; Y;
&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;La clase &lt;strong&gt;Move&lt;/strong&gt; es una combinación de &lt;strong&gt;Color&lt;/strong&gt; y &lt;strong&gt;Point&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:2b83c9c5-24e2-4fcb-aee6-1a1931c3420d" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Move
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; Color Color;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; Point Point;

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; Move(&lt;/span&gt;&lt;span style="color:#0000FF;"&gt;short&lt;/span&gt;&lt;span style="color:#000000;"&gt; x, &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;short&lt;/span&gt;&lt;span style="color:#000000;"&gt; y, Color c)
        {
            Color &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; c;
            Point &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; Point(x, y);
        }
...
    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;La clase &lt;strong&gt;Position&lt;/strong&gt; describe una posición de juego (la posición puede tener un ancho y alto a determinar en ejecución):&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:23ed6df0-3e5d-4a6b-84a7-e4caa2752b32" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Position
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;short&lt;/span&gt;&lt;span style="color:#000000;"&gt; width;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;short&lt;/span&gt;&lt;span style="color:#000000;"&gt; height;

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; Color[,] cells;

        ...
    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;La clase &lt;strong&gt;Game&lt;/strong&gt; es una de las más complejas, representa una posición, distintas evaluaciones, lista de movidas, y una cuenta hasta el momento de las piedras muertas por color:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:41ee558d-832a-43b4-b678-f679f4d3dae0" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Game
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; Position position;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Move&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; moves;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; GroupPosition groupposition;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; Position coloredposition;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; GroupPosition coloredgroupposition;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; ColorCount colorcount;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; deadblacks;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;int&lt;/span&gt;&lt;span style="color:#000000;"&gt; deadwhites;
        ...
    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;La clase &lt;strong&gt;PointSet&lt;/strong&gt; implementa un conjunto de puntos. Como conjunto no permite la repetición de puntos. Para comparar por igualdad instancias de &lt;strong&gt;Point&lt;/strong&gt; se reimplementó el &lt;strong&gt;Equals&lt;/strong&gt; y &lt;strong&gt;GetHashCode&lt;/strong&gt; en esa clase. Hay métodos de clase para calcular intersección, unión y diferencia de conjuntos de puntos:&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:3e9decb4-ca5a-47d0-9f52-5c28f6c44798" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; PointSet
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;protected&lt;/span&gt;&lt;span style="color:#000000;"&gt; List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Point&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; points &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Point&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;();

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; PointSet Union(PointSet ps1, PointSet ps2)
        {
            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; PointSet(ps1, ps2);
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; PointSet Intersect(PointSet ps1, PointSet ps2)
        {
            PointSet ps &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; PointSet();

            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt; (Point pt &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; ps1.Points)
                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (ps2.Points.Contains(pt))
                    ps.Add(pt);

            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; ps;
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;static&lt;/span&gt;&lt;span style="color:#000000;"&gt; PointSet Difference(PointSet ps1, PointSet ps2)
        {
            PointSet ps &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; PointSet();


            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;foreach&lt;/span&gt;&lt;span style="color:#000000;"&gt; (Point pt &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;in&lt;/span&gt;&lt;span style="color:#000000;"&gt; ps1.Points)
                &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;if&lt;/span&gt;&lt;span style="color:#000000;"&gt; (&lt;/span&gt;&lt;span style="color:#000000;"&gt;!&lt;/span&gt;&lt;span style="color:#000000;"&gt;ps2.Points.Contains(pt))
                    ps.Add(pt);

            &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; ps;
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; PointSet()
        {
        }

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; PointSet(PointSet ps)
        {
            Add(ps);
        }
        ...
    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Una extensión de &lt;strong&gt;PointSet&lt;/strong&gt; es la clase&amp;nbsp;&lt;strong&gt;Group&lt;/strong&gt;, que además de un conjunto de puntos, tiene &lt;strong&gt;Color&lt;/strong&gt; asociado:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:9397cf91-b650-40d5-9f00-7f2ec32f16cd" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; Group : PointSet
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; PointSet liberties &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; PointSet();
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; Color color;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; GroupPosition groupposition;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; GroupSet neighbours;
        ...
    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Luego de &lt;strong&gt;Game&lt;/strong&gt;, la clase más importante para la actual implementación es &lt;strong&gt;GroupPosition&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;
&lt;div class="wlWriterSmartContent" id="57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:1038670e-3eab-4a40-973f-7a669334adff" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;pre style="background-color:White;"&gt;&lt;div&gt;&lt;span style="color:#000000;"&gt;    &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;class&lt;/span&gt;&lt;span style="color:#000000;"&gt; GroupPosition
    {
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; Position position;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; groups;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; Group[,] groupmap;
        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;private&lt;/span&gt;&lt;span style="color:#000000;"&gt; List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;GroupSet&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt; zones;

        &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;public&lt;/span&gt;&lt;span style="color:#000000;"&gt; GroupPosition(Position pos)
        {
            position &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; pos;
            groups &lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000FF;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; List&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Group&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;();
        }
        ...
    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Con instancias de esta clase, se calculan los grupos de piedras (cadenas de piedras conectadas), sus fronteras, vecinos, y zonas (grupos de grupos, de colores asociados, más sobre colores y zonas más adelante).&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h3&gt;El Programa&lt;/h3&gt;
&lt;p&gt;Al ejecutar el tercer proyecto AjGo.WinForm aparece la ventana de prueba:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajgoemptyboard.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Con las opciones de Stone de la izquierda, se pueden ir colocando piedras de los colores blanco y negro. Una de las opciones del programa es sugerir posibles movidas, en base a patrones de jugadas que tiene en archivos de texto del directorio Matches del proyecto:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajgomatches.png" alt="" /&gt; &lt;/p&gt;
&lt;p align="left"&gt;La &lt;/p&gt;
&lt;p align="left"&gt;Con el botón de Colors se puede evaluar una posición &amp;quot;en colores&amp;quot;:&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajgocolors.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;Como explico en mi post de mi post no técnico:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ajlopez.zoomblog.com/archivo/2008/03/31/computer-Go-y-el-programa-Ajgo.html" target="_blank"&gt;Computer Go y el programa AjGo&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Los puntos azules corresponden a puntos bajo la influencia negra, los amarillos están bajo el dominio blanco, los rojos están en disputa, y los verdes están en principio libres. 
&lt;p&gt;Una cadena de piedras conectadas, en AjGo se denomina grupo. Un conjunto de piedras negras &amp;quot;sumergidas&amp;quot; en un mar de piedras azules, es una zona negra. Lo mismo con piedras blancas y puntos amarillos. 
&lt;p&gt;He visto que para la evaluación de territorios, ojos, vida, y otros, conviene tomar en consideración la zona más que un grupo aislado (no lo sabía cuando le puse estos nombres, pero en GNUGo se llama cadena a lo que en AjGo llamo grupo, y se llama grupo a lo que en mi programa llamo zona). 
&lt;p&gt;En base a los colores, se pueden plantear distintos evaluaciones y objetivos. Una zona negra que no tengan ojos posibles o reales, está sin vida &amp;quot;eterna&amp;quot;. Una zona que no esté en contacto con una zona verde, está rodeada, y si no tiene perspectivas de formar ojos, está en peligro. 
&lt;p&gt;Extender una zona, es aumentar su tamaño. 
&lt;p&gt;Conectar una zona, es fusionarla con otra del mismo color. 
&lt;p&gt;Rodear a una zona, es desconectarla de zonas verdes (disminuir lo que llamo &amp;quot;vida verde&amp;quot;). 
&lt;p&gt;El programa igualmente contempla que una zona verde que en su frontera sólo tenga puntos azules, es considerada un &amp;quot;ojo verde&amp;quot; (controlado por piedras negras). Uno de las evaluaciones que estoy probando pondera que una zona verde es tal porcentaje &amp;quot;blanca&amp;quot; y tal otro porcentaje &amp;quot;negra&amp;quot; en base a la cantidad de puntos azules, amarillos y rojos de su frontera.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Hay más detalles relacionados con el juego en ese post.&lt;/p&gt;
&lt;p&gt;Tengo que&amp;nbsp;mejorar varios puntos. Uno importante, son los algoritmos que tengo implementados para buscar en un árbol de jugadas. Otro, son las clases que evalúan una posición en forma estática. Ambos están en directorios del proyecto AjGo. Estos son los &amp;quot;Agents&amp;quot; de búsqueda en árbol:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="center"&gt;&lt;img src="http://www.ajlopez.com/images/articles/ajagents.png" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Trabajo futuro&lt;/h3&gt;
&lt;p&gt;Hay mucho para hacer. Me gustaría terminar de pulir la exploración de árbol, la resolución de problemas de vida y muerte, tener un planeador con objetivos, evaluadores estáticos de posición, evaluadores tácticos con exploración de árbol, parámetros variables, algoritmos genéticos.... Bueno, son muchas cosas. Hay que ir paso a paso. Creo que lo primero va&amp;nbsp;a ser mejorar el tema de recorrido de árbol. Vendrán más posts con algunos detalles más finos sobre la implementación actual.&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1562803" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Inteligencia+Artificial/default.aspx">Inteligencia Artificial</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Computer+Go/default.aspx">Computer Go</category></item><item><title>Computer Go en el Segundo Congreso Argentino de Go</title><link>http://msmvps.com/blogs/lopez/archive/2007/03/28/computer-go-en-el-segundo-congreso-argentino-de-go.aspx</link><pubDate>Wed, 28 Mar 2007 12:03:34 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:720515</guid><dc:creator>lopez</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=720515</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2007/03/28/computer-go-en-el-segundo-congreso-argentino-de-go.aspx#comments</comments><description>&lt;p&gt;La &lt;a href="http://www.go.org.ar"&gt;Asociación Argentina de Go&lt;/a&gt; celebra este próximo fin de semana el Segundo Congreso de Go&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.go.org.ar/page.php?name=congreso2007" href="http://www.go.org.ar/page.php?name=congreso2007"&gt;http://www.go.org.ar/page.php?name=congreso2007&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Hay actividades desde el viernes al lunes. El viernes, habrá una charla sobre Computer Go, recuerden que el Go es el &lt;a href="http://msmvps.com/blogs/lopez/archive/2007/01/15/computer-go-el-gran-problema-de-ai.aspx"&gt;gran desafío de la Inteligencia Artificial&lt;/a&gt;, en juegos.&lt;/p&gt; &lt;p&gt;En esa charla, presentaré cuál es la historia del Computer Go, su estado actual, algoritmos intentados, probaremos algún programa, y discutiremos cuál podría ser el camino a tomar para un programa que venza finalmente a un simple humano.... :-)&lt;/p&gt; &lt;p&gt;Nos leemos!&lt;/p&gt; &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=720515" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/Inteligencia+Artificial/default.aspx">Inteligencia Artificial</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Computer+Go/default.aspx">Computer Go</category></item><item><title>Computer Go: El gran problema de AI</title><link>http://msmvps.com/blogs/lopez/archive/2007/01/15/computer-go-el-gran-problema-de-ai.aspx</link><pubDate>Mon, 15 Jan 2007 01:01:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:492818</guid><dc:creator>lopez</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/lopez/rsscomments.aspx?PostID=492818</wfw:commentRss><comments>http://msmvps.com/blogs/lopez/archive/2007/01/15/computer-go-el-gran-problema-de-ai.aspx#comments</comments><description>&lt;p&gt;Desde hace algunos años, estoy interesado en algunas ramas de lo que se llama Inteligencia Artificial. Convengamos que el término es algo ampuloso, y refleja el entusiasmo de fines de los años 50, cuando en una reunión de especialista se acuñó el término. La Artificial Intelligence o AI ha pasado por varias etapas y viscisitudes, ha habido de todo, desde triunfos&amp;nbsp;y fracasos, hasta ramas nuevas (agentes, redes neuronales, aprendizaje automático) que han ido apareciendo. Realmente es un tema fascinante, pero tal vez demasiado amplio.&lt;/p&gt;
&lt;p&gt;Pueden ver algunos enlaces desordenados que colecciono en&lt;/p&gt;
&lt;p&gt;&lt;a title="http://www.ajlopez.com/ia/" href="http://www.ajlopez.com/ia/"&gt;http://www.ajlopez.com/ia/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;He mantenido, de alguna manera, el interés en una rama: su aplicación a los juegos. Pueden visitar el excelente sitio del grupo GAMES de la Universidad de Alberta (Canadá):&lt;/p&gt;
&lt;p&gt;&lt;a title="http://www.cs.ualberta.ca/~games/" href="http://www.cs.ualberta.ca/~games/"&gt;http://www.cs.ualberta.ca/~games/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;para encontrar mayor información, estupenda. Si Uds. investigan un poco, encontrarán que a lo largo de todos estos años, hay un juego que ha resistido las distintas aproximaciones que se han intentado para dominarlo. Pueden encontrar más información sobre el juego en el sitio de la Asociación Argentina de Go:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.go.org.ar/"&gt;http://www.go.org.ar/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;en especial, el ya clásico artículo del bueno de Franklin Bassarsky:&lt;/p&gt;
&lt;p&gt;Por qué Aprender a jugar al Go&lt;br /&gt;&lt;a title="http://www.go.org.ar/actividades/porque.html" href="http://www.go.org.ar/actividades/porque.html"&gt;http://www.go.org.ar/actividades/porque.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Mientras que Deep Blue el siglo pasado derrotó a Kasparov,&amp;nbsp;en ajedrez, el mejor programa de go del planeta apenas si puede enfrentar a un verdadero experto en el juego.&amp;nbsp;Para conocer más sobre la situación actual, visitar el interminable y subyugante&lt;/p&gt;
&lt;p&gt;&lt;a title="http://gobase.org/" href="http://gobase.org/"&gt;http://gobase.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En los últimos años, ha surgido el wiki&lt;/p&gt;
&lt;p&gt;&lt;a title="http://senseis.xmp.net/" href="http://senseis.xmp.net/"&gt;http://senseis.xmp.net/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;donde encontrarán múltiples temas tratados, por ejemplo&lt;/p&gt;
&lt;p&gt;&lt;a title="http://senseis.xmp.net/?ComputerGoProgramming" href="http://senseis.xmp.net/?ComputerGoProgramming"&gt;http://senseis.xmp.net/?ComputerGoProgramming&lt;/a&gt;&lt;br /&gt;&lt;a title="http://senseis.xmp.net/?ComputerGoAlgorithms" href="http://senseis.xmp.net/?ComputerGoAlgorithms"&gt;http://senseis.xmp.net/?ComputerGoAlgorithms&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Un clásico es el algoritmo de Benson (solo como botón de muestra de cómo apareció hace años, y luego han ido apareciendo otras ideas para explicar y acercar el Go a la AI):&lt;/p&gt;
&lt;p&gt;&lt;a title="http://senseis.xmp.net/?BensonsAlgorithm" href="http://senseis.xmp.net/?BensonsAlgorithm"&gt;http://senseis.xmp.net/?BensonsAlgorithm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;También como botón de muestra de la cantidad de &amp;quot;papers&amp;quot; que mueve el tema, ver&lt;/p&gt;
&lt;p&gt;&lt;a title="http://erikvanderwerf.tengen.nl/publications.html" href="http://erikvanderwerf.tengen.nl/publications.html"&gt;http://erikvanderwerf.tengen.nl/publications.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;LA lista de correo sobre el tema es:&lt;/p&gt;
&lt;p&gt;computer-go mailing list&lt;br /&gt;&lt;a href="mailto:computer-go@computer-go.org"&gt;computer-go@computer-go.org&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.computer-go.org/mailman/listinfo/computer-go/"&gt;http://www.computer-go.org/mailman/listinfo/computer-go/&lt;/a&gt; 
&lt;p&gt;Se imaginaran entonces, que no puede faltar.... el AjGo. Sí, estoy pasando a .NET algunas ideas. La principal es concentrarme primero en planes, que traten de cumplir con 4 objetivos básicos: 
&lt;p&gt;- Aumentar el territorio propio&lt;br /&gt;- Disminuir el territorio enemigo&lt;br /&gt;- Asegurar la vida de las piedras propias&lt;br /&gt;- Capturar piedras enemigas 
&lt;p&gt;Hace unos años investigué distintas formas de calcular la influencia y territorio, basado en conceptos que todos en computer go tratan alguna vez: &amp;quot;iluminación&amp;quot;, &amp;quot;campos de fuerza&amp;quot;.... En este nuevo intento, he visto que es más interesante simplemente separar en grupos, usando para visualizar el resultado distintos colores. Un ejemplo (una posición algo ridícula para un juego real, pero interesante para mí) es: 
&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles/board1.jpg" alt="" /&gt; 
&lt;p&gt;Podría explicar un poco más en detalle el coloreo, pero basta decir que los azules indican cercanía a piedra negra, los rojos cercanía a piedra blanca, amarillo cercanía a ambos colores, verde libre de cercanía. Los cuatro objetivos básicos los puedo expresar en deltas en esos coloreos. Me parece que el concepto de grupo coloreado, y su aumento o disminución,&amp;nbsp;es un camino interesante&amp;nbsp;a explorar. Por ejemplo, rodear a un grupo enemigo es, en principio, asimilable a &amp;quot;disminuir&amp;nbsp;sus verdes&amp;quot;, los verdes que estan en contacto con ese grupo. 
&lt;p&gt;Supongo que alguien ya lo habrá seguido, pero de alguna forma, con esto estoy aprendiendo sobre la dificultad del problema.&amp;nbsp;Tengo que analizar la táctica a seguir para cumplir con cada plan sugerido. Igualmente, algo de algoritmo de sisho generalizado está siendo incorporado. Falta la hercúlea tarea de resolver: 
&lt;p&gt;- Tácticas de corte&lt;br /&gt;- Tácticas de conexión&lt;br /&gt;- Tácticas de vida y muerte 
&lt;p&gt;Espero poder postear algo interesante cuando tenga algo más armado, código incluído. 
&lt;p&gt;Nos leemos! 
&lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez&lt;br /&gt;&lt;a href="http://www.ajlopez.com/"&gt;http://www.ajlopez.com/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=492818" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/lopez/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Inteligencia+Artificial/default.aspx">Inteligencia Artificial</category><category domain="http://msmvps.com/blogs/lopez/archive/tags/Computer+Go/default.aspx">Computer Go</category></item></channel></rss>