Está en la página 1de 6

Análisis de la dinámica de guerra de guerrillas por medio de un

algoritmo de simulación planteado en el paper "From old wars


to new wars and global terrorism"
Cristian Peña1 ,Jhon Fajardo1 ,Sergio Arango1 , Jonathan Reyes1 Humberto Cordoba1
1
Departamento de física, Universidad Nacional de Colombia-Bogotá D.C, Colombia

Palabras Clave: Algoritmo, Ley de Potencias, Guerrilla, Colombia, Regresión, Simulación

1. Introducción Se debe primero elegir el parámetro que nos dice como


de grande es el grupo armado. Este parámetro lo lla-
El objetivo del paper From old wars to new wars and maremos N y es aquella suma de las fuerzas de ataque
global terrorism[1], [2] distribución de ley de potencia, de todos los bloques. Nunca cambiara. También decla-
es decir que la probabilidad de que en una guerra dada ramos una cantidad de pasos N steps que permitiremos
hayan x víctimas: p(x), es igual a cx−α sobre un rango que el algoritmo tarde.
amplio de x, con C y α coeficientes positivos. Esto im-
plica que una gráfica de log[P (X)] vs log(x) será una Luego se procede a elegir como parámetro a una pro-
línea recta sobre este rango de x, con pendiente nega- babilidad v, que sera la probabilidad de que un bloque
tiva α − 1 dado se fragmente. Esto significa que la probabilidad
de que ocurra lo contrario sera 1 − v. Cuando hablamos
Nos gustaría resumir el algoritmo tal como se imple- del caso contrario, estamos refiriéndonos al escenario
mento y entendió. Según el artículo, se asumen varias donde el bloque se adjunte a otro bloque y sumen sus
cosas sobre los grupos armados: fuerzas.
Consisten de bloques, cada bloque tiene una fuerza Aquí empieza el algoritmo. Debemos primero declarar
de ataque. un arreglo que contenga solo 1,s y que la suma de estos
La fuerza de ataque de un bloque es la cantidad de nos de N . Este va a ser alterado una cantidad de veces
personas que es capaz de neutralizar ese bloque. N steps.

La mínima fuerza de ataque que puede tener un Inicialmente, todos los bloques tienen la misma pro-
1
bloque es 1 babilidad N de ser escogidos. Le pedimos a Python
que escoja un bloque. Una vez escogido, apelamos a
Los bloques se pueden unir y suman sus fuerzas de nuestro parámetro v. Dejamos que Python escoja entre
ataque. desarmar o coalescer al grupo con otro. Esta elección
es determinada por las probabilidades v y 1 − v respec-
Los bloques se pueden fragmentar y cuando lo ha-
tivamente.
cen se fragmentan en bloques de fuerza de ataque
igual a 1. Si Python escoge desarmar al bloque, tenemos que ano-
tar la fuerza del bloque, y dividirlo en otros bloques
Por sencillez, se asume que el grupo armado co-
iguales de fuerza 1. Esto implica borrar nuestro blo-
mienza con solo bloques de fuerza de ataque igual
que pero luego adjuntarle todos esos bloques a nuestro
a 1.
arreglo.
La suma de todas las fuerzas de ataque de los blo-
ques de la guerrilla debe mantenerse constante. Si Python escoge coalescer al bloque con otro, hay que
comprobar antes si eso es siquiera posible. Esto es, hay
En este orden de ideas, el algoritmo a implementar va a que verificar que exista otro bloque además del que
matematizar esos principios. Para esto, se pueden usar estamos tratando. Ya verificado esto, procedemos a es-
arreglos de numpy, donde la i-ésima entrada representa coger otro bloque, con esa distribución uniforme que
la fuerza de ataque del bloque i-ésimo. usamos para escoger, proporcional a la fuerza de cada

