Anda di halaman 1dari 19

Algoritmos y Programación en Robocode

Julio René Santizo Ochoa - 200511763


juliosantizo@gmail.com
Ing Huber Flores

Guatemala, Guatemala
Universidad de San Carlos
Facultad de Ingenierı́a
Escuela de Ciencias y Sistemas
1 de julio de 2009

Resumen
En este articulo tocamos temas un poco mas avanzados sobre la
programación de robots en Robocode, se empieza con una introcucción
conceptual a ciertos temas de inteligencia artificial, posteriormente
se presentan las diferentes opciones de estrategias que tenemos para
programar nuestro robot en Robocode, sus ventejas y desventas y
los escenarios donde deberiamos utilizarlas y finalmente se explica
detalladamente la estrategia y algoritmos utilizados para el robot que
se entregará como proyecto del curso.

Abstract
This article describes things a little more advanced on the pro-
gramming of robots in Robocode, it starts with an introduction to
certain subjects of artificial intelligence, then describes the different
options of strategies available to program our robot in Robocode, its
advantages and disadvantages and the scenes where we would have
to use them and finally explains in detail the strategy and algorithms
used for the robot that will be the final project of the course.

1
1 Introducción
Robocode es una plataforma de simulación bastante completa y realista y
esto afecta de cierta manera a la programación del robot, porque por ejem-
plo, debemos tomar en cuenta que el cañón del arma se calienta con cada
disparo, impidiéndonos disparar como locos sin parar, otro aspecto, es que las
balas viajan a una velocidad constante, por lo que debemos tener en cuenta
el tiempo que tardará en llegar al objetivo, si este se encuentra muy lejos,
también perdemos cierta energı́a con cada disparo por lo que no deberı́amos
desperdiciarlos, sino que tratar de atinarle al objetivo.
Todo esto influye bastante en la estrategia que implementemos para ganar,
a continuación se presenta una descripción breve de algunos algoritmos de
inteligencia artificial que podrı́an ser aplicados a la programación de nuestro
robot, no se presentan ejemplos, ni explicaciones detalladas de su funciona-
miento, porque eso se sale del alcance de este articulo, pero si se da una
descripción bastante clara de ellos.

2 Inteligencia Artificial

Se denomina inteligencia artificial a la rama de la ciencia informática dedi-


cada al desarrollo de agentes racionales no vivos.[1]
En este sentido, vemos que Robocode es una aplicación muy adecuada para
el curso de inteligencia artificial, ya que el objetivo es crear robots que sepan
qué hacer en el momento adecuado.

2
2.1 Aplicaciones
Algunas aplicaciones de la inteligencia artificial son:
Data Mining
Medicina
Procesamiento de lenguaje natural
Robótica
Sistemas de apoyo a la decisión
Videojuegos

2.2 Algoritmos
Un algoritmo es una lista bien definida, ordenada y finita de operaciones que
permite hallar la solución a un problema.[2]

2.2.1 Algoritmos genéticos


Son llamados ası́ porque se inspiran en la evolución biológica. Estos algorit-
mos hacen evolucionar una población de individuos sometiéndola a mutacio-
nes.
Los algoritmos genéticos establecen una analogı́a entre el conjunto de so-
luciones de un problema, llamado fenotipo, y el conjunto de individuos de
una población natural, codificando la información de cada solución en una
cadena, generalmente binaria, llamada cromosoma. Los sı́mbolos que forman
la cadena son llamados los genes. Cuando la representación de los cromo-
somas se hace con cadenas de dı́gitos binarios se le conoce como genotipo.
Los cromosomas evolucionan a través de iteraciones, llamadas generaciones.
En cada generación, los cromosomas son evaluados usando alguna medida de
aptitud. Las siguientes generaciones (nuevos cromosomas), llamada descen-
dencia, se forman utilizando dos operadores genéticos, de sobrecruzamiento
y de mutación.[3]
Este tipo de algoritmo puede llegar a ser muy útil en Robocode, tanto pa-
ra hacer movimientos inteligentes y ası́ evitar los disparos de los enemigos,
ası́ como para decidir el angulo del disparo para que sea acertado.

