Bienvenue, estimado estudiante. Hoy vamos a explorar cómo simular un fenómeno específico usando Python: la propagación de un virus en una red de contactos. Esta simulación nos permitirá entender cómo un virus puede propagarse a través de una red de personas conectadas, como en una visioconferencia.
Primero, definiremos algunos conceptos básicos. En esta simulación, cada persona en la red de contactos será representada por un nodo en un grafo. La propagación del virus se modelará como una transmisión de un estado infectado de un nodo a otro.
Para llevar a cabo esta simulación, utilizaremos la biblioteca `networkx` para crear y manejar el grafo, y la biblioteca `matplotlib` para visualizar los resultados.
Aquí tienes el código en Python:
« `python
import networkx as nx
import matplotlib.pyplot as plt
import random
# Función para crear una red aleatoria de contactos
def crear_red(n, p):
G = nx.erdos_renyi_graph(n, p)
return G
# Función para simular la propagación del virus
def simular_propagacion(G, nodo_inicial, p_infeccion):
# Lista de nodos infectados
infectados = set()
# Lista de nodos susceptibles
susceptibles = set(G.nodes)
# Lista de nodos recuperados
recuperados = set()
# Inicializamos la simulación con el nodo inicial infectado
infectados.add(nodo_inicial)
susceptibles.discard(nodo_inicial)
# Simulación de la propagación del virus
while susceptibles:
# Seleccionamos un nodo infectado al azar
nodo_infectado = random.choice(list(infectados))
# Iteramos sobre los vecinos del nodo infectado
for vecino in G.neighbors(nodo_infectado):
if vecino in susceptibles:
# Probabilidad de infección
if random.random() < p_infeccion:
infectados.add(vecino)
susceptibles.discard(vecino)
# Los nodos infectados se recuperan después de infectar a sus vecinos
infectados.discard(nodo_infectado)
recuperados.add(nodo_infectado)
return infectados, susceptibles, recuperados
# Función para visualizar la red y los estados de los nodos
def visualizar_red(G, infectados, susceptibles, recuperados):
nodos_infectados = list(infectados)
nodos_susceptibles = list(susceptibles)
nodos_recuperados = list(recuperados)
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G, pos, nodelist=nodos_infectados, node_color='red')
nx.draw_networkx_nodes(G, pos, nodelist=nodos_susceptibles, node_color='green')
nx.draw_networkx_nodes(G, pos, nodelist=nodos_recuperados, node_color='blue')
nx.draw_networkx_edges(G, pos)
plt.show()
# Ejemplo de uso
if __name__ == "__main__":
# Parámetros de la red
n = 50 # 50 nodos
p = 0.1 # Probabilidad de conexión entre nodos
p_infeccion = 0.3 # Probabilidad de infección
# Crear la red
G = crear_red(n, p)
# Simular la propagación del virus
nodo_inicial = random.choice(list(G.nodes))
infectados, susceptibles, recuperados = simular_propagacion(G, nodo_inicial, p_infeccion)
# Visualizar la red
visualizar_red(G, infectados, susceptibles, recuperados)
```
### Explicación del Código
1. Creación de la Red:
- Utilizamos la función `crear_red` para generar una red aleatoria de contactos usando el modelo de Erdős-Rényi. Este modelo toma como parámetros el número de nodos `n` y la probabilidad de conexión `p`.
2. Simulación de la Propagación del Virus:
- La función `simular_propagacion` toma como entrada el grafo `G`, el nodo inicial infectado y la probabilidad de infección `p_infeccion`.
- Inicializamos tres conjuntos: `infectados`, `susceptibles` y `recuperados`.
- Simulamos la propagación del virus hasta que no haya más nodos susceptibles. En cada iteración, seleccionamos un nodo infectado al azar y probamos la infección de sus vecinos.
3. Visualización de la Red:
- La función `visualizar_red` usa `matplotlib` para mostrar la red y los estados de los nodos (infectados en rojo, susceptibles en verde y recuperados en azul).
### Conclusión
Este código nos permite simular la propagación de un virus en una red de contactos, proporcionando una visión gráfica de cómo el virus se propaga a través de los nodos. Puedes ajustar los parámetros para experimentar con diferentes escenarios y observar cómo afectan la probabilidad de conexión y la probabilidad de infección a la propagación del virus.
Espero que esta explicación te haya sido útil. Si tienes alguna pre