1
bloque. Cuando se ha escogido el otro bloque, se su- de repetir el proceso de fusión/unión con la cantidad
man las fuerzas de los dos escogidos, borramos ambos requerida de pasos. De esta forma pasamos a elegir una
bloques, y adjuntamos el nuevo bloque mas fuerte. unidad de ataque del vector de estado. Esto se logra en
dos pasos: escoger una entrada aleatoria del vector de
Este proceso se va a realizar N steps veces. Puede que
estado y luego obtener el índice del primer elemento
las guerrillas terminen muy fragmentadas. Con pocos
que conocida con esta entrada en el vector de estado.
bloques fuertes.
Para escoger la entrada aleatoria usamos la función
El propósito de realizar todo esto es estudiar que com-
np.random.choice, que nos permite, por un lado, ele-
portamiento podrían tener las guerrillas a lo largo del
gir una entrada aleatoria del vector de estado, pero
mundo. Después de todo, este modelo, a grandes ras-
además podemos hacer esta elección en base a un vec-
gos, describe cualquier guerrilla o ejercito. Además, a
tor p de probabilidades, esto nos permite asignar una
través de este algoritmo, estamos verificando a través
probabilidad a cada unidad de ataque (a cada entra-
de una simulación que los resultados analíticos del ar-
da del vector de estado) proporcional a su fuerza de
ticulo son correctos.
ataque (valor de cada entrada del vector de estado).
Se hace necesario estudiar las guerrillas para poder dar Entonces definimos la probabilidad pi como la proba-
algún sentido de predictibilidad a ellas. Esto es útil bilidad de escoger la unidad de ataque i con fuerza si
si
para los gobiernos. Afortunadamente, esta simulación, tal que pi = N , esto nace de usar una sencilla regla de
según el articulo, se ajusta muy bien a la realidad. Lo tres donde N representa el 100 % de probabilidad de
único que hay que tomar en cuenta es el tamaño N de ser elegido (esto porque si una unidad de ataque tiene
una guerrilla y la probabilidad v de sus bloques. fuerza si = N significa que esta unidad de ataque tie-
ne toda la fuerza total y las demás unidades de ataque
tienen, por consecuencia, una fuerza de ataque igual a
2. Dispositivo experimental y procedi- 0. Así no tendría sentido escoger una unidad de ataque
miento que no tiene fuerza de ataque y la unidad si tendría
que ser elegida el 100 % de las veces que se presente
Como ya se mencionó anteriormente se usó Python pa-
esta situación) y buscamos la probabilidad pi para una
ra realizar la simulación, específicamente usamos no-
unidad de ataque si . Estas probabilidades las recopila-
tebooks de Colab. Junto con esto se aprovecharon las
mos en el vector p de probabilidades y se calcula como
herramientas de vectorización y varias funciones brin-
el vector de estado dividido por N.
dadas por la librería Numpy y las herramientas de vi-
sualización de datos brindadas por Matplotlib. Este vector se le pasará a la función np.choice para
que elija una entrada de forma aleatoria según las pro-
Luego de la lectura del paper original, llegamos a la
babilidades del vector p y de esta forma obtendremos
abstracción ya mencionada del algoritmo de simula-
una entrada aleatoria del vector de estado. Pero para
ción. Este algoritmo se implementará en una función
realizar operaciones con esta entrada (como eliminarla)
llamada simulation que recibirá tres argumentos: N,
necesitamos saber el índice de la misma. Para esto usa-
que es la fuerza total del sistema; nsteps, que es la can-
mos la función first_index , que busca el índice de la
tidad de pasos que de tiempo que hará la simulación;
primera entrada que coincida con el dato que le pase-
v, que representa la probabilidad de que una unidad de
mos como argumento (decidimos crear esta función y
ataque se disuelva.
no usar una función como np.where ya que np.where
Así, el primer paso para comenzar la simulación será nos devuelve todos los índices que coinciden con el ar-
inicializar un vector de estado de tamaño N, en el cual gumento que le pasemos en lugar de sólo el primero,
cada entrada será igual a 1 (Cada entrada representa y esto conlleva a un mayor tiempo de cómputo). Aho-
una unidad de ataque y el valor que contiene represen- ra simplemente guardamos este índice en la variable
ta la fuerza de ataque asociada a la unidad correspon- i_index que usaremos luego. Este proceso queda plas-
diente), esto se realiza de forma muy sencilla usando la mado en estas dos líneas de código:
función np.ones de Numpy, como se muestra a conti-
nuación: 1 si = np . random . choice ( vec_estado , p =
vec_estado / N )
1 vec_estado = np . ones ( N ) 2 i_index = first_index ( vec_estado , si )

Luego de esto entramos en un bucle, que se encargará Ahora vamos a elegir si la unidad de ataque se disolverá

2
o se fusionará con otra unidad de ataque. Este proceso 2 sj = np . random . choice ( vec_estado , p =
está mediado por la probabilidad v, que representa la vec_estado /( N - si ) )
probabilidad de que la unidad se disuelva y por lo tan- 3 j_index = first_index ( vec_estado , sj )
to 1 − v representará la probabilidad de que la unidad 4 vec_estado = np . delete ( vec_estado ,
de ataque se fusione con otra unidad. De nuevo, esta j_index )
5 vec_estado = np . append ( vec_estado , si + sj )
elección se hará por medio de la función np.choice,
la cuál elegirá una entrada del vector [0, 1] con proba-
bilidades p = [v, 1 − v], de esta forma si se escoge 0 la Este proceso se repite nsteps veces y al final la función
unidad pasará a disolver y si se escoge 1 la unidad pa- de simulación retornará el vector de estado.
sará a fusionarse con otra unidad. Esto queda escrito
como: Para este estudio nos interesa visualizar dos gráficas:
la gráfica del número de unidades de ataque de fuerza
1 l = np . random . choice ([0 ,1] , p =[ v , 1 - v ]) s (ns ) vs s y la gráfica de α (valor de la pendiente de
la regresión lineal de ns vs s) versus la probabilidad v
de disolución. La primera gráfica la podemos obtener
En caso que se elija disolver la unidad de ataque se de- con el vector de estado. Para esto usamos la función
be reemplazar la unidad de ataque de fuerza si por si extract_xy que recibe el vector de estado y nos de-
unidades de ataque de fuerza 1. Este proceso se reali- vuelve dos vectores X, Y. X representa a los posibles
za de la siguiente manera: primero, usando la función valores de la fuerza de ataque s, que como mínimo es
np.delete, le pasamos el vector de estado y el índice 1 y como máximo es N , esto se hace usando la función
que guardamos en el paso anterior para que elimine la range originaria de Python. Cada entrada ii-1 (esto
entrada, luego usamos np.append para agregar un vec- por como están indexados los vectores en Python) de Y
tor de unos de tamaño si dado por la función np.ones representan el número de unidades de ataque que tie-
al vector de estado. Al final reescribimos el vector de nen fuerza de ataque ii, para lograr esto creamos un
estado y así el proceso de disolución queda concluido. for que recorre el vector X y usando una máscara en el
Esto queda escrito en código como: vector de estado para obtener un vector que sólo con-
tiene las unidades de ataque con fuerza de ataque ii,
1 vec_estado = np . delete ( vec_estado , luego tomamos el tamaño de este vector y esto lo guar-
i_index ) damos en el vector Y, esto queda plasmado en código
2 vec_estado = np . append ( vec_estado , np . como sigue:
ones ( int ( si ) ) )

1 def extrat_xy ( vec_estado ) :


En caso que se elija fusionar la unidad de ataque con 2

otra unidad, en primer lugar se debe eliminar la unidad 3 N = int ( np . sum ( vec_estado ) )
de ataque si del vector de estado de la misma forma 4 X = np . array ( range ( N ) ) +1
como se hizo antes. Luego se debe elegir una nueva 5 Y = np . zeros ( N )
unidad de ataque sj , este proceso se realiza de forma
similar a como se hizo anteriormente, con la diferencia
Estos vectores los graficamos con la función
de que el vector de probabilidades se calcula como el
plot_simulation en escala log-log junto con una
vector de estado dividido en N − si , pues al eliminar la
regresión potencial. Esta regresión potencial es senci-
entrada si la fuerza total ha disminuido, en caso de no
llamente una regresión lineal por mínimos cuadrados,
restar si el vector de probabilidades no sumará 1 y la
pero en lugar de pasar los vectores X y Y, pasamos el
función np.choice dará un error. Se usa de nuevo la
logaritmo de estos vectores (logaritmo aplicado a cada
función first_index para hallar el índice de la primera
entrada, cabe aclarar). Para realizar la regresión lineal
entrada del vector que coincida con la entrada escogida
por mínimos cuadrados usamos las ecuaciones usuales
anteriormente. Con este índice se elimina la unidad si
de una regresión de este estilo [3].
del vector de estado y por último agregamos una unidad
de ataque al vector de estado de fuerza si + sj usando Para obtener la gráfica de α versus v creamos una nue-
np.append. Esto queda representado en código como va función alpha que toma como argumentos la fuerza
sigue: total del sistema (N), los pasos de tiempo (nsteps) y la
probabilidad de disolución (v). Esta función aprovecha-
1 vec_estado = np . delete ( vec_estado , rá la vectorización que hereda la función de simulación
i_index ) gracias a usar exclusivamente arreglos de numpy. Esta

3
función primero ejecuta una simulación entera, luego que recordar que esta simulación es un proceso estocás-
extraemos los vectores X, Y como ya se hizo con la tico por lo tanto α puede cambiar de una simulación a
función extract_xy, luego se realiza una regresión po- otra.
tencial a estos datos y se retornará la pendiente de esta
Para tener una mayor certeza de este valor realizamos
regresión y su respectivo error. Gracias a que las funcio-
100 simulaciones, promediamos los valores de α y ob-
nes alpha y simulation están vectorizadas podemos
tuvimos la desviación estándar de estos datos, dándo-
pasarle un vector de probabilidades a alpha y nos re-
nos como resultado que α = −2, 7 ± 0,4, de esta forma
tornará la pendiente requerida para cada valor de v.
α ∈ [−3,1, −2,3] y ahora vemos claramente que el valor
Esta función queda escrita como sigue:
de α = −2,5 mencionado por los autores pertenece al
rango que acabamos de calcular
1 def alpha (N , nsteps , v ) :
2 vec_estado = simulation (N , nsteps , v ) En la gráfica se evidencia como existe una gran disper-
3 X , Y = extrat_xy ( vec_estado ) sión de puntos a medida que s aumenta y como explican
4 RegLin = linear_regression (X , Y , True ) los investigadores esto se debe a que "La desviación del
5 return RegLin [1] , RegLin [3] comportamiento de la Ley de Potencias a grandes s se
debe solo al valor finito de N: como no puede haber una
Con esto ya tenemos todas la herramientas necesarias unidad de ataque con una fuerza de ataque mayor que
para obtener las dos gráficas que buscamos y analizar N, el tamaño finito de N distorsiona la ley de potencia
estos resultados a medida que s se acerca a N".
En nuestro investigación también exploramos otros ca-
3. Resultado y análisis sos. A continuación mostramos los resultados obtenidos
para una probabilidad de v= 0.99
Los parámetros usados para realizar todas nuestras si-
mulaciones son N steps = 10, 000 y N = 10,000.
Los resultados obtenidos de la simulación para una pro-
babilidad v = 0.01 se muestran en la figura 1.

Figura 2. Gráfica del Numero de unidades de ataque ver-


sus la fuerza de ataque s para una probabilidad de v=0,99)

La regresión lineal nos arrojo un valor de α = −8, 181 ±


Figura 1. Gráfica del Numero de unidades de ataque ver-
sus la fuerza de ataque s para una probabilidad de v=0,01) 0,003 con un coeficiente de correlación de 0.99. En esta
figura podemos ver como obtenemos muy poca infor-
mación, dado que la probabilidad v es muy grande y el
La regresión lineal implementada nos arrojó un valor de sistema va a tender a ser altamente disperso, obtenien-
α = −2, 459 ± 0,005 con un coeficiente de correlación de do muchas unidades de ataque de fuerza igual a 1. Este
0.99. Indicándonos una gran precisión. Este resultado es un caso especial, donde la probabilidad v es muy alta
posee una diferencia relativa de 1, 64 % con respecto al tenemos un vector de estado altamente disperso, pero
α teórico, que según los investigadores tiene un valor de podemos analizar intuitivamente lo que ocurriría en el
−2, 5. Pero esta diferencia no debe asustarnos, pues hay caso contrario, donde la probabilidad v sea demasia-