2.2.2 Redes Neuronales


También son conocidas como ANN por sus siglas en inglés. Son un paradig-
ma de aprendizaje y procesamiento automático inspirado en la forma en que

3
funciona el sistema nervioso de los animales. Se trata de un sistema de in-
terconexión de neuronas en una red que colabora para producir un estı́mulo
de salida.
El objetivo es conseguir que las máquinas den respuestas similares a las que
es capaz de dar el cerebro que se caracterizan por su generalización y su
robustez.
Una red neuronal se compone de unidades llamadas neuronas. Cada neurona
recibe una serie de entradas a través de interconexiones y emite una salida.
Esta salida viene dada por tres funciones, la función de propagación, la fun-
ción de activación y la función de transferencia.[4]
Este tipo de algoritmo puede utilizarse en Robocode, para aprender sobre
el movimiento de los enemigos, predecir hacia donde se moverán y de esta
manera poder disparar al lugar correcto, para que le pegue la bala.

2.2.3 Arboles de Decisión


Es una técnica que permite analizar decisiones secuenciales basada en el uso
de resultados y probabilidades asociadas. Los árboles de decisión se pueden
usar para generar sistemas expertos.[5]
Esta técnica puede ser utilizada en Robocode, para decidir la potencia del
disparo, dependiendo de la energı́a que tenga el robot enemigo, y ası́ no
desperdiciar energı́a nuestra, y también dependiendo de la energı́a que tenga
nuestro robot y ası́ no perder tanta energı́a si ya no disponemos de mucha.

2.2.4 Sistemas Expertos


Estos sistemas imitan las actividades de un humano para resolver problemas
de distinta ı́ndole. También se dice que un sistema experto se basa en el
conocimiento declarativo, es decir, hechos sobre objetos concretos.[6]
Este tipo de sistema o programación puede ser utilizada en Robocode, para
decidir con que potencia disparar, dependiendo de la distancia del enemigo,
ası́ como la velocidad y el angulo en el que se esté moviendo.

2.2.5 Clustering
Es un procedimiento de agrupación de una serie de vectores según criterios
habitualmente de distancia; se tratará de disponer los vectores de entrada de
forma que estén más cercanos aquellos que tengan caracterı́sticas comunes.
Un algoritmo de clustering permite extraer representantes de un conjunto de

4
datos, que pueden ser posteriormente usados para transmisión, para elimi-
nación de ruido o con una fase posterior de calibración, para clasificación de
vectores en diferentes conjuntos.[7]

2.2.6 Vecino más cercano


Es un método de clasificación no paramétrico, que estima el valor de la fun-
ción de densidad de probabilidad o directamente la probabilidad de que un
elemento X pertenezca a la clase Cj a partir de la información proporcionada
por el conjunto de prototipos. En el proceso de aprendizaje no se hace nin-
guna suposición acerca de la distribución de las variables predictivas.[8]
Este algoritmo puede ser utilizado en Robocode, para poder predecir el
patrón de movimiento del robot enemigo y de esa manera, disparar acer-
tado.

3 Estrategias
En Robocode, se pueden diferenciar dos tipos en los que se pueden clasificar
las estrategias de los robots, estos son, las estrategias para pelear uno a uno,
y las estrategias para pelear contra un grupo de robots.

3.1 Estrategias uno a uno


Este tipo de estrategias son mucho mas sencillas que las estrategias para pe-
lear contra un grupo de robots, la gran diferencia es que solamente tenemos
un único enemigo, entonces predecir su posición futura para disparar ahı́, es
mucho mas sencilla.[9]
Debemos poner especial atención en la estrategia de movimiento que tenga-
mos ası́ como en la estrategia de apuntar y disparar, porque básicamente eso
es lo que define el rumbo de la batalla, que tan acertado le disparemos y
que tanto podamos hacernos los quites de los disparos que el haga en contra
nuestra.

5
3.2 Estrategias todos contra todos
Según los expertos, en Robocode una de las grandes desventajas que podemos
llegar a tener en un combate, es la posición inicial[10], si esta es muy cerca de
algún otro robot, por lo cual debemos asegurarnos que nuestro robot será el
primero en disparar en este tipo de casos y ası́ poder tener él la ventaja y
mayores probabilidades de vencer al otro robot y quedar vivo.
Para asegurarnos eso, yo lo que hice en mi robot, fue poner en la primera linea
del método run() que es el que se ejecuta al principio, una llamada al método
scan() de esta manera mi robot se dará cuenta que tiene un robot cerca, e
iniciará con su estrategia de disparo contenida en el método onScannedRobot.
En este tipo de combate, algo que puede favorecernos mucho, es que los
demás robots se ataquen unos a otros sin involucrarnos nosotros, para esto
lo que podemos hacer es usar una estrategia de movimiento randomico, la
cual será descrita mas adelante en el articulo.

6
3.3 Estrategias para detectar con el radar
Los expertos de Robocode, afirman que existen un gran numero de estrategias
para hacer mas eficiente y efectivo el uso del radar, como por ejemplo el giro
de radar infinito, esta técnica consiste en poner a girar el radar un numero
muy grande de grados, de manera que en toda la batalla, nunca se detenga
de girar y ası́ podrá ir detectando todos los robots enemigos. Esta técnica se
puede hacer mediante la siguiente linea:

turnRadarRightRadians(Double.POSITIVE INFINITY);

Esta es la técnica que utilizo yo para el radar de mi robot, porque mi robot es


muy potente para disparar y dispara bastante acertado, por la técnica para
apuntar y dispar que utilizo, la cual sera descrita mas adelante en ese mismo
articulo.
Otra estrategia, es hacer un lock de radar sobre un enemigo, es decir, hacer
que el radar siga al enemigo por donde se mueva, esta técnica es muy útil en

7
combates uno a uno y no en combates en grupo, porque ası́ podremos seguir
el rastro del robot enemigo y dispararle constantemente hasta matarlo, exis-
ten muchas formas de hacer este lock de radar como por ejemplo el Narrow
Lock, el cual consiste en hacer girar el radar infinitamente y al escanear un
robot, girarlo a su posición y al volverlo a escanear, volverá a girar hacia el
enemigo y ası́ sucesivamente, el codigo para ese lock seria el siguiente.
public void run() {
turnRadarRightRadians(Double.POSITIVE INFINITY);
do {
scan();
} while (true);
}
public void onScannedRobot(ScannedRobotEvent e) {
double radarTurn = getHeadingRadians() + e.getBearingRadians() -
getRadarHeadingRadians();
setTurnRadarRightRadians(Utils.normalRelativeAngle(radarTurn));
}

A la hora de detectar un robot enemigo, Robocode puede proveernos mu-


cha información sobre el, y serı́a muy útil disponer de toda esta información
siempre, incluso tener información histórica, alguna de la información que
podemos almacenar seria: posición, dirección, velocidad lineal, velocidad an-
gular, todo esto puede servirnos para identificar patrones de movimiento.
Que tanto daño le hemos hecho, eso puede ser muy útil para saber que a
que robot se nos hace mas fácil hacerle daño y de esa manera dispararle a él.
El código para detectar esta información es el siguiente dentro del metodo
onScannedRobot()
e.getDistance();
e.getHeadingRadians();
e.getEnergy();
e.getVelocity();

3.4 Estrategias para apuntar y disparar


Esta estrategia es la mas importante probablemente y es donde debemos
invertir mas tiempo que en todo el resto de nuestro robot. El problema, es
que cuando detectamos un robot enemigo, no podemos disparar a la posición
donde lo detectamos, porque en lo que llaga la bala, seguramente se moverá y

