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
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]
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.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]
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.
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);
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));
}
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:
9
predictedY = Math.min(Math.max(18.0, predictedY),
battleFieldHeight - 18.0);
break;
}
}
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.
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.
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.
• 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.
Referencias
[1] Wikipedia. Inteligencia artificial. Wiki, http://es.wikipedia.org/
wiki/Inteligencia_artificial.
17
[2] Wikipedia. Algoritmo. Wiki, http://es.wikipedia.org/wiki/
Algoritmo.
[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/.
18
[15] Albert. Selecting fire power. Wiki, http://robowiki.net/w/index.
php?title=Selecting_Fire_Power/Albert.
19