• No results found

Interaction Between Learning Stage and Feedback for "One of the

Plataforma y herramientas de desarrollo

Se propusieron dos frameworks para facilitar la implementación del proyecto. A continuación se analizarán las características de ambos y los motivos que nos llevaron a la elección del framework utilizado. Tras este análisis, se describirán los posibles entornos de programación con los que llevar a cabo la implementación del sistema a desarrollar. Antes de comenzar, aclarar que un framework es una librería potente que se usa como base para desarrollar aplicaciones. Normalmente contiene una arquitectura bien definida, así como un conjunto de componentes reusables diseñados para simplificar el proceso de desarrollo, aumentar la consistencia y productividad y mejorar la calidad final de la aplicación. Permite a los diseñadores centrarse en el problema a resolver, olvidándose de los detalles de implementación de más bajo nivel.

Los frameworks propuestos son:

ParadisEO: es un framework de caja blanca orientado a objetos que se emplea para el diseño de distintos tipos de metaheurísticas: híbridas, distribuidas y paralelas. Además proporciona un amplio abanico de propiedades como: algoritmos evolutivos, búsquedas locales optimización de enjambres de partículas, los mecanismos más comunes de hibridación y los modelos más estandarizados de paralelización y distribución, etc. Este alto contenido y utilidad fomentan su uso a nivel internacional. ParadisEO está basado en una clara separación conceptual entre los métodos de

2013

46 solución y los problemas que dichos métodos tratan de resolver. Esta separación confiere al usuario la máxima reusabilidad de código y diseño. Más allá, la baja granularidad de las clases del framework proporciona una alta flexibilidad comparado con otros existentes. Se trata de uno de los únicos capaces de proporcionar los modelos más comunes de paralelización y distribución. Su implementación es portable en máquinas de memoria distribuida, así como en multiprocesadores de memoria compartida, ya que utiliza librerías estándar como MPI, PVM y PThreads. Los modelos pueden ser explotados de manera transparente, solo es necesario instanciar las clases asociadas proporcionadas. [2010]

JMetal: Su nombre proviene de Java Metauristics Algoritms, y es un framework orientado a objetos basado en Java. Enfocado en el desarrollo, experimentación y estudio de las metaheurísticas para resolver problemas de optimización multiobjetivo, JMetal proporciona un completo conjunto de clases que pueden ser utilizadas como los bloques para construir metaheurísticas multiobjetivo. Aprovechándose de la reutilización de código, los algoritmos comparten los mismos componentes base, como puede verse en la implementación de los operadores genéticos y los estimadores de densidad, lo que facilita el desarrollo de nuevos algoritmos multiobjetivo. Implementa varias metaheurísticas multiobjetivo, además de poner a disposición varios de los problemas incluidos en estudios de rendimiento. Permite paralelización para la ejecución de experimentos con varios problemas en paralelo, mediante el uso de hilos. JMetal proporciona también indicadores de calidad para calcular el rendimiento, así como una conjunto de utilidades que ayudan a llevar a cabo estudios experimentales.[Antonio, 2011]

Tras haber implementado diversos ejemplos con ambos frameworks, trabajar con JMetal resultó mucho más cómodo. Resultaría poco creíble negar el peso que el lenguaje de programación JAVA ejerció a la hora de su decisión.

Este lenguaje, además de aportar las ventajas de la orientación a objetos y permitir desarrollar aplicaciones bastante portables, proporciona una extensa interfaz de programación de aplicaciones (del inglés API, Application Programming Interface). A su vez, al tratarse de un lenguaje muy utilizado, es posible encontrar un gran número de utilidades y bibliotecas, desarrolladas en este lenguaje para ámbitos diversos.

Para la implementación de la herramienta final a utilizar por los usuarios se utilizó la Plataforma de Netbeans, una herramienta que trae consigo este IDE que permite la reutilización de forma sencilla de sus propios módulos. Esta forma de desarrollo, equivalente al Rich Client Platform de Eclipse, brinda un sinnúmero de posibilidades al reutilizar los componentes, clases e interfaces existentes ya en las API’s contenidas dentro del Netbeans.

2013

47

Diseño de la aplicación

Diseño del Cromosoma:

Primeramente debemos ver que sería un individuo en la solución de este modelo en específico: para el problema en cuestión debemos encontrar una combinación de tecnologías que satisfaga la demanda eléctrica en un territorio, además de otras restricciones, por lo que un individuo sería un número de tecnologías a instalar en un territorio, es decir, la cantidad de cada una de las tecnologías a instalar. Visto así, el i-ésimo gen de un individuo seria la cantidad de tecnologías de tipo i a instalar, por lo que podemos decir que los individuos no son más que arreglos de números enteros donde un número n representa la cantidad de tecnologías de tipo i a instalar, donde i es el índice que ocupa n en el arreglo.