8
la no le dará.
Debido a esto el gran problema para apuntar y disparar es saber donde
estará el robot cuando la bala llegue ahı́ de manera que le atine el disparo,
se escucha sencillo pero puede llegar a ser sumamente complicado. Algunas
estrategias para predecir la posición del robot enemigo son:

3.4.1 Predicción linear


Esta estrategia es bastante fácil de implementar y es sencilla, pero puede ser
muy útil si los robots contrincantes se mueven la mayorı́a del tiempo en linea
recta. Esta estrategia consiste en detectar la orientación y la velocidad lineal
que lleva el robot de manera de disparar mas adelante de donde esta, para
que cuando la bala llegue, el llegue a ese punto también y le demos. Una
implementación podrı́a ser:
double absoluteBearing = getHeadingRadians() + e.getBearingRadians();
setTurnGunRightRadians(Utils.normalRelativeAngle(absoluteBearing
-
getGunHeadingRadians() + (e.getVelocity() * Math.sin(e.getHeadingRadians()
-
absoluteBearing) / 13.0)));
setFire(3.0);

3.4.2 Prediccion Circular


Esta estrategia de predicción es similar a la anterior, con la diferencia que
en esta estrategia se toma en cuenta el giro que va dando el robot, es un
poco mas complicada matemáticamente, pero su implementación es igual de
sencilla que la anterior. Un ejemplo de su implementación serı́a:
while ((++deltaTime) * (20.0 - 3.0 * bulletPower) <
Point2D.Double.distance(myX, myY, predictedX, predictedY)) {
predictedX += Math.sin(enemyHeading) * enemyVelocity;
predictedY += Math.cos(enemyHeading) * enemyVelocity;
enemyHeading += enemyHeadingChange;
if (predictedX <18.0 || predictedY <18.0 || predictedX >battleFieldWidth
-
18.0 || predictedY >battleFieldHeight - 18.0) {
predictedX = Math.min(Math.max(18.0, predictedX),
battleFieldWidth - 18.0);

9
predictedY = Math.min(Math.max(18.0, predictedY),
battleFieldHeight - 18.0);
break;
}
}

3.4.3 Predicción por patrones


Esta es una de las estrategias de predicción de la posición futura de los
enemigos mas efectiva, porque va guardando velocidad angular, dirección
y velocidad linear de los enemigos y luego compara estas estrategias para
disparar. El problema con esta estrategia es que en combates muchos contra
muchos, tendrı́a que guardar patrones de cada robot y dependiendo del robot
detectado, utilizar un conjunto diferente de patrones, esto complica un poco
la implementación, pero en combates uno contra uno es sumamente efectiva,
porque todos los patrones pertenecen al mismo robot y se tiene bastante in-
formación.
Esta es la estrategia que utilizo yo combinada con la estrategia de disparar
al enemigo mas cercano. Una implementación de esta estrategia de apuntar
y disparar seria:
pattern.insert(0, (char) (int) (e.getVelocity() * Math.sin(e.getHeadingRadians()
- giro)));
int index;
while ((index = pattern.toString().indexOf(pattern.substring(0, matchLength--),
1)) <0);
matchLength = index - (int) (distancia / 11);
do {
giro += ((double) (byte) pattern.charAt(index--) / distancia);
} while (index >= Math.max(0, matchLength));
setTurnGunRightRadians(Utils.normalRelativeAngle(giro - getGunHeadingRadians()));

3.4.4 Estrategia para decidir la potencia de disparo


En estas estrategias, podemos aplicar la mayorı́a de los algoritmos de inteli-
gencia artificial descritos al inicio del articulo.
Es muy importante combinar todas las estrategias para apuntar y disparar
con una buena decisión del poder del disparo dependiendo de diferentes con-
diciones, esto lo podemos hacer con un árbol de decisiones, por ejemplo, el

10
que yo uso para mi robot, el cual esta basado en la distancia a la que se
encuentra el robot enemigo:
if (getEnergy()>1){
if (e.getDistance() <50) {
setFire(Rules.MAX BULLET POWER);
scan();
}
if (e.getDistance() <200) {
setFire(2.8);
} else if (e.getDistance() <400) {
setFire(1.8);
} else if (e.getDistance() <600) {
setFire(1.2);
} else {
setFire(1);
}
}

