miércoles, 8 de febrero de 2012

Modelo Determinista: Rutas de Trenes

Como sistema determinista escogí un sistema que se conforma de rutas de trenes. Lo considero determinista ya que al seguir una ruta predeterminada, y solo detenerse en lugares dados, no da opción a que al azar afecte el funcionamiento del sistema. 

Sistema Determinista

Un sistema determinista es un sistema cuyos estados no se ven afectados por el azar. Osea si conocemos el estado actual del sistema, y las variables de entrada, el comportamiento de salida siempre será el mismo.

Mi elección:

Como sistema determinista escogí el comportamiento de los trenes-metro en una ruta.


¿Por qué es determinista?

Las rutas de trenes son estáticas, ya que los trenes se ven obligados a seguirlas, y su comportamiento es el mismo durante todo el recorrido, acelerando entre estaciones, y deteniendose en ellas, para luego repetir, lo único que cambia de esto, y también se repite dentro de todo el recorrido, es cuando llega al final donde da vuelta para repetir el viaje.

¿Cómo lo represento?

Para representarlo gráficamente es necesario pensar en las entradas y salidas para saber como se comportará el sistema conforme a estas. Podemos saber que si la estación está cerca, el tren disminuirá su velocidad hasta detenerse por completo, entonces cuando ya se encuentra en la estación, este comportamiento será similar cerca del final, ya que debe frenar para dar vuelta y continuar el recorrido en reversa. De esta forma podemos pensar en una línea de estados tan grande como estaciones existan en dicha ruta y agregándole el "inicio" y el "fin".

Entradas                              Acción                                       Salida

-Estación cerca                    Frenar                                 -Tren disminuyendo velocidad
-Estacion, tipo de vuelta       Abrir puerta determinada      -Esperar 
-Final de Ruta cerca             Frenar                                 -Tren disminuyendo velocidad
-Final de Ruta                      Dar vuelta                           -Tren dando vuelta

Explicación del "diagrama":

En el diagrama podemos ver el recorrido, usando dos estaciones como ejemplo y un Inicio del sistema(la ruta) y un fin. El sistema iniciaría la ruta del tren por la izquierda, aceleraría, y presionaría el freno antes de llegar a la estación 1 para disminuir la velocidad hasta detenerse al llegar a la estación, aquí dependiendo del tipo de vuelta que sea, tomando como 0 la vuelta inicial y 1 la vuelta de regreso se abriría una puerta determinada al estar en la estación y se esperaría un determinado tiempo. 

Ahora se aceleraría de nuevo, se frena antes de llegar a la estación 2 hasta detenerse en ella, y se repite el proceso de la estación 1. El tren vuelve a acelerar, y ahora frenará antes de llegar a la vuelta, para poder dar la vuelta y repetir el recorrido pero en orden inverso, a lo cual ahora se abrirá la puerta contraria.

Pseudocódigo:

#Variables globales
#Lista con la ruta a recorrer
ruta = [Inicio, E1, E2, ..., En, Fin]
#Estado de vuelta, si es de Inicio-Fin o de Fin-Inicio, para saber que puertas se abren
estado_vuelta = 0
#Velocidad del tren, inicialmente 0
velocidad = 0
#Posicion actual, inicialmente 0
actual = 0

#Funcion que acelera hasta llegar a un limite de velocidad mientras no este cerca de la estación
funcion acelerar(estacion):   
     while(ruta[actual] != cerca_estacion):
           if velocidad != velocidad_limite:
                  velocidad++
           else:
               frenar()

#Función que disminuye la velocidad hasta que sea 0, y manda llamar a la función de abrir puerta
funcion frenar(estacion):
      while(velocidad != 0):
           velocidad--
      abrir_puerta()

#Abre la puerta determinada por el estado en el que se encuentre
funcion abrir_puerta():
      if estado_vuelta = 0:
           abrir_izquierda()
      else:
           abrir_derecha()

#Función que voltea la ruta mágicamente
funcion vuelta(ruta):
     voltear_ruta(ruta)

#Funcion que se encarga de simular la ruta, corriendo infinitamente.
#Se aumenta una posicion desde el inicio para moverse a la siguiente, y si la siguiente llega a ser el fin o el inicio, da la vuelta para volver a iniciar, colocando actual = 0 para recorrer la ruta de nuevo.

funcion ruta():
     while(true):
          actual++
          acelerar(ruta[actual ])
          if ruta[actual] == Fin or ruta[actual] == Inicio:
               vuelta(ruta)
               actual = 0

1 comentario: