En una entrada precedente sobre los atascos de tráfico quedó pendiente explicar cómo hacen los expertos para simular la circulación. (Los físicos le llamamos simular a reproducir en el ordenador el comportamiento de un sistema real). El tema en sí tiene aliciente: poder indicar en señales dinámicas cuánto tiempo queda para llegar a cierto destino, o predecir las congestiones. Además, estos programas informáticos ilustran muy bien las técnicas que se emplean para analizar muchos otros problemas.

 

De lo que se trata es de dar unas reglas de comportamiento para cada vehículo, y luego aplicarlas recursivamente a cierto número de ellos. Las reglas indican, en resumidas cuentas, a qué velocidad se moverá un automóvil según las circunstancias en que se encuentre (si tiene otros coches por delante o no, cuál es el límite de velocidad, etc.). Conociendo la situación de los automóviles en un tiempo inicial, esas reglas permiten calcular la velocidad de cada uno, y con ello el lugar donde se encontrarán en un instante posterior. En ese momento, se vuelven a aplicar las reglas para obtener la velocidad de cada vehículo, su desplazamiento, una nueva posición, y así sucesivamente.

 

En líneas generales, esas reglas se pueden formular bien de manera continua, bien de manera discreta. Cada método tiene sus ventajas y sus inconvenientes. Si la posición, el tiempo, la velocidad, pueden tomar cualquier valor, las reglas son continuas. (Para los entendidos: la regla de evolución es una ecuación diferencial para la aceleración). La alternativa consiste en discretizar las variables. Así, el espacio -la carretera- se divide en casillas (de 7.5 metros de largo en el caso que vamos a exponer) que pueden estar ocupadas o no por un vehículo; el tiempo progresa a pequeños saltos discretos (aquí los tomaremos de 1 segundo: más o menos el tiempo de reacción del conductor); la velocidad sólo puede asumir ciertos valores (que serán estos cinco: cero, treinta, sesenta, noventa y ciento veinte kilómetros por hora); etcétera. Vamos a implementar a continuación el modelo de Nagel-Schreckenberg, perteneciente a esta categoría (que se denominan autómatas celulares).

 

Las reglas son las siguientes.

1.- Todos los vehículos intentan acelerar hasta la velocidad máxima, es decir, en cada paso de tiempo los coches aumentan su velocidad en un grado. Si la velocidad alcanza el valor máximo permitido, que es de 120 km/h, se mantiene.

2.- No hay accidentes. Si con la regla anterior se alcanzara al coche precedente, se frena reduciendo la velocidad lo suficiente para no chocar.

3.- Algunos conductores, al azar, frenan un poco: reducen su velocidad en un escalón con cierta probabilidad (para la cual se suele tomar el valor 1/3). Eso se hace para modelizar algunos factores que han de tenerse en cuenta: reacciones desproporcionadas ante los frenazos, distracciones, cambios en las condiciones de la carretera, instantes de duda del conductor, y situaciones por el estilo.

 

Una vez establecida la velocidad de cada coche, se desplazan éstos las casillas que corresponda según su velocidad (por poner un caso: 120 km/h, con esta discretización, corresponde a unas 5 casillas en el paso de tiempo de un segundo).

 

El problema se lo planteé a tres estudiantes de tercero: Isidro Cortés, Santiago Josa y Adrián César, que han elaborado un programa para Matlab (al final del todo copio el código, un poco retocado). No es complicado, pero claro, una vez que funcionan, todos los programas parecen fáciles ... Hay algunas sutilezas adicionales, como las condiciones de contorno periódicas, o la ocupación inicial al azar, pero tienen una importancia secundaria. Veamos qué se obtiene.

 

Se empieza con la carretera discretizada en casillas, en las que se colocan algunos coches (los puntos de colores):

           

 

A cada paso de tiempo se calcula la velocidad y se mueven los coches; por ejemplo:

           

 