11
3.5 Estrategias para moverse
Para moverse existen varias estrategias, y debemos elegirla, dependiendo si
nuestro robot será para pelear uno contra uno o en grupo todos contra todos.
El objetivo de la estrategia de movimiento mas que todo es hacer que el
enemigo no nos pueda acertar en sus disparos.

3.5.1 Movimiento lineal


Esta estrategia de movimiento consiste en moverse en lineas rectas, es una
estrategia muy sencilla y seria muy fácil para los robots enemigos predecir
nuestra futura posición, en base a nuestra dirección y velocidad, pero si los
enemigos simplemente disparan hacia donde detectaron el robot enemigo,
será una estrategia suficiente.
Para esta estrategia, basta con mandar al robot moverse hacia adelante o ha-
cia atrás y que cambie de dirección al chocar contra una pared. Ahead(100);

12
3.5.2 Movimiento circular
Esta estrategia consiste en moverse hacia adelante o hacia atrás, pero girar
al mismo tiempo, de manera de moverse en curvas, esta estrategia es muy
buena si el enemigo, tiene una estrategia de disparo donde escaneo el ultimo
robot, o una estrategia de disparo de predicción linear, porque se evitarı́an
muchos disparos por el cambio de dirección.
setAhead(100);
setTurnRight(60);
Dado que tanto setAhead() como setTurnRight() son funciones que no blo-
quean, se ejecutaran ambas al mismo tiempo y el movimiento del robot
será en curva y no el linea recta.
Movimiento oscilatorio: Esta estrategia de movimiento es bastante buena, es
muy utilizada porque previene a la estrategia de disparo linear y a la estra-
tegia de disparo circular, evitando ası́ un gran numero de disparos, la única
estrategia de disparo contra la cual no podrı́a es la estrategia de disparo que
detecta patrones de movimiento para predecir la posición futura del enemigo.
setAhead(100);
setTurnright((Math.random() <.5 ? 1 : -1) *60);
Como podemos ver el random decide la dirección a la que girara, por lo que a
veces se moverá hacia la izquierda y a veces hacia la derecha oscilatoriamente.

3.5.3 Movimiento randomico


Esta estrategia de movimiento es muy sencilla pero bastante efectiva, porque
ni siquiera una estrategia de disparo que detecte patrones, podrı́a predecir
nuestra posición, pero aun ası́, quedara al azar el hecho de que nos atinen
o no, por lo que es bastante arriesgada, pero yo esta es la que utilizo en
mi robot y me funciona bastante bien, incluso hay veces que mi robot tiene
una racha de buena suerte y hasta da la apariencia de que el robot sabe la
dirección de las balas y las esquiva.
setTurnRightRadians(Math.cos(e.getBearingRadians()) + (2 * Math.random()
- 1) * .5);
setAhead((Math.random() <.5 ? 1 : -1) * (Math.random() / 2 + .5)
* (distActual / 4));
Como podemos ver, tanto la distancia, la dirección del desplazamiento, la
dirección del giro, como la intensidad del giro son números aleatorios. Por lo
que será prácticamente imposible predecir su comportamiento, sin embargo

13
pueden darle muchas balas por casualidad o por cercanı́a.

4 Mis estrategias
En este apartado del articulo, describiré las estrategias que he elegido para
mi robot, sus implementación y la razón por la que las elegı́. Para poder ele-
gir correctamente las estrategias mas adecuadas, primero tuve que entender
muy bien el funcionamiento de Robocode como simulador, sus caracterı́sticas
y limitaciones, ası́ como el funcionamiento de los robots y las funciones que
podemos utilizar para controlarlo y la forma en que responden, todo esto esta
detalladamente en el mi articulo anterior. ***** Ahora recordemos algunas
de las cosas mas relevantes para la elaboración de la estrategia correcta.
No se puede disparar muy seguido, porque el cañón se calienta, por lo que los
tiros deberı́an ser acertados. Si disparamos siempre con una potencia muy
alta, podemos perder mucha energı́a, por lo que cuando ya no tenemos mucha

