8 votos

Una plaga de propagación en un gráfico

Este es un problema que he oído de un amigo. Yo no resolverlo, así que quiero publicar aquí porque es un problema interesante.

La isla de la foto de abajo se compone de nueve ciudades. Un día, una plaga llega a $G$. A pesar de que los ciudadanos hacen su mejor esfuerzo para contener la plaga, cada camino entre infectados y no infectados pueblo tiene un $10\%$ de probabilidad de cada día para contagiar a los no infectados. ¿Cuánto tiempo se debe esperar hasta que toda la población está infectada?"

enter image description here

Mi intento:

La probabilidad no es mi fuerte, así que no podía llegar muy lejos con este problema. La ingenua manera de hacerlo es construir un árbol de probabilidad, pero siento que tiene que haber una manera más sencilla para hacer con los grados de los vértices. El problema sigo corriendo, sin embargo, es que usted puede fácilmente calcular las probabilidades de que el primer día - 10% para cada uno de los vecinos de la ciudad, 20% en general, pero más allá de que tiene demasiados posible infección mapas para hacer significativos los cálculos.

También me di cuenta de que el último nodo de estar infectados (en términos de probabilidad) será el más alejado $G$, $A$ - 4 bordes de distancia. Porque cada día hay un 10% de probabilidad de que uno de los bordes de ser infectadas, tenemos un tiempo promedio de $10*4$=40 días para llegar a $A$. Es esta una solución correcta?

Si no, ¿cuál es la solución a este problema?

EDIT: Las respuestas publicadas hasta el momento han sido increíbles, pero este problema fue dada para con talento matemático los estudiantes de escuela secundaria así tiene que ser una solución sencilla (en términos de matemática utilizada, no por el argumento en sí mismo). Voy a ofrecer una recompensa para una respuesta cuando se disponga de ella.

5voto

fanvacoolt Puntos 111

Como ya se ha mencionado aquí, una forma de abordar este problema es a través de las Cadenas de Markov. Dado que la solución depende en gran medida de la conectividad gráfico, creo que no es posible obtener una forma cerrada.

Para su instalación particular, usted tiene una Cadena de Markov con $2^9 = 512$ estados, cada estado puede también ser representado por un vector de $9$ números, se $1$ si la ciudad está infectada y $0$ por otra parte, también este vectores para mayor comodidad se pueden enumerar como decimales $0 - 511$.

Entonces usted tendrá que construir la matriz de transición, que se basa en la conectividad de grafo. Te voy a dar un ejemplo en la versión simplificada con $4$ ciudades, donde $A \ \rightarrow \{B\}$, $B \rightarrow \{A, C, D\}$, $C \rightarrow \{B, D\}$, $D \rightarrow \{B, C\}$. Supongamos que usted ha estado $\{0, 1, 1, 0\}$. Posibles transiciones de ella son:

  • {1, 1, 1, 0} - la peste viajes de$B$$A$, con una probabilidad de $0.081$;
  • {0, 1, 1, 1} - la peste viajes de $B$ $D$o de$C$$D$, con una probabilidad de $0.171$;
  • {1, 1, 1, 1} - tanto en $A$ $D$ infestados, la probabilidad de $0.019$;
  • {0, 1, 1, 0} - no hay nuevas infestaciones, la probabilidad de $0.729$.

Después de haber terminado todas las posibles $512$ estados (obviamente, los estados $\{0, 0, \ldots, 0\}$ $\{1, 1, \ldots, 1\}$ son de absorción), se obtendrá la matriz de transición $M$ donde $M[S_0, S_1]$ es la probabilidad de transición desde el estado de $S_0$$S_1$.

Después de eso, si $T \in \mathbb{Z}^+$ es el día cuando el pasado de la ciudad(s) obtener infestados, $M^T[S_0, \{1, 1, \ldots, 1\}]$ le da la distribución de probabilidad del tiempo $T$. $M^T$ es la matriz de $M$ multiplicado por sí mismo $T - 1$ a veces, y $S_0$ es su estado inicial. Para cualquier finito $T$ tendrás $M^T[S_0, \{1, 1, \ldots, 1\}] < 1$, pero converge a uno con bastante rapidez.