4
do baja, tendiendo a cero. En este caso las unidades pendiente del vector de estado. Esto se debía a que
de ataque buscarán unirse constantemente, tendiendo dentro del código se estaban usando algunas variables
a forma un una única unidad de ataque que guarda como variables globales ya que no la interfaz de ciertas
consigo la fuerza total del sistema. funciones no estaba bien implementada
Estos diferentes casos nos llevo a preguntarnos: ¿cómo 3. Tuvimos muchos dolores de cabeza al momentos de
cambia el valor de α en función del valor de proba- crear la función de regresión, y sobre todo al momento
bilidad v? De esta exploración obtenemos la siguiente de graficar la recta de regresión pues al estar la gráfica
gráfica: de ns vs s en escala log-log fue complicado encontrar
una forma de hacer que la recta no fuera ni muy pe-
queña ni muy grande
4. Quisimos analizar la forma funcional de la Figura 3,
pero esta gráfica con corresponde a una función sencilla
de estudiar. Frente a esto planteamos varias hipótesis,
como que la gráfica sufre un cambio de comportamiento
brusco entre 0.6 y 0.8 pues antes de estos valores la
gráfica aparenta un comportamiento lineal, pero luego
de estos valores se aprecia una curva. Otra hipótesis
planteada fue que los valores de configuración de la
simulación no fueron lo suficientemente altos, lo que
se descartó pues jugamos a realizar la simulación con
valores muy altos (una o dos magnitudes más que los
valores que usamos por defecto) y el comportamiento
seguía siendo el mismo.
5. También quisimos usar la función
Figura 3. Gráfica de α vs v, donde las barras de error
está aumentadas en un factor de 100
numpy.random.seed para controlar la aleatorie-
dad del sistema y tener resultados reproducibles. En
un principio creímos que con llamar a la función una
En la figura 3 vemos como el valor de α disminuye a vez en la declaración de las funciones era suficiente,
medida que aumenta la probabilidad de separación v, lo pero luego de una larga búsqueda y de mucha experi-
que nos indica que el vector de estado tiende a ser más mentación llegamos a la conclusión de que es necesario
disperso, teniendo mas unidades de ataque con menor llamar a la función en cada celda del notebook para
fuerza de ataque, lo que significa que hay grupos guerri- que la semilla sea reconocida.
lleros más pequeños y con menor interés por colaborar 6. A nivel de grupo hubieron algunas dificultades al
con otros grupos, esto debido a una alta represión por momento de repartir el trabajo y de coordinarnos para
parte de las fuerzas contrarias o por un desinterés en realizar el informe, pues aunque el código estuvo listo
la lucha. relativamente rápido el informe se estuvo dilatando por
No se pudo establecer una relación funcional entre el algunas semanas.
valor de alpha y el valor de probabilidad v, pero se 7. Una dificultad que nos parece relevante mencionar
observa en la gráfica que para valores de v menores a son las altas expectativas que teníamos frente a nues-
0,7 aproximadamente los datos presentan una relación tras propias exploraciones del problemas, pues se había
distinta a los valores de v mayores a 0,7 planteado explorar, por ejemplo, cómo varía α respec-
Ahora mencionaremos algunas dificultades que apare- to a nsteps, o realizar un proceso de optimización, pero
cieron en el proceso de realizar este trabajo estas ideas no pudieron lograrse por temas de tiempos
y organización del equipo, y algo del trabajo realizado
1. En un inicio tuvimos muchos errores humanos, como en avanzar en estos caminos no terminó por madurar.
olvidar reescribir el vector de estado y por ende tener
un sistema que no evolucionaba
4. Conclusiones
2. En el momento de intentar estudiar simulaciones con
valores distintos a los establecidos por el paper nos di- Confirmamos los resultados de los investigadores del
mos cuenta que la regresión lineal era la misma inde- From old wars to new wars and global terrorism

5
Se observa que a medida que aumenta la probabilidad
de separación v el valor de α disminuye.
Observamos que para valores de v menores a 0,7 apro-
ximadamente la forma funcional de la figura 3 aparenta
ser una recta.
De la misma formar notamos que para valores de v
mayores a 0,7 la forma funcional del la figura 3 no es tan
clara y planteamos como hipótesis que esto se debe a la
naturaleza del sistema y no al tamaño de la simulación.
Cunado v tiende a cero las unidades de ataque tienden
a unirse formando sola unidad de ataque.
Cuando v tiende a uno el vector de estado tiende a
ser muy disperso, y las unidades de ataque tiende a un
valor de fuerza de ataque 1.

Referencias
1. N. Johnson, M. Spagat, J. Restrepo, J. Bohór-
quez, N. Suárez, E. Restrepo, y R. Zarama
(2005).
From old wars to new wars and global terro-
rism..Universidad Javeriana - Bogotá
2. Neil F. Johnson , Mike Spagat , Jorge A. Res-
trepo , Oscar Becerra , Juan Camilo Bohór-
quez, Nicolas Suárez , Elvira Maria Restrepo
y Roberto Zarama (2006).
Universal patterns underlying ongoing wars
and terrorism. Universidad Javeriana- Bogotá
3. Angel. Ardila (2007).
Física Experimental. Universidad Nacional de
Colombia- Bogotá

También podría gustarte