14
energı́a, no conviene disparar muy fuerte.
La bala viaja a una velocidad constante.
Los robots pueden avanzar acelerando.
Todos los robots tienen el método onHitBybullet() que se ejecuta cuando
les disparamos y ellos reaccionan por lo general disparando a donde vino el
disparo que les dio, por lo que después de disparar deberı́amos movernos. Te-
niendo esto en cuenta, elabore un arbol de decisiones que pueda determinar
el poder con el cual disparar. if (getEnergy()>10){
if (e.getDistance() <50) {
setFire(Rules.MAX BULLET POWER);
scan();
}
if (e.getDistance() <200) {
if(getEnergy()<40){
setFire(2);
} else {
setFire(2.8);
}
} else if (e.getDistance() <400) {
if(getEnergy()<40){
setFire(1.8);
} else {
setFire(1.3);
}
} else if (e.getDistance() <600) {
if(getEnergy()<40){
setFire(1.2);
} else {
setFire(1.1);
}
} else {
if(getEnergy()<40){
setFire(1.1);
} else {
setFire(1);
}
}
}

15
Como podemos observar el árbol de decisiones tiene varios niveles, el primero
es donde elige mejor no disparar si se encuentra con poquı́sima energı́a, de
esta manera nos aseguramos por lo menos seguir moviéndonos, lo cual es muy
importante en especial por mi estrategia de movimiento randomico, porque
hay pocas posibilidades que me disparen, por lo cual es muy probable que los
demás robots sigan peleando entre ellos y tal vez se maten, y por lo menos
quedo un lugar mas arriba. El siguiente nivel, es donde se decide a que poder
disparar dependiendo de la distancia a la que se encuentre el enemigo, esto
es porque entre mas lejos este, tenemos menos probabilidades de atinarle,
entonces no deberı́amos desperdiciar tanta energı́a en un disparo ası́ porque
seguramente será un disparo perdido en cambio si nos encontramos cerca de
nuestra victima, de disparamos con todo el poder, porque seguramente le
atinaremos, entonces le haremos bastante daño y nos retornara energı́a por
el disparo acertado.
Otra estrategia muy importante que esta sumamente relacionada con esta,
es la incluida en el evento onHitRobot() porque ese evento se dispara cuando
chocamos contra un robot, entonces es la oportunidad perfecta para dispa-
rarle con todo el poder porque esta bastante cerca, lo que deberı́amos hacer
en este caso, es darle la vuelta al arma para apuntarle y disparar con toda
la fuerza, adicionalmente podrı́amos perseguirlo para volver a chocar contra
el y seguirle disparando a quema ropa. El código que yo utilizo para esto es
el siguiente:
double giroArma = normalRelativeAngleDegrees(e.getBearing() + getHeading()
- getGunHeading());
do {
setTurnGunRight(giroArma);
setFire(Rules.MAX BULLET POWER);
giroArma = normalRelativeAngleDegrees(e.getBearing() + getHeading()
- getGunHeading());
} while (giroArma == 0);
Como podemos ver, si el robot no se ha movido de su posición, lo cual es
muy poco probable pero puede suceder, mi robot le seguirá disparando y lo
mas seguro es que muera.
Ahora veamos la estrategia de movimiento, la cual es muy importante, mi
decisión en esta estrategia fue el movimiento randomico, porque para im-
plementar una estrategia del mejor movimiento, basado en diferentes hechos
observados, puede ser demasiado compleja, en cambio la programación del
movimiento randomico es sumamente sencilla y es poco probable que nos

