Autómatas celulares, aplicación WinCA VIII
Este es el artículo final de la serie dedicada al programa WinCA, que permite editar y ejecutar autómatas celulares. Para terminar voy a revisar el código que se encarga del autómata en sí, utilizando todas las clases e interfaces explicadas en los artículos anteriores.
Aquí puedes encontrar el primer artículo de la serie sobre la aplicación WinCA.
En este enlace puedes descargar el código fuente de la solución WinCA, y en este otro puedes descargar los ejecutables de la aplicación WinCA, escrita en CSharp con Visual Studio 2015.
Control del autómata
Los autómatas celulares en la aplicación WinCA consisten en una red de celdas que, en principio, pueden tener cualquier distribución espacial y se pueden interconectar libremente entre ellas. Esta distribución e interconexión viene determinada por la clase que implementa el autómata, que debe implementar el interfaz ICANetwork, definido en el espacio de nombres Interfaces de la librería de clases CellularAutomata de la siguiente manera:
public interface ICANetwork : IValueProvider
{
ICAOptimizer Optimizer { get; set; }
ICAStateProvider StateProvider { get; set; }
IPropertyProvider VariableProvider { get; set; }
ICACellProvider CellProvider { get; set; }
Bitmap ActualImage { get; }
Control Editor { get; }
int ActualStep { get; }
void ConfigureToolBar(ToolStrip tb, int ix, bool remove);
void Initialize();
Bitmap Reset();
Bitmap Step();
Bitmap ZoomIn();
Bitmap ZoomOut();
}
Este interfaz hereda los miembros de IValueProvider, para proporcionar datos a las expresiones de cambio de estado, como mostré en el artículo anterior de la serie. Además especifica las siguientes propiedades y métodos:
- Optimizer: En esta propiedad se puede proporcionar una clase ICAOptimizer para optimizar la ejecución del autómata.
- StateProvider, CellProvider y VariableProvider: Con estas propiedades se proporcionan objetos que se utilizan para construir los estados, celdas y variables del autómata.
- ActualImage: Con esta propiedad se obtiene la imagen del autómata en su estado actual.
- Editor: Con esta propiedad se obtiene un control que permite editar el vecindario de las celdas del autómata. Se utiliza en los formularios con los que se edita el autómata.
- ActualStep: Esta propiedad proporciona el paso actual en el que se encuentra el autómata.
- ConfigureToolBar: Este método lo utilizan los formularios de edición / ejecución del autómata para configurar los controles del autómata en la barra de herramientas. En el parámetro tb se le pasa la barra de herramientas a configurar, ix es el índice para el primer control del autómata y remove indica si queremos crear los controles o eliminarlos.
- Initialize: Este método se utiliza para inicializar el autómata.
- Reset: Devuelve el autómata al paso 0.
- Step: Con este método el autómata avanza un paso.
- ZoomIn y ZoomOut: Controlan el tamaño de los pixeles del Bitmap con la imagen del autómata.
En la aplicación WinCA he implementado dos clases de autómatas diferentes, en el espacio de nombres Automata de la librería de clases CellularAutomata. La clase Linear1DCA es un autómata de una sola dimensión, con las celdas dispuestas en una línea. La clase Grid2DCA es un autómata de dos dimensiones, con las celdas dispuestas en una rejilla rectangular.
En el espacio de nombres Controls de la librería de clases CellularAutomata se encuentran los controles utilizados para editar los vecindarios de las celdas de estos dos tipos de autómatas. Linear1DCAEditor permite editar el vecindario del autómata de una dimensión Linear1DCA, mientras que Grid2DCAEditor es utilizado por la clase Grid2DCA para editar el vecindario de las celdas en dos dimensiones. En el caso de implementar otro tipo de autómata diferente, será necesario también implementar un editor apropiado para editar el vecindario de sus celdas. Como estos controles son de uso interno del autómata, no existen restricciones para su implementación.
El formulario GridEditor, en el mismo espacio de nombres, también es de uso interno de estos dos tipos de autómata. Uno de los controles que añaden a la barra de herramientas del editor es un botón para inicializar el autómata. Puesto que los dos autómatas siguen un patrón rectangular, pueden usar el mismo editor de estado inicial, uno solo tiene una línea y el otro tiene más de una, pero por lo demás son iguales. Tampoco existe ninguna restricción para esto. De hecho, no es imprescindible que un autómata proporcione un servicio de inicialización, por lo que este cuadro de diálogo está hecho a medida para estas dos clases y no sigue ninguna regla prefijada.
Edición y ejecución del autómata
EL formulario que implementa la edición y ejecución de los autómatas en la aplicación WinCA es frmAutomata, en el espacio de nombres Forms de esta aplicación. Implementa el interfaz ICAManager, en el espacio de nombres Interfaces también de esta aplicación, definido de la siguiente manera:
public interface ICAManager
{
ICAStateManager StateManager { get; set; }
ICAStateProvider StateProvider { get; }
ICANetwork Automata { get; }
IMainForm MainForm { get; set; }
}
Este interfaz simplemente define los enlaces con la ventana principal de la aplicación, MainForm, y el formulario que controla la edición de los estados, StateManager, y proporciona el objeto que implementa el autómata seleccionado en Automata y el proveedor de estados en StateProvider.
El formulario está dividido en dos partes, una para mostrar el control de edición de vecindario del autómata actual y otra para mostrar la imagen del autómata en el paso actual. Tiene dos barras de herramientas, en la superior se selecciona el tipo de autómata, el proveedor de celdas y el optimizador, y en la inferior están los controles generales del autómata y los controles que proporciona cada tipo particular de autómata.
Y esto es todo con respecto a esta aplicación, espero que la hayáis encontrado útil y podáis desarrollar vuestras propias versiones de autómatas celulares con estas indicaciones.