Para esto utilizamos el tipo de solución que tiene el JMetal, ArrayInt,, se representó cada uno de los años del periodo de estudio como una arreglo diferente, así como el tipo de tecnología a instalar, sea principal o de reserva, por lo que, por ejemplo, para un periodo de estudio de p años, cada individuo estará formado por p*2 arreglos, donde los primeros arreglos representan las tecnologías principales a instalar en cada uno de los años , mientras que las restantes representan las tecnologías de reserva a instalar en cada uno de los años , cada una de los arreglos tendrá como tamaño máximo la cantidad de tecnologías existentes de acuerdo al tipo que representen, sea principal o de reserva. Para poder lograr esto fue necesario crear un tipo de solución nuevo, utilizando las facilidades que brinda JMetal, donde solamente es necesario crear una clase que herede de SolutionType e implementar dos métodos abstractos: createVariables y copyVariables. El primero será invocado cuando se crea la variable y es el encargado de crear todos los arreglos de enteros, es decir, los ArrayInt, de acuerdo a la cantidad de variables del problema en cuestión y a la cantidad de tecnologías de cada tipo existentes. El segundo, se utiliza cuando es necesario copiar una variable, como su nombre lo indica. Al implementar un tipo de solución nuevo es necesario crear nuevos operadores de cruce y mutación capaces de realizar dichas operaciones sobre las variables creadas.

Operador de Cruce:

La operación de cruce se diseñó a partir del operador de cruce en dos puntos. Se realiza teniendo en cuenta cada uno de los años de cada variable, los dos padres son pasados al operador como un arreglo con dos soluciones y se crean dos descendientes idénticos a cada uno de los padres respectivamente. La figura 4 muestra esta primera operación.

2013

48 Padre

Descendiente

Figura 4: Creación de los descendientes

En la figura anterior se toma como ejemplo dos soluciones con 10 variables, lo que representa, como se ha dicho anteriormente, que el problema en cuestión tiene como período de estudio 5 años, los elementos A0, … , A4 representan los ArrayInt de las tecnologías principales en cada uno de los

años, los restantes representan las tecnologías de reserva. Este proceso se realiza para los dos padres, en la figura se representa solamente la creación de uno de los descendientes.

Seguidamente se realiza la operación de cruce de los padres para la creación de los hijos, efectuándose la operación de cruce en dos puntos para cada uno de los años representados en las variables, es decir, se realizará el cruce en dos puntos utilizando como padres a cada uno de los Ai

que representan el número de tecnologías a instalar en cada uno de los años en los padres originales. La operación de cruce en dos puntos que se realiza en los Ai comienza primeramente generando un

numero aleatorio utilizando la clase PseudoRandom del JMetal, dicho número se compara con la probabilidad de cruce que contiene el operador. Luego se generaran los dos puntos de cruce aleatoriamente utilizando la clase antes mencionada, estos dos números se generarán entre 0 y el tamaño del arreglo y no podrán ser iguales.

Una vez seleccionados los puntos de cruce se prosigue a efectuar el ajuste de cada uno de los descendientes, copiando lo elementos de padre 1 hacia el hijo 2 exceptuando los números que se encuentran entre cada uno de los puntos seleccionados hasta terminar con el descendiente 1, para el descendiente 2 se realiza la misma operación solo que el orden de los padre cambia. En la figura 5 se muestran como quedarían los descendientes tomando como ejemplo las posiciones de cruce en las 2 y 6 respectivamente. Los valores seleccionados en rojo representan los genes heredados del padre 1 y los azules los heredados del padre dos.

A0 A1 A2 A3 A4 A5 A6 A7 A8 A9

2013

49 Descendiente 1 N0 N1 N2 N3 N4 N5 N6 N7 N8 N9 Descendiente 2 N0 N1 N2 N3 N4 N5 N6 N7 N8 N9

Figura 5: Descendientes resultantes del cruce.

Cabe destacar que para cada uno de los arreglos se comprueba la probabilidad de cruce calculando un número aleatorio por lo que puede ocurrir que los descendientes n de algún cruce queden idénticos a los padres, pero la probabilidad de que esto ocurra es sumamente pequeña. Se comprueba la probabilidad de cruce para cada uno de los arreglos y no para la variable completa una sola vez porque, como es evidente, es menos probable, utilizando la primera vía, que todos los arreglos de los descendientes sean iguales que los de los padres.

