<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Optimización de la humanidad de bots de Unreal Tournament 2004 mediante algoritmos evolutivos Humanness optimization of Unreal Tournament 2004 bots by means of evolutionary algorithms</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Álvaro Gutiérrez Rodríguez</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Antonio M. Mora</string-name>
          <email>amorag@ugr.es</email>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Antonio J. Fernández-Leiva</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Departamento de Lenguajes y Ciencias de la Computación,Universidad de Málaga</institution>
          ,
          <country>España</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Depto. Arquitectura y Tecnología de Computadores, Universidad de Granada</institution>
          ,
          <country>España</country>
        </aff>
      </contrib-group>
      <abstract>
        <p>This work describes three different approaches looking to get the best Bot (autonomous agent) for the First Person Shooter Unreal Tournament 2004. To this end, different hybridizations of the two best bots of the Botprize Competition 2014 are created. This competition decided the humanness level of the bots by means of a Turing test conducted on human judges. Thus, the proposal considers the source code of MirrorBot (winner) and NizorBot (second) and combines the best parts of their behaviour, in order to create a better human-like agent. Then, a Genetic Algorithm is applied to improve MirroBot's behavioural parameters. All the approaches have been tested by human judges, by means of a Turing test for bots, based on a third person assessment (i.e. videos showing gameplay). According to the results, the evolutionary version of MirrorBot is the best implementation. One of the hybridizations also obtained a very good humanness level.</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>Muchos de los videojuegos modernos se diseñan para provocar sentimientos intensos en el
jugador. Con este fin, muchas veces se incluyen personajes no controlables (NPCs), los cuales
intentan empatizar con el humano mostrando comportamientos y sentimientos humanos. A fin de
cumplir ese objetivo actualmente se empiezan a implementa inteligencias artificiales (IAs) centradas
en la humanidad, que incluyen, por ejemplo, un conjunto de reglas para guiar sus acciones al igual
que lo haría una persona. Este enfoque también es conocido como credibilidad de los NPCs (o
Bots).</p>
      <p>
        Así, el objetivo final es que ese jugador debería pasar un Test de Turing [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ] dentro del juego,
lo que supondría que un jugador humano pensaría que está jugando contra otros humanos. En
este sentido, hace algunos años surgió la 2K Botprize Competition. Ésta competición tiene como
objetivo encontrar al Bot con el mejor comportamiento humano para el shooter en primera persona
(FPS) Unreal Tournament 2004 [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ], o con su acrónimo UT2K4. Este juego, en su modo DeathMatch
(combates entre dos o más bots intentando derrotar a los oponentes y sobrevivir), se ha considerado
el mejor escenario para la competición, en el que evaluar los bots mediante una versión del test de
Turing adaptada al juego. En la última edición de la competición, 2014, el primer y segundo bot
consiguieron unos niveles de humanidad muy interesantes. Dichos campeones son, respectivamente,
Mirrorbot [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ] y Nizorbot [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ].
      </p>
      <p>
        Este artículo continua un trabajo previo [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ], en el cual ambos bots fueron analizados en
profundidad, identificando sus puntos fuertes, así como sus puntos de mejora. En ese estudio se sugirieron
diversas formas de optimizar y combinar ambos bots, de modo que, en el presente artículo, se
han aplicado algunas de esas propuestas. Por tanto, aquí describimos dos posibles hibridaciones,
las cuales combinan las mejores partes de cada bot con diferentes características del otro.
Además, también se propone una mejora sobre el ganador de la competición, Mirrorbot, mediante la
aplicación de algoritmo evolutivo para optimizar sus parámetros de comportamiento.
      </p>
      <p>Los tres bots resultantes han sido evaluados mediante un test de Turing público online, en el
cuál votantes anónimos han juzgado la humanidad de los bots visualizándolos en diferentes vídeos
de partidas uno contra uno.
2.</p>
    </sec>
    <sec id="sec-2">
      <title>Estado del arte</title>
      <p>
        El objetivo de crear personajes con un comportamiento humano creíble en videojuegos consiste