16
atinen a no ser que nos disparen demasiado frecuentemente y en direcciones
cercanas a nuestra posición.
Otra estrategia muy importante que debe de acompañar a la estrategia de
movimiento, es la estrategia de huida cuando nos disparan, mi estrategia para
esto, consiste en avanzar a toda velocidad en sentido perpendicular al dis-
paro, de esta forma podremos alejarnos mas rapido, esto seria programación
inductiva, porque se basa en hechos, y observaciones, en este caso el hecho
que nos dispararon y la observación del angulo del disparo.

5 Conclusiones
• Es sumamente importante que elijamos bien las estrategias para ganar
en Robocode, pero estas estrategias deberias ser compatibles y no anu-
larse unas a otras, porque si no ninguna estrategia nos va a funcionar
por muy buena que sea.

• Es muy conveniente fusionar varias estrategias, especialmente si sabe-


mos que pelearemos contra mas de un robot, de manera que nuestro
robot sea lo suficientemente inteligente para adaptarese y pueda cam-
biar dinamicamente ciertos comportamientos, dependiendo de las cir-
cunstancias.

• Las estrategias mas importantes tal vez sean en primer lugar, la es-
trategia con la que apuntaremos y dispararemos y en segundo lugar la
estrategia con la que nos moveremos por el campo de batalla tratando
de esquivar los disparos de los demás robots.

• Los algoritmos de inteligencia artificial, como por ejemplo los algorit-


mos genéticos, las redes neuronales, los arboles de decisión, pueden
ayudarnos a formular una mejor estrategia y que nuestro robot sea
un ganador, por ejemplo se puden aplicar en la decisión sobre a quién
dispararle, hacia donde disparar, con que potencia, etc.

Referencias
[1] Wikipedia. Inteligencia artificial. Wiki, http://es.wikipedia.org/
wiki/Inteligencia_artificial.

17
[2] Wikipedia. Algoritmo. Wiki, http://es.wikipedia.org/wiki/
Algoritmo.

[3] Wikipedia. Algoritmos genéticos. Wiki, http://es.wikipedia.org/


wiki/Algoritmos_gen%C3%A9ticos.

[4] Wikipedia. Redes neuronales. Wiki, http://es.wikipedia.org/wiki/


Redes_neuronales_artificiales.

[5] Fuentes Ibanez. Arboles de decision. Universidad de Santiago Chi-


le, http://www.comenius.usach.cl/gvillarr/cursoia/alumnos/
fuentesibanez/links%20rellacionado/arboles_aa.html.

[6] Wikipedia. Sistemas expertos. Wiki, http://es.wikipedia.org/wiki/


Sistema_experto.

[7] Wikipedia. Clustering. Wiki, http://es.wikipedia.org/wiki/


Algoritmo_de_agrupamiento.

[8] Wikipedia. Vecino mas cercano. Wiki, http://es.wikipedia.org/


wiki/Knn.

[9] Robocode. One on one. Wiki, http://robowiki.net/w/index.php?


title=1-vs-1.

[10] RoboWiki. Melee strategy. Wiki, http://robowiki.net/w/index.


php?title=Melee_Strategy.

[11] Robocode api doc. JavaDoc, http://robocode.sourceforge.net/


docs/robocode/.

[12] Mr. Simon Parker. Secrets from the robocode masters: Robocode
strategies. Guide, http://www.ibm.com/developerworks/library/
j-tipstrats.html.

[13] Mr. Simon Parker. Secrets from the robocode masters: Circular tar-
geting. Guide, http://www.ibm.com/developerworks/java/library/
j-circular/.

[14] RoboWiki. Selecting fire power. Wiki, http://robowiki.net/w/


index.php?title=Selecting_Fire_Power.

18
[15] Albert. Selecting fire power. Wiki, http://robowiki.net/w/index.
php?title=Selecting_Fire_Power/Albert.

[16] RoboWiki. Symbolic pattern matching. Wiki, http://robowiki.net/


w/index.php?title=SymbolicPatternMatching.

[17] RoboWiki. Robocode faq. FAQ, http://testwiki.roborumble.org/


w/index.php?title=Robocode/FAQ#Programming_your_robot.

19

Anda mungkin juga menyukai