Todas estas operaciones están implementadas en la clase TotalCostTwoPointCrossover que hereda de la clase Crossover del JMetal.

Operador de Mutación:

El operador de mutación diseñado es bastante sencillo, solamente recibe una solución en forma de Object como parámetro, luego le realiza la mutación a cada uno de los arreglos representando los años de cada tipo de tecnología. Antes de realizar cualquier operación dentro del arreglo, primeramente calcula un número aleatorio y lo compara con la probabilidad de mutación, en caso de ser menor, realiza las operaciones dentro del arreglo.

Este operador simplemente selecciona dos elementos, de forma aleatoria, dentro de arreglo, los cuales no pueden ser iguales. Una vez seleccionados, intercambia sus posiciones.

Como hemos visto el accionar de este operador muy sencillo, todas sus operaciones están implementadas en la clase TotalCostSwapMutation la cual hereda de Mutation, la clase que representa los operadores de mutación dentro del JMetal.

2013

50 Operador de selección:

Como operador de selección se seleccionó al BinaryTournament el cual esta implementado en el JMetal. Este operador selecciona dos soluciones de la población de forma aleatoria y los compara de acuerdo a los criterios de comparación que realiza el algoritmo NSGA-II, explicados anteriormente en este documento, en caso de ser las dos iguales de buenas siguiendo este procedimiento, retorna la de mayor crowding distance de las dos soluciones, de ser igual esta también, retorna una de las dos de forma aleatoria.

Principales clases en el diseño de la aplicación CTAProblem

Esta clase es la encargada de manejar el diseño y la creación de los individuos así como la de evaluar las funciones objetivos y las restricciones y colocar los resultados obtenidos en cada una de las soluciones. En el constructor de esta clase se crean los individuos que formarán las soluciones. Esta clase hereda de la clase abstracta Problem que contiene JMetal, esta clase tiene dos métodos abstractos que deben ser implementados: evaluate y evaluateConstraints, el primero es el encargado de evaluar las funciones objetivos, llamando a los métodos evaluateCTA y evaluateEmisiones, para una solución dada como parámetro y colocar los valores obtenidos en la misma, el segundo es el encargado de evaluar las restricciones del problema, en cuanto a las restricciones es necesario primeramente analizar como JMetal maneja las restricciones. JMetal utiliza el método evaluateConstraints de los problemas para calcular cada una de las restricciones, luego es necesario colocar en la solución el número de restricciones que no se satisfacen utilizando el método setNumberOfViolatedConstraint, luego se realiza una especie de promedio de cumplimiento de las restricciones que es con la que el JMetal compara las soluciones, en este framework una solución x domina a otra y de acuerdo a las restricciones siguiendo los casos:

Solución x es factible y solución y es no factible.

Soluciones x e y son no factibles las dos, pero x tiene un menor promedio de violación que y. Soluciones x e y son factibles y x domina a y.

De acuerdo con lo antes visto y teniendo en cuenta que el modelo debe cumplir estrictamente todas las restricciones, se implementó de forma que primeramente se cuenta cuantas restricciones no cumple la solución, luego se le asigna como promedio de violación el valor 0 – número de restricciones que viola. Esto se hace porque en el framework se comparan las soluciones de acuerdo a este valor promedio y cuando los valores son negativos la mejor solución será la más cercana a

2013

51 cero, además una solución que cumpla todas sus restricciones, con promedio igual a cero, siempre será mejor que una que al menos viole una.

Esta clase cuenta con varios atributos, los más importantes son tres listas que almacenan las tecnologías principales, las tecnologías de reserva y los datos de las demandas y el incremento de las mismas en cada uno de los años de estudio.

Las listas de las tecnologías están organizadas por el orden en que fueron insertadas en la aplicación, este orden no se debe alterar pues cada una las posiciones de las tecnologías en dichas listas equivalen a las posiciones de los valores de los arreglos de enteros correspondientes en las soluciones, es decir, en un arreglo que representa las tecnologías principales, si en la posición i está el número k, esto significa que se instalarán k tecnologías principales del tipo que corresponda a la posición i de la lista de tecnologías principales.

La lista que almacena los datos de las demandas están organizadas por los años que representan, en orden ascendente, aquí el orden no importa, se organiza solamente para que cuando se visualice en la aplicación se haga con un orden lógico.