en mostrar un comportamiento similiar al de las personas, incluyendo características como la
personalidad, emociones, empatía o movimientos casi reales. Normalmente hay interacción entre los
personajes en el juego, por lo que, el objetivo sería mostrar la ilusión de que esos jugadores virtuales
son controlados por un humano [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. Este es un desafío importante en los juegos actualmente,
porque, de realizarse, ayudaría a mejorar sobre manera la inmersión del jugador en el juego y, en
consecuencia, su satisfacción[
        <xref ref-type="bibr" rid="ref7">7</xref>
        ].
      </p>
      <p>
        Sin embargo, evaluar el nivel de humanidad que un jugador virtual exhibe es bastante complejo,
ya que, normalmente, se trata de una medida subjetiva. Así, una manera de evaluar esa
’credibilidad’ podría ser mediante el test de Turing [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ], o más concretamente, mediante su adaptación al
ámbito de los videojuegos [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ], como propone el campeonato internacional 2K Botprize Competition
(ver sección 3).
      </p>
      <p>
        Sin embargo, modelar un comportamiento humano es una tarea harto difícil, ya que no se puede
limitar a seguir un conjunto de estados predefinidos o una fórmula matemática. Por lo que, las
soluciones habituales [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ] se enfocan en simular acciones habituales en los jugadores, tales como
la efectividad media y alta en el juego, cometer en cierta medida errores inesperados de vez en
cuando, tomar decisiones diferentes incluso en las mismas condiciones (con un factor estocástico),
y mostrar algún tipo de .emoción".
      </p>
      <p>
        Los FPS son unos de los escenarios más utilizados para realizar el test de Turing aplicado a
videojuegos, en consecuencia, han surgido un gran número de propuestas de agentes con
comportamiento humano en este ámbito. Por ejemplo, SOAR Bot para Quake, presentado por Laird [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] en
2000, el cual modeló un comportamiento humano a través de una arquitectura cognitiva. Choi et
al. en [
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] mejoró esta arquitectura y la aplicó a un agente autónomo para el juego Urban Combat.
Dicha versión mejorada era capaz de usar su conocimiento y aprender, por medio de recuerdos,
cosas como determinadas habilidades o una lista de objetivos priorizados que el agente debe lograr.
      </p>
      <p>
        Sin embargo, el entorno más extendido para crear bots con comportamiento humano en los FPS
ha sido el juego Unreal Tournament 2004 (UT2K4). Algunas propuestas en este ámbito han aplicado
una varicación de Algoritmos Evolutivos (EAs). Por ejemplo en [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ], los autores implementaron
técnicas evolutivas y co-evolutivas, o el sistema basado en reglas evolutivas presentado en [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ].
Schrum et al. [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ] consideraron la combinación de AEs con redes neuronales artificiales (ANNs),
con el fin de aprender a jugar como un humano imitando partidas grabadas de jugadores. Por
último, la propuesta de Soni y Hingston [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ] intentaba imitar el comportamiento humano aplicando
también redes neuronales artificiales.
      </p>
      <p>
        Finalmente, los autores del trabajo [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ] presentaron un bot que modelaba el comportamiento de
un jugador español experto. Incluía dos niveles de FSM, en la que el estado primario definía el nivel
superior de comportamiento del bot (como atacar o huir), mientras que los estados secundarios (o
subestados) pueden modificar este comportamiento para alcanzar objetivos necesarios o inmediatos
(como conseguir items de salud o un arma poderosa que está cerca de la posición del bot). Este
enfoque fue igualmente optimizado mediante un AE.
      </p>
      <p>Como ya se ha mencionado, este artículo intenta ir un paso más allá en la creación del mejor
bot con comportamiento humano, y lo hará mediante dos hibridaciones de los mejores bots en la
última competición de Botprize (de acuerdo a la clasificación) y también mejorando al ganador de
esa competición aplicando un método evolutivo.
3.</p>
    </sec>
    <sec id="sec-3">
      <title>Botprize competition: un test de Turing para bots</title>
      <p>Este test es una variación del clásico test de Turing en el que un humano juzga las interacciones
de los jugadores dentro de un mundo virtual (un juego), de modo que debe distinguir si esos
actores son humanos o bots. Este test apunta a avanzar en los campos de la Inteligencia artificial
y computacional en videojuegos, ya que un bot capaz de pasar este test podría considerarse como
excelente, y podría incrementar enormemente la calidad del juego, desde el punto de vista del
jugador. A su vez, el test también demuestra que el problema de la IA para videojuegos está lejos
de estar resuelta.</p>
      <p>El test de Turing para bots se han planteado considerando un videojuego multijugador en el cual
el bot tiene que cooperar o luchar contra otros jugadores (humanos o bots), tomando las mismas
decisiones que tomaría un humano. Esto fue transformado en una competición internacional con
las siguientes características:</p>
      <p>Se llevan a cabo partidas en modo Deathmatch de diez minutos de duración.</p>
      <p>Idealmente habría tres participantes: un jugador humano, un bot y un juez.</p>
      <p>El bot debe simular ser más humano que el jugador humano y ambos reciben puntuación
independiente.</p>
      <p>Los tres participantes no pueden distinguirse desde fuera (cada uno con un nombre y
apariencias aleatorios).</p>
      <p>Los bots no pueden tener poderes omniscientes como en otros juegos. Sólo pueden reaccionar
ante el mismo estímulo (mediante sensores) que reaccionaría un humano.</p>
      <sec id="sec-3-1">
        <title>Figura 1: Esquema competición Botprize</title>
        <p>
          En 2008 se celebró la primera competición de 2K Botprize (Botprize desde ahora), en el que
UT2K4 fue considerado cómo el entorno ideal para este test. Los participantes debían crear bots
con comportamientos humanos usando librerías externas para interactuar con el juego mediante
conexiones TCP (Pogamut [
          <xref ref-type="bibr" rid="ref16">16</xref>
          ]).
        </p>
        <p>En las primeras ediciones de Botprize (de 2008 a 2011) las puntuaciones de los bots no eran
capaces de superar a los jugadores humanos. En cualquier caso, la máxima puntuación de
humanidad alcanzada por los jugadores humanos fue sólo 41,4 %. Esto demuestra las limitaciones del test
(o de la competición), ya que evaluar incluso el comportamiento humano es una tarea complicada.</p>
        <p>
          Los dos primeros bots en la edición de 2014 de Botprize fueron Mirrorbot [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ] (el cual también
ganó en la edición de 2012), creado por Mihai Polcenau; y una propuesta de J.L. Jiménez y dos de
los autores de este estudio, Nizorbot [
          <xref ref-type="bibr" rid="ref4">4</xref>
          ].
        </p>
        <p>En la competición original, un número de jueces que participaron directamente en las
partidas fueron responsables de las evaluaciones de humanidad de los bots, haciendo una evaluación
en primera persona (FPA). En la edición de 2014, se incluyó una evaluación en tercera persona
(TPA) por medio de la participación (externa) de jueces vía una plataforma de crowdsourcing. La
humanidad (H) fue evaluada siguiendo la siguiente fórmula:</p>
        <p>H = (F P A</p>
        <p>F Pwf ) + (T P A</p>
        <p>T Pwf )
(1)
Dónde F Pwf y T Pwf son factores de ponderación (rango entre [0.0,1.0]) para FPA y TPA
respectivamente. en concreto, para la edición de 2014, F Pwf = T Pwf = 0;5. Los resultados dicha
edición se muestran en la Figura 2.</p>
        <p>Figura 2: Resultados de la botPrize 2014. Las celdas amarillas son los mejores bots mientras que
las azules son los humanos.</p>
        <p>Cómo se puede ver, Mirrorbot estuvo muy cerca de pasar el test de Turing propuesto en esa
edición, la cual usó un nuevo y duro sistema de evaluación. No llegó a tener el valor necesario
para poder ser considerado humano (0,5) aunque estuvo relativamente cerca de hacerlo. Nizorbot
también mostró una muy buena actuación terminado en la segunda posición, obteniendo un factor
de humanidad también alto.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>MirrorBot y Nizorbot</title>
      <p>En esta sección se presentarán los dos bots considerados como base para las hibridaciones de
este estudio.
4.1.</p>
      <sec id="sec-4-1">
        <title>Mirrorbot</title>
        <p>
          MirrorBot [
          <xref ref-type="bibr" rid="ref3">3</xref>
          ] fue desarrollado en 2012 específicamente para la competición de 2K Botprize, en
la que resultó el ganador, y fue de nuevo inscrito en la edición de 2014 ganado nuevamente. Está
basado en dos módulos principales de comportamiento:
Módulo por defecto: usado frecuentemente para navegar a través del mapa, recogiendo ítems
y armas, disparando a enemigos y esquivando sus ataques. Está compuesto por varios
submódulos. Los tres principales permiten al bot apuntar automáticamente hacia los enemigos,
calculando trayectorias y anticipándose a la ruta del enemigo; navegar aplicando una versión
modificada de la navegación por grafo, en la cual añade algún tipo de ruido o distorsión
al movimiento, con el fin de ocultar su desplazamiento; y finalmente, disparar al enemigo
más apropiado teniendo en cuenta el tipo de arma, la cantidad de daño que producirá y la
distancia hacia él.
        </p>
        <p>Módulo espejo: el cual se activa únicamente cuando un enemigo es considerado como no
agresivo (todo oponente es considerado así por defecto, a no ser que dispare al bot). La razón
es que probablemente ese enemigo sea un juez (humano) dentro del juego (FPA). Cuando el
comportamiento espejo está activado para un objetivo, MirrorBot empezará a grabar todas
las acciones a bajo nivel del oponente: apuntado, movimiento, disparo, salto, si está agachado
y el arma que lleva. Todo esto se almacena en una secuencia de frames la cual reproducirá
MirrorBot en el mismo orden. Se invierte la orientación y el movimiento, manteniendo siempre
una distancia constante al objetivo. Adicionalmente, se añade un retardo a la secuencia con
el fin de engañar al juez que esté mirando al bot.
4.2.</p>
      </sec>
      <sec id="sec-4-2">
        <title>Nizorbot</title>
        <p>
          Nizorbot [
          <xref ref-type="bibr" rid="ref4">4</xref>
          ] está basado en la idea del ya citado ExpertBot [
          <xref ref-type="bibr" rid="ref15">15</xref>
          ], el cual modela el
comportamiento de un jugador humano experto usando dos niveles de máquina de estados finitas (FSMs).
        </p>
        <p>ExpertBot está formado por dos capas: la primera es la capa cognitiva, encargada de controlar
la FSM teniendo en cuenta las estimulaciones del entorno (mediante sensores). Decide la transición
entre estados y subestados usando un sistema experto y una base de datos como conocimiento
adquirido. La segunda capa es la capa reactiva, la cual no realiza ningún tipo de razonamiento y
sólo actúa en cada momento durante la partida.</p>
        <p>
          Nizorbot es una mejora sobre ExpertBot al que se le ha aplicado un Algoritmo Evolutivo
Interactivo (IEA) [
          <xref ref-type="bibr" rid="ref17">17</xref>
          ], en el cual expertos humanos guían la optimización de los parámetros del
bot con el fin de obtener uno con un comportamiento humano. La idea básica es dejar que los
expertos descarten las soluciones candidatas (es decir, los individuos) que actúan subjetivamente
de forma menos humana que otras.
        </p>
        <p>Más específicamente, cada individuo en el IEA era un cromosoma con 26 genes, dividio en seis
bloques de información. Cada bloque representa el comportamiento de una característica específica
del bot: distancia, selección de arma, prioridad de arma, perfil, riesgo y tiempo.</p>
        <p>La función fitness para evaluar los individuos es una combinación de las muertes de enemigos
(frags), el número de muertes propias y la cantidad de daño hecho y recibido por el bot. La función
recompensa los individuos con un balance positivo (más frags que muertes) y un alto número de
frags. Además, los individuos que causan una gran cantidad de daño a los enemigos son también
recompensados, aunque tengan un peor balance.</p>
        <p>La evaluación de un individuo consiste en asignar los valores del cromosoma a los parámetros
de comportamiento de la IA de NizorBot y ejecutar una partida 1 vs 1 entre NizorBot y un bot
estándar de UT2K4 en su dificultad máxima. Una vez que pasa el tiempo fijado para la partida, se
recogen las estadísticas del individuo durante la misma y se evalúan aplicando la función fitness.</p>
        <p>Respecto a los operadores genéticos, cómo mecanismo de selección se utiliza una ruleta de
probabilidades, y un valor 5 de elitismo. Se utiliza un cruce uniforme, por lo que cada gen de un
descendiente tiene la misma probabilidad de pertenecer a uno de sus padres.</p>
        <p>La interacción del experto durante el juego se llevó a cabo en ciertos puntos específicos de la
evolución, en los que el experto debía realizar un TPA (viendo un vídeo del bot) e identificando
aquellas características específicas (como la distancia de selección, selección de arma, etc) que
considerase más humanas en el bot. De modo que aquellos bloques asociados a las características
seleccionadas se bloquearían y no serían alterados por los operadores genéticos durante la evolución.
Esto afecta al resto de la población cuando este individuo combina y esparce su información
genética. Esta interacción guía la búsqueda hacia la obtención de individuos con un comportamiento
más humano.</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Bot híbridos</title>
      <p>
        En este artículo se proponen dos bots como hibridaciones de MirrorBot y NizorBot. Con
respecto a este último, hemos usado los parámetros del mejor individuo obtenido en el trabajo previo
[
        <xref ref-type="bibr" rid="ref4">4</xref>
        ], después de todo el proceso de evolución interactiva.
      </p>
      <p>Cada bot híbrido combina las mejores partes de cada uno de los bots de referencia con una
parte complementaria del otro. En concreto son:</p>
      <p>MIRZorBot: este bot considera las mejores partes de MirrorBot, es decir, el módulo de
navegación (selección de objetivo, pathfinding, apuntado y movimiento) y la habilidad de
imitar (módulo espejo). Ya que ha sido considerado la clave del comportamiento humano
de MirrorBot después de un profundo análisis. El apuntado y movimiento parecen estar
condicionados por la percepción humana durante el juego. El apuntado no es siempre perfecto.
El módulo espejo añade un comportamiento no esperado (pero muy natural).</p>
      <p>Estos módulos y submódulos han sido incluidos dentro de la FSM de NizorBot, el cual añade
también el sistema experto de selección de arma (muy eficiente, ya que fue diseñado por
un humano experto que tuvo en cuenta todos los parámetros relacionados con las armas).
Además, la división en dos estados primarios y secundarios es muy parecida a las prioridades
que tiene un humano durante la partida.</p>
      <p>
        NIZRorBot: este bot usa casi toda la estructura interna de Nizorbot, pero al que se le ha
incluido el módulo de navegación de MirrorBot ya que fue la parte más débil del BotExperto
inicial [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ]. Así, NIZRorBot hace uso del sistema de navegación con todos los trucos que se
implementaron en MirrorBot, incluyendo una mejora de la malla de navegación de Pogamut
(con un sistema óptimo de esquiva de obstáculos) y un sistema propio de RayCasting basado
en 24 rayos: 16 horizontales (detectan obstáculos, ítems, armas, enemigos) y 8 verticales
(desde el centro del bot a 45o, para detectar desniveles o grandes caídas).
      </p>
    </sec>
    <sec id="sec-6">
      <title>MirrorBot Evolutivo</title>
      <p>
        Además de los dos bots híbridos, en el trabajo presentamos una mejora del MirrorBot inicial,
a la que llamaremos EVOMirBot, basada en una optimización de parámetros por medio de un
Algoritmo Genético clásico (GA) [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ].
      </p>
      <p>El objetivo es mejorar el comportamiento general del bot original con el fin de mostrar un
perfil más ofensivo (siendo más agresivo), ya que algunas veces éste se esperaba a las acciones
del oponente y no reaccionaba correctamente. Es decir, no actuaba como lo haría un humano
(moviéndose alrededor del enemigo y disparando, por ejemplo). Para tal fin, se han identificado y
extraído los parámetros codificados a modo de constantes de los que depende el comportamiento
del bot, con el fin de componer un cromosoma o individuo para el GA.</p>
      <p>De modo que cada individuo del GA es un cromosoma formado por 12 genes, en concreto:
Gen 1 (valor inicial 8136): tiempo que el bot está imitando, una vez se ha elegido a un
oponente para ser imitado. Se mide en milisegundos y está dentro del rango [1000, 10000].
Gen 2 (valor inicial 2982): tiempo que considera que tiene que transcurrir para ’olvidar’ a
un enemigo. Medido en milisegundos dentro del rango [1000, 9000].</p>
      <p>
        Gen 3 (valor inicial 7): nivel de agresividad de un enemigo. Si el valor es superior a este gen,
se descarta el oponente para ser imitado (será demasiado agresivo para ser un juez humano).
Valor en [
        <xref ref-type="bibr" rid="ref1 ref10">1, 10</xref>
        ].
      </p>
      <p>Gen 4 (valor inicial 115): tiempo de retardo cuando el módulo espejo está reproduciendo las
acciones del enemigo. Este valor es muy importante para mejorar la impresión que da el bot
al ser observado por el contrincante. Valor en milisegundos en el rango [0, 1000].
Gen 5 (valor inicial 842): tiempo transcurrido desde la última acción del oponente al ser
imitado. Medido en milisegundos entre [0, 500].</p>
      <p>
        Gen 6 (valor inicial 5): votos que debe recibir un oponente para ser imitado. Si recibe más
votos que este valor, será imitado. Valor dentro del rango [
        <xref ref-type="bibr" rid="ref1 ref7">1, 7</xref>
        ].
Gen 7 (valor inicial 2000): distancia media entre el bot y el candidato rival a ser imitado.
Es la distancia que considera segura para observar al contrario sin ser atacado. Valor en el
rango [1200, 2000].
      </p>
      <p>Gen 8 (valor inicial 8211): tiempo que considera a un enemigo como némesis, es decir, el bot
lo atacará siempre que lo detecte. Valor en milisegundos en el rango [1000, 9000].
Gen 9 (valor inicial 2142): tiempo que tiene que transcurrir limpiar la lista de sus némesis.
Valor en milisegundos en el rango [1000, 5000].</p>
      <p>Gen 10 (valor inicial 300): tiempo de disparo descontrolado (o pseudo-aleatorio). Utilizado
para mostrar un comportamiento inesperado de vez en cuando. Valor en milisegundos en
[100, 500].</p>
      <p>Gen 11 (valor inicial 3500): distancia considerada como lejana en relación al enemigo. Valor
en [500, 5000].</p>
      <p>Gen 12 (valor inicial 600): distancia considerada como corta respecto al enemigo. Valor en
[100, 800].</p>
      <p>Esta lista muestra, como referencia, los valores iniciales que tenía MirrorBot. Como se puede ver,
los rangos han sido definidos bastante amplios, para que nos permita obtener una gran variación
de MirrorBot al ser evolucionado.</p>
      <p>La función fitness definida es la siguiente:
f (fr; d; dmgG; dmgT ) = ((fr
50)
(d 5)) + (dmgG
dmgT =10)
(2)
Dónde fr es el número de frags que ha obtenido el bot, d es el número de muertes del bot, dmgG
es el daño total producido por el bot y dmgT es el daño total recibido por el bot. Al igual que en
NizorBot, esta función recompensa bastante a los individuos con balances positivos, es decir, más
frags que muertes propias y más daño producido que recibido, con el objetivo citado anteriormente
de conseguir un perfil más ofensivo.</p>
      <p>La evaluación de un individuo se realiza dando los valores del cromosoma a la IA de MirrorBot
y ejecutando una partida Deathmatch 1 vs 1 contra NizorBot en UT2K4 durante 1 minuto. Una
vez finaliza la batalla, se calcula el valor para la función fitness considerando la actuación del bot.</p>
      <p>Como mecanismo de selección se ha utilizado una ruleta de probabilidad, considerando una
probabilidad proporcional al valor de fitness obtenido. Además, se ha llevado a cabo una política
de reemplazo estacionaria, en la que sólo el peor individuo es sustituido en cada generación.
Finalmente, se ha aplicado un cruce uniforme y una mutación que genera un valor aleatorio dentro del
rango de valores posibles para el parámetro.</p>
    </sec>
    <sec id="sec-7">
      <title>Experimentos y resultados</title>
      <p>En esta sección se analizarán los resultados obtenidos, primero respecto al enfoque evolutivo de
MirrorBot y después por medio de una evaluación en tercera persona a modo de test de Turing.
7.1.</p>
      <sec id="sec-7-1">
        <title>Optimización evolutiva</title>
        <p>En este experimento el llamado EVOMirBot ha sido obtenido como una optimización de
MirrorBot. La configuración de los parámetros del algoritmo evolutivo ha sido: 20 individuos, 50
generaciones, 1/12 de probabilidad de mutación. Las evaluaciones se han llevado a cabo en
combates 1 vs 1 contra Nizorbot y con una duración de 1 minuto, siempre en el mapa DM-TrainingDay
(frecuentemente usado en las competiciones de UT2K4). Se han ejecutado diez iteraciones del
algoritmo.</p>
        <p>La evolución del fitness de todas las iteraciones se muestra en la Figura 3.
Figura 3: Evolución de los mejores fitness medios por generación considerando 10 ejecuciones.</p>
        <p>
          Como se puede ver, hay una tendencia de mejora en los mejores fitness medios a lo largo de las
generaciones. Sin embargo, es un poco leve, debido a al ruido natural del problema [
          <xref ref-type="bibr" rid="ref19">19</xref>
          ], esto es, un
individuo puede ser evaluado como bueno en un combate, pero el mismo bot puede obtener peores
resultados en otro combate. Esto sucede debido al alto componente pseudo-estocástico presente en
las batallas, ya que los resultados no dependen por completo de nuestro bot, también se tienen
en cuenta las acciones del enemigo, sobre las que no tenemos ningún control, puesto que no serán
deterministas.
        </p>
        <p>De modo que, hemos elegido como el EVOMirBot definitivo un individuo de las últimas
generaciones. No fue el único con el valor de fitness más alto, pero fue el bot que, bajo nuestro punto
de vista, tenía el mejor comportamiento humano (tras revisar varios combates de cada uno de los
bots candidatos). Los valores optimizados obtenidos de este bot se muestran en la Tabla 1.</p>
        <p>Gn1
6231</p>
        <p>Gn2
5634</p>
        <p>Gn3
1</p>
        <p>Gn4
25</p>
        <p>Gn5
612</p>
        <p>Gn6
2</p>
        <p>Gn7
1560</p>
        <p>Gn8
3194</p>
        <p>Gn9
2880</p>
        <p>Gn10
447</p>
        <p>Gn11
3398</p>
        <p>Gn12
245</p>
        <sec id="sec-7-1-1">
          <title>Tabla 1: Genes de EVOMirBot final.</title>
          <p>Observando los resultados podemos remarcar que la agresividad de MirrorBot ha sido
incrementada en EVOMirBot. Por ejemplo, el Gen 2 (cambió de 2982 a 5364) hará que el bot recuerde
durante más tiempo a su nemesis, el Gen 8 (tiene como valor 3194 en lugar de 8211) reducirá el
tiempo en que considerará a otro como némesis, y el Gen 12 (cambió de 600 a 245) tiene un valor
más pequeño que antes, por lo que el bot tendrá un estilo de combate más cercano que antes.</p>
          <p>Respecto a la habilidad de imitación de MirrorBot, ésta ha sido mejorada o mejor adaptada al
juego. Así, por ejemplo el valor del Gen 1 es mucho más pequeño que antes (6231 en lugar de 8136),
esto significa que estará menos tiempo imitando al oponente. El Gen 3 (valor 1 en lugar de 7) hace
que tenga un menor ratio de imitación que antes, pero los oponentes, considerados como bots serán
atacados con más frecuencia, lo que es más recomendable en este modo de juego. El nuevo valor
del Gen 5 (612 en lugar de 842) significa que tendrá un retardo más pequeño a la hora de imitar.
El Gen 6 (nuevo valor 2 en lugar de 6) afecta a la probabilidad de elegir candidato a imitar. El
nuevo valor del Gen 10 (447 en lugar de 300) conducirá a EVOMirBot a tener un precisión más
errática o aleatoria, lo que aumenta la probabilidad de creer que se trata de un jugador impreciso,
más parecido a un humano.
7.2.</p>
        </sec>
      </sec>
      <sec id="sec-7-2">
        <title>Test de Turing TPA abierto</title>
        <p>En este experimento, los tres nuevos bots (MIRZorBot, NIZRoBot y EVOMirBot) y los
originales Nizorbot y MirrorBot han sido evaluados en un test de Turing abierto (al público), en una
evaluación en tercera persona (TPA) a través de la página web http://1-dot-proyecto-tfg.appspot.com.</p>
        <p>Para este fin se grabaron 7 vídeos de 20 segundos y se presentaron a una serie de jueces
voluntarios (cualquiera podía acceder a la web). Cada vídeo mostraba parte de una escena de
combate entre dos jugadores, pudiendo ser cada uno de ellos o ambos bots o humanos. Así, cada
uno de los 5 bots participó en dos vídeos: uno contra otro bot y otro contra un jugador humano.</p>
        <p>Después de ver el vídeo, el juez debía decidir sobre el nivel de humanidad mostrado por los
jugadores con las opciones: a) el jugador 1 es humano, b) el jugador 2 es humano, c) ambos son
humanos, d) ninguno es humano, e) NS/NC, f ) Incongruente.</p>
        <p>El test estuvo abierto durante tres semanas y participaron 61 jueces. Hemos considerado