El coche azul se va moviendo despacio (sólo avanza una casilla por unidad de tiempo), el rojo más rápido, y en el instante t2 el coche verde se ha parado. Es más conveniente dibujar sólo las trazas de los coches (las líneas coloreadas de la ilustración de arriba). En un gráfico así, el eje vertical representa el tiempo (que corre hacia abajo) y el horizontal el espacio (los coches avanzan hacia la derecha). Las trazas se dibujarán de color azul si el coche avanza, y en rojo si el coche está parado. Cuanto más inclinada esté la traza, más lentamente se mueve el coche; una línea vertical, roja, indica que se ha detenido.

El
tiempo
corre
hacia
abajo

         

Como se ve, los atascos (las zonas donde los coches se ven forzados a detenerse, que son los trazos rojos) se van corriendo hacia atrás, o sea, a contracorriente del tráfico, tal y como se observa en la vida real. El modelo es simple, pero reproduce bastante bien algunas caracerísticas de la circulación rodada.

 

 

            Lo que sigue son detalles que seguramente sólo interesarán a quienes tengan conocimientos de programación. 

           
A continuación se proporciona el programa informático. El esquema para cada paso de tiempo es como sigue:

 

(1) aceleración hasta la velocidad máxima:

            velocidad <- mínimo (velocidad+1, velocidad máxima)

(2) no hay accidentes:

            velocidad <- mínimo (velocidad, distancia al coche precedente / paso temporal)

(3) reducción aleatoria de la velocidad

            velocidad <- velocidad - 1 (con probabilidad 0.33)

(4) desplazamiento de los coches: la distancia recorrida es velocidad x tiempo (que vale 1)

            posición <- posición + distancia recorrida  

            
            Sigue el código para Matlab. Téngase en cuenta que no ha sido elaborado con más pretensión que la de realizar un ejercicio; por tanto no está optimizado para ejecutarse velozmente, ni es el más eficaz.

 

clear, clf

tam_carretera=200; tiempototal=200;

densidad_coches=0.15; prob_frenada=0.33; vel_maxima=5;

 

ocup=rand(tam_carretera,1); ocup=(ocup>(1-densidad_coches));

posicion=find(ocup==1);

num_coches=sum(ocup);

velocidad=floor((vel_maxima)*rand(num_coches,1));

vmax=ones(num_coches,1)*vel_maxima;

vmin=zeros(num_coches,1);

vazar=zeros(num_coches,1);

axis([0 tam_carretera 0 tiempototal]); hold on

pos_antigua=posicion;

 

for tiempo=1:tiempototal   

    pos=[posicion;posicion(1)]; brecha=diff(pos);

    ind_neg=find(brecha<1); brecha(ind_neg)=tam_carretera+brecha(ind_neg);

   

    velocidad=min(velocidad+1,vmax);

    velocidad=min(velocidad,brecha-1);

    vazar=(rand(num_coches,1)>prob_frenada)*(-1);

    velocidad=max(velocidad+vazar,vmin);

    posicion=posicion+velocidad;

   

    ind_fuera=find(posicion>tam_carretera);

    posicion(ind_fuera)=posicion(ind_fuera)-tam_carretera;      

   

    for contador=1:num_coches,

        if(posicion(contador)>pos_antigua(contador))

            line([pos_antigua(contador) posicion(contador)],[tiempo tiempo+1]);

        elseif(posicion(contador)==pos_antigua(contador))

            line([pos_antigua(contador) posicion(contador)],[tiempo tiempo+1],'Color','r');

        end

    end

    pos_antigua=posicion;

end

Lee también en SciLogs

Ángel Garcimartín Montero
Ángel Garcimartín Montero

Catedrático de física (especialidad: materia condensada) en la Universidad de Navarra.

Ha llevado a cabo investigaciones (de carácter marcadamente experimental) sobre dinámica no lineal, inestabilidades, caos y sistemas físicos fuera del equilibrio; la fractura de los materiales frágiles; la transición vítrea, y los medios granulares. Actualmente se interesa en los atascos de materia activa (por ejemplo, los seres vivos).

Página web personal

Sobre este blog

La materia blanda es la que se deforma fácilmente cuando se somete a esfuerzos o fluctuaciones térmicas: líquidos, coloides, materiales granulares, polímeros, espumas, algunos materiales biológicos. Pero en sentido figurado ¿no es también materia blanda la ciencia, la universidad, o incluso la sociedad?

Ver todos los artículos