Además de los atributos antes vistos, esta clase también tiene otros que son parámetros necesarios en los cálculos de las funciones objetivos como son la cantidad de años de estudio, o periodo, el factor de reserva lenta, el factor de reserva rodante y la tasa de interés.

Algoritmo

Esta clase es la que se encarga de ejecutar el algoritmo utilizando los que tiene implementado el JMetal, solamente contiene el método estático ejecutar, que recibe como parámetro el problema a resolver y el algoritmo que se utilizará, solamente el nombre, pues utilizando el método privado getAlgoritmo se obtendrá una instancia del algoritmo solicitado con el respectivo problema a resolver. En esta clase se definen los operados de cruce y mutación a utilizar y se ejecuta el algoritmo, obteniéndose como resultado una instancia de la clase Population, que no es más que una lista de soluciones, estas son las soluciones no dominadas que se procesarán más adelante por otras clases hasta encontrar el resultado requerido, por defecto se ha puesto el tamaño de las poblaciones en 100 individuos.

SER

Esta es la clase principal de la aplicación, la misma representa un Sistema Energético de Referencia, es la que contiene todos los datos necesarios para la ejecución de los algoritmos, es decir, las diferentes tecnologías, los valores de la demanda, los parámetros generales como el período, la tasa

2013

52 de interés, etc. En esta clase es donde se crea el problema a resolver, CTAProblem, se le agregan los valores necesarios y se manda a ejecutar el algoritmo en la clase antes explicada.

SERManager

Esta es la clase manejadora del SER, solamente contiene el SER de estudio y es la encargada de manejar todas las operaciones que se realizan en la aplicación, ejemplo abrir un sistema de referencia, crear uno nuevo, guardar el actual, además se encarga de ejecutar las operaciones básicas del SER, agregar tecnologías, datos de demandas, modificar parámetros generales, etc. Esta clase también se encarga de la visualización de resultados y de los gráficos para el análisis de los mismos. Es una clase abstracta de la cual hereda SERManagerProvider, pues la misma está hecha para utilizar la funcionalidad de la Plataforma de Netbeans de crear servicios globales, los cuales pueden ser accedidos desde cualquier lugar de la aplicación utilizando la clase Lookup, esta es una funcionalidad muy poderosa pues garantiza que desde cualquier parte de nuestra aplicación podamos acceder a esta manejador y realizar todas las operaciones necesarias en el SER.

Algoritmos Utilizados

En el software se utilizaron tres algoritmos implementados dentro del JMetal: NSGA-II, IBEA y DENSEA. A continuación se hace una valoración de por qué se seleccionó cada uno de estos algoritmos.

NSGA-II: es uno de los algoritmos genéticos multiobjetivos más utilizados en la actualidad, su método de selección de las soluciones, dividiendo la población en frentes, en cada una de las iteraciones, lo hace un método que asegura que en cada operación que se le aplica a la población, ya sea de mutación o cruce, se obtendrán soluciones factibles con buenos precedentes, por lo que converge rápidamente hacia un frente no dominado muy cercano al verdadero frente de Pareto. Además la utilización del método de crowding distance promueve la diversidad en las poblaciones por lo que las soluciones que se obtengan estarán uniformemente distribuidas por todo el espacio de búsqueda.

IBEA: este es un algoritmo que promueve la diversidad mediante el uso de celdas. Para la selección de cada una de las soluciones que generarán la siguiente población se aplican torneos binarios seleccionando aleatoriamente las soluciones y utilizando el valor de la celda donde se encuentre cada solución para calcular su valor de aptitud, asegurando así que se explorará cada una de las regiones del espacio de búsqueda y el conjunto de soluciones estará uniformemente distribuido por el mismo. Este algoritmo utiliza un archivo externo para el almacenamiento de las poblaciones, además implementa una estrategia de puro elitismo. El uso de un archivo externo trae consigo que sea necesario la introducción de un parámetro adicional que será el tamaño máximo de este archivo.

2013

53 DENSEA: es un algoritmo que tiene como característica una gran diversidad en sus poblaciones en cada una de las iteraciones ya que utiliza el método de crowding distance. Es puramente elitista ya que en cada una de las iteraciones son seleccionadas todas las soluciones élites de la población para que sean padres en la formación de la siguiente población.

Librerías utilizadas

Se utilizaron diferentes librerías para la realización de la aplicación, la más importante es JMetal-4.3 pues es donde radica todo lo relacionado con la implementación de los algoritmos genéticos multiobjetivos. Además se utilizó también JFreeChart para la creación de los gráficos en el análisis de los datos y los resultados.

Related documents