únicamente los votos que recibió cada bot en las opciones a) y c). El resto de opciones se obviaron en el
cálculo del nivel de humanidad de cada bot. Este valor ha sido calculado como el número de votos
recibidos dividido por 122, ya que es el máximo de votos que puede recibir cada bot (61 votos * 2
vídeos en los que un bot está presente). Los resultados se muestran en la Tabla 2.</p>
        <p>Bot
NizorBot
EVOMirBot
MIRzorBot
NizorBot
NIZRorBot</p>
        <p>Cómo puede verse todos los bots han tenido una puntuación bastante alta, lo que es una buena
señal de su comportamiento humano.</p>
        <p>Podemos remarcar el hecho de que EVOMirBot (aparentemente) ha mejorado con respecto a
Mirrorbot. El primero ha obtenido la segunda mejor puntuación, quedando por detrás de NizorBot
quién ha ’ganado’. MIRZorBot ha obtenido también buenos resultados, sin embargo, NIZRorBot
ha obtenido la peor puntuación. La razón de que haya quedado en último lugar es probablemente
por el sistema de raycasting de MirrorBot que entra en conflicto con la elección de objetivo original
de NizorBot, lo que ha supuesto un comportamiento en cuanto al movimiento erróneo y, por tanto,
los jueces lo han identificado como no humano.</p>
        <p>Sin embargo, mirando las cifras completas en los resultados, creemos firmemente que los vídeos