De hecho, me interesé y tomó un poco de tiempo este código en Python. Después de $500$ días $M^{499}[S_0, \{1, 1, \ldots, 1\} > 1 - 10^{-15}$, lo suficientemente bastante, diría yo. Llegué $E[T] \approx 34.554$ días y de densidad de probabilidad siguiente gráfico. Después de $79$ días todos los pueblos infestados con probabilidad de $> 0.99$.

Probability distribution f(T)

Curiosamente, a partir de la peste en la mayoría de quitar de la ciudad $A$ no ayuda mucho - $E[T]$ hace $38.038$ días, sólo poco más de la $3$ extra de días en promedio. Por otro lado, si la peste de inicio en el centro de la ciudad $E$, $E[T]$ vuelve $24.814$ días y $64$ días es suficiente para obtener todos los pueblos infestados con probabilidad de $> 0.99$.

ADEMÁS: he corregido el ejemplo sobre el cálculo de probabilidades de transición de los resultados y la ejecución de simulaciones para comprobar ellos. Basado en el $200000$ rondas para cada caso, tengo $E[T] = 34.539$ días cuando la peste se inicia en $G$, e $E[T] = 38.063$ días cuando la peste se inicia en $A$.

2voto

saulspatz Puntos 116

Otra manera de acercarse a este, más accesibles para los estudiantes de escuela secundaria que las cadenas de Markov, es a través de la simulación. En lugar de tratar de resolver el problema exactamente, simular la propagación de infecciones, muchas veces en un equipo y calcular el promedio de tiempo para infectar a todos los pueblos. He aquí un pequeño script en python que hace esto.

import random
a,b,c,d,e,f,g,h,i = 'A B C D E F G H I'.split()
edges = {a:{b},b:{a,e},c:{e,f},d:{e,g},e:{b,c,d,h,i},
         f:{c,i},g:{d,h},h:{e,g,i},i:{e,f,h}}
for x,y in edges.items():
     for z in y: assert x in edges[z]
random.seed()
universe={a,b,c,d,e,f,g,h,i}
trials = 1000
average = 0 
for _ in range(trials):
     infected = {a}
     days = 0
     while infected != universe:
          days += 1
          roads = {(town,x) for town in infected for x in edges[town]}
          for road in roads:
               if random.random()<.1:
                    infected.add(road[1])
     average += days
print(average/trials)

Me encontré con esto de una vez y consiguió $37.927.$ Hay varias posibles mejoras. En primer lugar, ejecute más de $1000$ ensayos. Segundo, hacer un histograma de los resultados, en lugar de calcular la media. En tercer lugar, se puede calcular el error estándar, para calcular un intervalo de confianza para su estimación.

Ya que el tamaño de la matriz de transición crece exponencialmente con el número de ciudades, me imagino que si algo como esto se hace realmente en epidemiología, es más probable hecho con la simulación de cadenas de Markov, aunque estoy seguro de que la simulación sería mucho más sofisticados que los de este.

EDITAR

Con 100.000 ensayos, yo siempre obtienen un promedio de $38$, muy diferente de fanvacoolt la respuesta. No puedo ver ningún error en mi código, así que me voy a tener que probar la cadena de Markov enfoque-pero no esta noche.

EDITAR Escribí un guión para calcular el número esperado de días hasta que todos los pueblos que están infectados, el uso de cadenas de Markov y la matriz fundamental. Se produce un resultado en perfecto acuerdo con las simulaciones, por lo que debe ser correcto. Aquí está la secuencia de comandos:

import numpy as np
from itertools import combinations
from itertools import chain

a,b,c,d,e,f,g,h,i = 'A B C D E F G H I'.split()
edges = {a:{b},b:{a,e},c:{e,f},d:{e,g},e:{b,c,d,h,i},
         f:{c,i},g: {d,h},h:{e,g,i},i:{e,f,h}}
universe={a,b,c,d,e,f,g,h,i}
for x,y in edges.items():
    for z in y: assert x in edges[z]
weight={a:1,b:2,c:4,d:8,e:16,f:32,g:64,h:128,i:256}

def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = set(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

def index(s):
    "convert a set of towns to an array index"
    return sum(weight[town] for town in s)

def transitionMatrix():
    "construct and return the trnsition matrix"
    P=np.zeros((512,512)) # transition matrix
    for old in powerset(universe):
        idx = index(old)
        roads = {(town,x)  for town in old for x in edges[town] if x not in old}
        r = len(roads)
        for t in powerset(roads):
            k=len(t)
            prob = .1**k*.9**(r-k)
            spread = {x[1] for x in t}
            new = set(old) | set(spread)
            jdx=index(new)
            P[idx, jdx] += prob
    return P

P = transitionMatrix()
Q= P[1:511,1:511]  # transitions between transient states
del(P)
N = np.linalg.inv(np.eye(510)-Q)  #fundamental matrix
N=N@np.ones((510))

def steps(s):
    "Average number of days until all twons infected starting from set s"
    return N[index(s)-1]  # row 0 was deleted from transition matrix

print(steps({'A'}))

Ejecuta esto produce 38.0376337969. Incluso con sólo $1000$ ensayos, la simulación de la secuencia de comandos produce consistentemente cerca de los valores de $38$.

UNA ÚLTIMA COSA

Si consideramos sólo a los estados que son realmente alcanzable empezar con sólo Una ciudad infectada, hay 51 estados. Aquí es un script de python que se calcula.

from itertools import combinations
from itertools import chain

a,b,c,d,e,f,g,h,i = 'A B C D E F G H I'.split()
edges = {a:{b},b:{a,e},c:{e,f},d:{e,g},e:{b,c,d,h,i},
              f:{c,i},g:{d,h},h:{e,g,i},i:{e,f,h}}
universe={a,b,c,d,e,f,g,h,i}

def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = set(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

def possible(s):
    '''
    s is a possible state if it includes A and the induced subgraph is connected
    '''
    if a not in s: return False
    Q = {a}
    visited = set()
    while Q:
        x = Q.pop()
        visited.add(x)
        for y in edges[x]:
            if y in s and y not in visited:
                Q.add(y)
    return len(s)==len(visited)

possibilities = []
for s in powerset(universe):
    if possible(s): possibilities.append(s)

print(len(possibilities))
for p in possibilities:print(''.join(sorted(p)))

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X