podrían ser mejorados. Por ejemplo, aumentando su duración (parecen ser demasiado cortos), o
situando el punto de vista en cada uno de los bots, ya que probablemente no es lo mejor evaluar
un oponente desde la vista de un bot que se enfrenta a él (se pierde de vista de vez en cuando, por
ejemplo). La cuestión es que en este tipo de test abierto es muy importante alcanzar un número
adecuado de vídeos con una duración bien ajustada, con el fin de evitar el aburrimiento en los
jueces y su abandono.</p>
      </sec>
    </sec>
    <sec id="sec-8">
      <title>Conclusiones y traba jo futuro</title>
      <p>Este artículo ha presentado tres enfoques diferentes de bots con comportamientos humanos
para el FPS Unreal Tournament 2004. Todo ellos se han obtenido a partir de una variación/mejora
de los dos mejores bots de la competición 2K Botprize (un test de Turing para bots), en su edición
2014: MirrorBot y NizorBot.</p>
      <p>Estos son MIRZorBot (basado en MirrorBot con componentes de NizorBot), NIZRorBot (cuya
estructura es de NizorBot y el módulo de movimiento de MirrorBot) y EVOMirBot (MirrorBot
optimizado evolutivamente).</p>
      <p>En los resultados obtenidos hemos analizado la mejora obtenida de MirrorBot mediante un
Algoritmo Genético, considerando los nuevos valores de los parámetros y estudiando su influencia
en el comportamiento del bot. Se ha visto que se ha obtenido un comportamiento más agresivo del
mismo.</p>
      <p>Por otro lado, hemos realizado un test de Turing basado en evaluaciones en tercera persona,
en las que una serie de jueces voluntarios han revisado una serie de vídeos de bots luchando en el
juego y han decidido quién es el humano (si es que hay alguno). Los resultados de este test han
ofrecido dos conclusiones principalmente: EVOMirBot parece ser una mejora real de MirrorBot
(el hecho de ser más agresivo parece ser que ha convencido en mayor medida a los jueces en sus
evaluaciones), Por su parte, MIRZorBot ha obtenido un muy buen nivel de humanidad. NIZRorBot
ha tenido los peores resultados, pero la razón podría ser una incompatibilidad entre uno de los
módulos con el sistema de raycasting, que ha derivado en problemas en el movimiento y, por tanto,
en una evaluación negativa. Este será uno de los puntos de mejora que encararemos en un futuro
próximo.</p>
      <p>Otras líneas de trabajo futuras tratarán el ruido en el proceso evolutivo (función de evaluación),
con el fin de conseguir una mejora de la tendencia en el fitness. Además, teniendo en cuenta los
resultados de las votaciones en el test de Turing, ha habido algunos ’NS/NC’ o ’Incongruente’, lo
que nos lleva a pensar que los vídeos deben ser mejorados, quizás centrándose la vista únicamente
en cada bot, con una duración más larga o reduciendo el voto a un sólo bot por vídeo.</p>
    </sec>
    <sec id="sec-9">
      <title>Agradecimientos</title>
      <p>Este trabajo ha sido apoyado por el proyecto MINECO EPHEMECH (TIN2014- 56494-C4-1-P,
3-P), KNOWAVES (TEC2015-68752) (MICINN and FEDER) y la Universidad de Málaga (Campus
de Excelencia Internacional Andalucía Tech). Los autores están muy agradecidos a Mihai Polcenau
y José L. Jiménez, autores respectivos de MirrorBot y NizorBot, por proporcionarnos el código
fuente de sus bots y su ayuda para el desarrollo de este trabajo.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Turing</surname>
            ,
            <given-names>A.M.</given-names>
          </string-name>
          :
          <source>Computing Machinery and Intelligence. Mind</source>
          <volume>59</volume>
          (
          <issue>236</issue>
          ) (
          <year>1950</year>
          )
          <fpage>433</fpage>
          -
          <lpage>460</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2. http://www.unrealtournament.com/: Unreal tournament (
          <year>2014</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Polceanu</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          :
          <article-title>Mirrorbot: Using human-inspired mirroring behavior to pass a turing test</article-title>
          .
          <source>In: Computational Intelligence in Games (CIG)</source>
          ,
          <source>2013 IEEE Conference on, IEEE</source>
          (
          <year>2013</year>
          )
          <fpage>1</fpage>
          -
          <lpage>8</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Jiménez</surname>
            ,
            <given-names>J.L.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Mora</surname>
            ,
            <given-names>A.M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Fernández-Leiva</surname>
            ,
            <given-names>A.J.:</given-names>
          </string-name>
          <article-title>Evolutionary interactive bot for the FPS unreal tournament 2004</article-title>
          . In Camacho, D.,
          <string-name>
            <surname>Gómez-Martín</surname>
            ,
            <given-names>M.A.</given-names>
          </string-name>
          , González- Calero, P.A., eds.
          <source>: Proceedings 2st Congreso de la Sociedad Española para las Ciencias del Videojuego</source>
          , Barcelona, Spain, June 24,
          <year>2015</year>
          . Volume 1394 of CEUR Workshop Proceedings., CEURWS.org (
          <year>2015</year>
          )
          <fpage>46</fpage>
          -
          <lpage>57</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5.
          <string-name>
            <surname>Polceanu</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Mora</surname>
            ,
            <given-names>A.M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Jiménez</surname>
            ,
            <given-names>J.L.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Buche</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Leiva</surname>
            ,
            <given-names>A.J.F.</given-names>
          </string-name>
          :
          <article-title>The believability gene in virtual bots</article-title>
          .
          <source>In: Proceedings of the Twenty-Ninth International Florida Artificial Intelligence Research Society Conference, FLAIRS</source>
          <year>2016</year>
          ,
          <string-name>
            <given-names>Key</given-names>
            <surname>Largo</surname>
          </string-name>
          , Florida, May
          <volume>16</volume>
          -18,
          <year>2016</year>
          ., AAAI Press (
          <year>2016</year>
          )
          <fpage>346</fpage>
          -
          <lpage>349</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Livingstone</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          :
          <article-title>Turing's test and believable AI in games</article-title>
          .
          <source>Computers in Entertainment</source>
          <volume>4</volume>
          (
          <issue>1</issue>
          ) (
          <year>2006</year>
          )
          <fpage>6</fpage>
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Soni</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hingston</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          :
          <article-title>Bots trained to play like a human are more fun</article-title>
          .
          <source>In: Neural Networks</source>
          ,
          <year>2008</year>
          .
          <source>IJCNN</source>
          <year>2008</year>
          .
          <article-title>(IEEE World Congress on Computational Intelligence)</article-title>
          . IEEE International Joint Conference on. (
          <year>2008</year>
          )
          <fpage>363</fpage>
          -
          <lpage>369</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Yannakakis</surname>
            ,
            <given-names>G.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Togelius</surname>
            ,
            <given-names>J.:</given-names>
          </string-name>
          <article-title>A panorama of artificial and computational intelligence in games</article-title>
          .
          <source>Computational Intelligence and AI</source>
          in Games, IEEE Transactions on (
          <year>2014</year>
          )
          <article-title>Accepted for publication</article-title>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Laird</surname>
            ,
            <given-names>J.E.</given-names>
          </string-name>
          :
          <article-title>It knows what you're going to do: Adding anticipation to a quakebot</article-title>
          .
          <source>AAAI 2000 Spring Symposium Series: Artificial Intelligence and Interactive Entertainment SS-00- 02</source>
          (
          <year>2000</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Choi</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Könik</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Nejati</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Park</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Langley</surname>
            ,
            <given-names>P.:</given-names>
          </string-name>
          <article-title>A believable agent for firstperson shooter games</article-title>
          . In Schaeffer, J.,
          <string-name>
            <surname>Mateas</surname>
          </string-name>
          , M., eds.
          <source>: Proceedings of the Third Artificial Intelligence and Interactive Digital Entertainment Conference, June 6-8</source>
          ,
          <year>2007</year>
          , Stanford, California, USA., The AAAI Press (
          <year>2007</year>
          )
          <fpage>71</fpage>
          -
          <lpage>73</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>Priesterjahn</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kramer</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Weimer</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Goebels</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          :
          <article-title>Evolution of humancompetitive agents in modern computer games</article-title>
          .
          <source>In: IEEE World Congress on Computational Intelligence</source>
          <year>2006</year>
          (WCCI'06). (
          <year>2006</year>
          )
          <fpage>777</fpage>
          -
          <lpage>784</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Small</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Bates-Congdon</surname>
            ,
            <given-names>C.</given-names>
          </string-name>
          :
          <article-title>Agent Smith: Towards an evolutionary rule-based agent for interactive dynamic games</article-title>
          .
          <source>In: IEEE Congress on Evolutionary Computation 2009 (CEC'09)</source>
          . (
          <year>2009</year>
          )
          <fpage>660</fpage>
          -
          <lpage>666</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          13.
          <string-name>
            <surname>Schrum</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Karpov</surname>
            ,
            <given-names>I.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Miikkulainen</surname>
          </string-name>
          , R.: Ut2:
          <article-title>Human-like behavior via neuroevolution of combat behavior and replay of human traces</article-title>
          .
          <source>In: Computational Intelligence and Games (CIG)</source>
          ,
          <source>2011 IEEE Conference on. (</source>
          <year>2011</year>
          )
          <fpage>329</fpage>
          -
          <lpage>336</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          14.
          <string-name>
            <surname>Soni</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Hingston</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          :
          <article-title>Bots trained to play like a human are more fun</article-title>
          .
          <source>In: IEEE International Joint Conference on Neural Networks, IJCNN'08</source>
          . (
          <year>2008</year>
          )
          <fpage>363</fpage>
          -
          <lpage>369</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          15.
          <string-name>
            <surname>Mora</surname>
            ,
            <given-names>A.M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Aisa</surname>
            ,
            <given-names>F.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>García-Sánchez</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Castillo</surname>
            ,
            <given-names>P.A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Guervós</surname>
            ,
            <given-names>J.J.M.</given-names>
          </string-name>
          :
          <article-title>Modelling a humanlike bot in a first person shooter game</article-title>
          .
          <source>IJCICG</source>
          <volume>6</volume>
          (
          <issue>1</issue>
          ) (
          <year>2015</year>
          )
          <fpage>21</fpage>
          -
          <lpage>37</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          16. http://pogamut.cuni.cz/main/: Pogamut - virtual
          <source>characters made easy - about</source>
          (
          <year>2014</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          17.
          <string-name>
            <surname>Takagi</surname>
          </string-name>
          , H.:
          <article-title>Interactive evolutionary computation: Fusion of the capabilities of EC optimization and human evaluation</article-title>
          .
          <source>Proceedings of the IEEE (9)</source>
          (
          <year>2001</year>
          )
          <fpage>1275</fpage>
          -
          <lpage>1296</lpage>
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          18.
          <string-name>
            <surname>Goldberg</surname>
          </string-name>
          , D.E.:
          <article-title>Genetic Algorithms in search, optimization and machine learning</article-title>
          .
          <source>Addison Wesley</source>
          (
          <year>1989</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          19.
          <string-name>
            <surname>Mora</surname>
            ,
            <given-names>A.M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Fernández-Ares</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Merelo</surname>
            ,
            <given-names>J.J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>García-Sánchez</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Fernandes</surname>
            ,
            <given-names>C.M.</given-names>
          </string-name>
          :
          <article-title>Effect of noisy fitness in real-time strategy games player behaviour optimisation using evolutionary algorithms</article-title>
          .
          <source>J. Comput. Sci. Technol</source>
          .
          <volume>27</volume>
          (
          <issue>5</issue>
          ) (
          <year>2012</year>
          )
          <fpage>1007</fpage>
          -
          <lpage>1023</lpage>
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>