• No se han encontrado resultados

Algoritmos basados en la competitividad entre reglas

4 El Grupo de Computación Natural (U.P.M.) Investigación

4.3 Algoritmos de Aplicación de Reglas

4.3.3 Algoritmos basados en la competitividad entre reglas

A pesar de que los que se presentan a continuación pueden llegar a ser considerados como una serie de trabajos cuyo objetivo es la mejora de los algoritmos presentados hasta aquí, en la presente tesis doctoral aparecen de manera independiente ya que introducen un concepto que, a pesar de estar inmerso de manera innata en la propia definición de las reglas de evolución, se trata de manera específica por primera vez. El concepto en cuestión, presentado en [Tejedor et al., 2007b] es lo que los autores denominan "competitividad entre reglas" y se refiere al hecho de que dos o más reglas pueden estar "compitiendo" por la utilización de los recursos presentes en la membrana (en su multiconjunto). Si se simplifica el concepto, se trata de poder aplicar los algoritmos anteriormente descritos (en concreto el de "eliminación de reglas") de manera más

{1}

{2} 

RØMR(O,T,D)

{3} Ultima

R

{3}

FOR Ind = 1 TO

Ultima

- 1 DO

{4}

BEGIN {5}

Max

R[Ind]' {6} IF (

Max0

) THEN {7} BEGIN {8}

Kaleatorio(0,Max)

{9}



Ind

K R R

R[

]

{10}

 ''KinputR[Ind]

{11}

Active[Ind](KMax)

{12} END

{13} ELSE

Active[Ind]

false

{14} END

{15}

Active[Ultima]true

{16} FOR Ind =

Ultima

DOWNTO 1 DO {17} IF (

Active[Ind]

) THEN

{18} BEGIN {20}

Max

R[Ind]' {21}



Ind

Max R R

R[

]

{22}

 ''

Max

inputR[Ind]

{23} END

146

eficiente ya que aquellas reglas que no compitan por el mismo conjunto de objetos para poder ser aplicadas van a poder ser eliminadas en un número menor de pasos.

Recordemos que el algoritmo de eliminación de reglas lleva a cabo dos acciones básicas:

1. Se aplican todas las reglas existentes excepto la que va a ser eliminada tantas veces como se obtenga de manera aleatoria entre cero y la máxima aplicabilidad de cada una de ellas. Esta primera acción es la que garantiza el indeterminismo del sistema.

2. La regla específica elegida para ser eliminada se aplica tantas veces como indique su máxima aplicabilidad y por tanto puede ser eliminada (dado que no va a poder ser aplicada en ninguna iteración posterior).

La mejora sobre el algoritmo de eliminación de reglas surge debido a que se pueden considerar menos pasos de eliminación ya que si se tiene en cuenta los recursos necesarios por cada regla, solamente aquellas que compiten entre sí se deben tener en cuenta a la hora de proceder a la eliminación. De esta manera se pueden reducir el número de pasos totales. Veamos un ejemplo:

Sean las reglas r1, r2, r3 y r4, con antecedentes a, ab, cd y d respectivamente. Se puede

observar que entre las reglas r1 y r3 no existe ningún tipo de competitividad por los

recursos puesto que actúan sobre gránulos distintos (a y cd). Lo mismo pasa con r2 y r3 ó r2

y r4. De hecho, la única competitividad existente tiene lugar entre las reglas r1 y r2 y entre

las reglas r3 y r4.

Si en el caso anterior se aplicase el algoritmo de eliminación de reglas, habría que aplicarlo en cuatro iteraciones, aplicando la última en su máxima aplicabilidad:

max 4 max 0 3 max 0 2 max 0 1] r ] r ] r ] r max 3 max 0 2 max 0 1] r ] r ] r max 2 max 0 1] r ] r max 1] r

Estas cuatro iteraciones suponen un total de 10 pasos de aplicación para el total de las reglas. Sin embargo, teniendo en cuenta la competitividad existente, se podrían realizar los siguientes pasos de aplicación:

max 2 max 0 1] r ] r max 1] r

147 max 4 max 0 3] r ] r max 3] r

en los que, como se puede ver, se tratan los conjuntos de reglas como si se tratase de grupos diferentes ya que algunas no interfieren entre ellas. Por esto, el conjunto de pasos finales necesarios, a pesar de seguir necesitando cuatro iteraciones, es de 6 (siempre hablando del peor de los casos, ya que podría ocurrir que alguna de las reglas a aplicar entre cero y su máxima aplicabilidad lo fuese en este último valor y por tanto también se eliminaría.

Para aprovechar al máximo este concepto de "competitividad" los autores definen un "grafo de competitividad" que representa en dicha estructura los recursos compartidos por los antecedentes de las reglas existentes en la membrana. De manera formal:

Sea R un conjunto de reglas activas

0 } ,..., , { = r1 r2 r iR i

Se define C como una relación binaria definida sobre el conjunto R tal que:

 

 



 

x,y R,x y,xCy input x input y

La relación binaria se podrá representar, por tanto, como un grafo no dirigido llamado "grafo de competitividad" en el que dos reglas están relacionadas si tienen al menos un objeto en común en su antecedente.

Una vez definido el mencionado grafo, los autores, aprovechando la teoría correspondiente, establecen y definen lo que es un sub-grafo resultante de la eliminación de una regla, la cadena de competitividad así como una componente conexa y una articulación del grafo (aquella regla cuya eliminación provoca la división del grafo en un número mayor de componentes conexas).

Una vez definidos estos conceptos se muestran diversas optimizaciones sobre el algoritmo original, teniendo que la primera de ellas se basa en lo ya expuesto hasta aquí, de tal manera que se aplique la eliminación de reglas en las diferentes componentes conexas del grafo (tal y como se hizo en el ejemplo de las cuatro reglas expuesto con anterioridad).

A pesar de que en la presente progresión documental no se ha hablado de algoritmos paralelos, hay que hacer notar ya que la adaptación de esta mejora a un mayor nivel de paralelismo es muy sencilla dado que se limita a establecer la ejecución en paralelo de aquellas reglas que acceden a gránulos distintos de objetos (o sea, a componentes

148

conexas diferentes). Esta versión paralela reduciría notablemente el número de pasos de aplicación en el caso de que las diferentes componentes conexas del grafo estuviesen equilibradas en cuanto al número de reglas, ya que se reduciría al mayor número de aplicaciones de reglas en un componente. Lógicamente, la mejoría no sería tan notable si el número de reglas de cada uno de las componentes conexas estuviese francamente desequilibrado, aunque en el peor de los casos presentaría la misma eficiencia que el algoritmo básico (una sola componente conexa con la totalidad de reglas).

La segunda optimización planteada establece como característica principal el hecho de la existencia de articulaciones en los grafos de competitividad y la ventaja de elegir las reglas consideradas como tales a la hora de eliminar reglas.

La elección de una articulación como regla a eliminar provocará la aparición de un mayor número de componentes conexas en el grafo y por tanto una reducción, como se ha visto en el primer caso, del número de pasos de aplicación. Incluso es evidente que favorece el paralelismo del algoritmo.

En caso de que no existan articulaciones, es posible que se puedan provocar la división a partir de la eliminación de varias reglas y así disponer de las mismas ventajas. En este último caso hay que desarrollar una importante variante respecto del algoritmo original: mientras que en el primero el orden en que se eliminaban las reglas, dado que ahora es importante la eliminación de unas determinadas reglas para provocar la aparición de componentes conexas, debe existir cuando menos un orden parcial para eliminarlas, aunque este orden puede establecerse en un examen previo a los pasos de eliminación y, por tanto, no perjudican la eficiencia del algoritmo. Otra vez, la versión paralela vuelve a ser la aplicación al mismo tiempo sobre las diferentes componentes conexas del grafo.

La última de las mejoras propuestas aprovechan la circunstancia conocida de otros análisis en los que puede ocurrir que se produzca, en una determinada iteración de aplicaciones, la eliminación de más de una de las reglas existentes, ya bien sea porque el número aleatorio generado coincide con su máxima aplicabilidad o bien sea porque la aplicación de otra de las reglas ha consumido todos los recursos necesarios para la aplicación de la actual. Esto se puede aprovechar de tres maneras: i) no se necesita ejecutar el paso de eliminación de una regla que no se puede aplicar. ii) no es necesario aplicar esa misma regla en los pasos de eliminación de otra reglas y iii) la eliminación de una regla puede provocar cambios en el orden más beneficioso de eliminación ya que puede provocar la aparición de articulaciones.

Como conclusiones los autores establecen que el concepto de competitividad abre nuevas vías para mejorar el paralelismo en el algoritmo de eliminación de reglas activas.

149 4.3.4 Algoritmos de ejecución paralela

Como antecedente directo del abordaje de este tema, se tiene, tal y como se indicó en el capítulo que hace mención al estado del arte, la plataforma desarrollada por Ciobanu en [Ciobanu & Wenyuan, 2003]. Se corresponde con un sistema desarrollado para un clúster de 64 ordenadores programado en C++. Cada una de las reglas se corresponde con un proceso independiente y esto favorece de manera natural el paralelismo. Sin embargo, los mismos autores establecen que, dado que existe un alto número de reglas intentando consumir los recursos existentes en el multiconjunto, resulta imprescindible la existencia de un mecanismo de exclusión mutua que permita el acceso a los mismos respetando la integridad del sistema, lo que conduce de manera inevitable a una serialización en el acceso a los recursos y en la aplicación de las reglas. Es por esto por lo que se hace necesario el planteamiento de mecanismos que permitan incrementar la aplicación concurrente de las reglas de evolución.

Dentro del Grupo de Computación Natural de la Universidad Politécnica de Madrid se han presentado, al margen de los trabajos mostrados hasta el momento en la presente tesis doctoral, un grupo de algoritmos que han sido diseñados de manera específica para favorecer el alto grado de paralelismo que presentan los Sistemas P debido a su propia naturaleza. Hasta ahora los algoritmos mostrados han sido considerados como "secuenciales" y las diferentes mejoras sobre las que se ha trabajado intentan optimizar de una manera u otra la terminación de los pasos de evolución de los Sistemas P de una manera más eficiente, ya bien sea consumiendo más recursos en cada paso o estableciendo operaciones que decrementan la complejidad de la ejecución.

Sin embargo, en este apartado se muestra la línea de trabajo que se corresponde con las propuestas presentadas para la implementación de algoritmos que permitan específicamente la ejecución de un mayor número de líneas de código en paralelo, como corresponde al trabajo presentado en [Fernández et al., 2006b]. En él se diseñan dos algoritmos que potencian de manera natural la aplicación paralela de las reglas de evolución, aunque el segundo puede ser presentado como una mejora del primero, denominado "algoritmo masivamente paralelo de aplicación de reglas de evolución".

El algoritmo masivamente paralelo propone en su primer acercamiento la existencia de un proceso independiente por cada una de las reglas de evolución de la membrana y un proceso más que se encargará de controlar la evolución de los anteriores y que representará a la membrana en su conjunto. La idea general de este algoritmo se basa en el hecho de que cada uno de los procesos, o sea, cada una de las reglas de evolución, propone, de manera independiente del resto, un conjunto de recursos a consumir del multiconjunto presente en la membrana. Esta propuesta será un múltiplo entero del conjunto de objetos presentes en su antecedente (o sea, el número de veces que se aplica la regla por el conjunto de objetos que necesita una aplicación). Evidentemente, aunque

150

cada una de las reglas haga una propuesta de consumo que se encuentre entre 0 y el indicador de su máxima aplicabilidad, la suma de todas las propuestas de cada una de las reglas podrá ser mayor en necesidad de recursos que los existentes en el multiconjunto de objetos de la membrana. En este caso el algoritmo debe poder manejar la situación y proponer otra alternativa (un consumo de menos recursos a base de aplicar menos reglas o en menor cantidad cada una de las reglas aplicadas). En caso de que sea posible aplicar la propuesta, se ejecuta y se recalcula la aplicabilidad de las reglas de evolución. Como detalle se puede especificar una determinada probabilidad para que las reglas sean aplicadas o no. Específicamente, los pasos que sigue el algoritmo son:

1.- (Proceso membrana). Se inicializa la membrana y se genera la probabilidad global de las reglas.

2.- (Proceso de reglas). Se inicializan los procesos de cada una de las reglas y cada una determina su máxima aplicabilidad. Se ejecuta en paralelo para cada regla.

3.- (Proceso de reglas). Cada una de las reglas propone un número generado entre 0 y su máxima aplicabilidad que representa al número de veces que se aplicaría la regla en caso de ser aceptada su propuesta. Se ejecuta en paralelo para cada regla.

4.- (Proceso de reglas). La suma que se debe ejecutar para calcular el global de la propuesta de objetos a consumir por el total de las reglas se calcula de dos en dos, de tal manera que se distribuyen por vecindad de acuerdo con una numeración preestablecida (la regla 1 con la dos, al mismo tiempo que la regla 3 lo hace con la 4, etc. Después el resultado de la primera suma con el resultado de la segunda, etc.). Esta suma se calcula en paralelo para cada nivel de resultados.

5.- (Proceso membrana). La membrana comprueba si la propuesta realizada por el total de las reglas es aplicable sobre el multiconjunto. Si lo es pasa al paso 6 y si no lo es:

- Si la suma es mayor que los objetos existentes en el multiconjunto, entonces hace volver a los procesos de las reglas al paso 3 para otra propuesta de consumo.

- Si la suma de la propuesta resulta ser cero (no hay propuesta de consumo) entonces se elige aleatoriamente una regla y se genera, también aleatoriamente, el número de veces que se consume entre 1 y su máxima aplicabilidad. Esta será la propuesta definitiva.

151

6.- (Proceso membrana). La membrana resta del multiconjunto la propuesta realizada, indicando a las reglas que la propuesta es válida para que cuenten el número de veces que se aplica cada una.

7.- (Proceso de reglas). Cada regla suma las veces que ha sido aplicada y recalcula su máxima aplicabilidad, parando su ejecución en caso de que ésta sea cero.

8.- (Proceso membrana). La membrana comprueba el estado de cada regla y si existen reglas activas todavía, vuelve al paso 3, parando en caso contrario.

Figura 4.9 Sincronismo entre procesos

A pesar de que se ejecutan de manera independiente los procesos de todas las reglas, existiendo otro proceso independiente para la membrana y que todo ello supone un aumento en la eficiencia del algoritmo, es absolutamente imprescindible la existencia de un mecanismo de sincronización que impida el funcionamiento erróneo del sistema. Así, la membrana no podrá comprobar si la propuesta de consumo de las reglas es válida o no hasta que todas las reglas hayan enviado dicha propuesta y las reglas no podrán incrementar el contador de aplicaciones hasta que el proceso de la membrana no haya dado el visto bueno. Esto quiere decir que se incrementa mucho el paralelismo en tanto en cuanto se está produciendo a dos niveles: por una parte hay un proceso por regla y por otra se están consumiendo tantos objetos como veces se aplique cada una de las reglas. Como se puede comprobar en la Figura 4.9, el precio a pagar por este paralelismo es el

Membran a R1 R2 ... Rn .... P1 . . . P2 P3 ... .... P4 P2 P3 P2 P3 P4 P4 . . . P5 P6 . . . P7 P7 P7 . . . P8 Reglas

152

tiempo destinado al necesario sincronismo entre las diferentes reglas y el proceso que simula la membrana e incluso entre las propias reglas.

Dicha figura representa el sincronismo necesario entre los procesos membrana y los de las reglas en una sola iteración del algoritmo (se repetiría en bucle hasta terminar el paso de evolución). Tras la inicialización de la membrana y generación del factor de probabilidad, debe existir la coordinación (comunicación) entre este proceso y el de todas las reglas para que puedan proceder a ejecutar los pasos 2 y 3 y, como se ha mencionado antes, para proceder al paso 4 (suma de propuestas) debe existir la coordinación entre todas las reglas, pasando el testigo a la membrana una vez que han terminado para que pueda proceder con los pasos 5 y 6 (gestión de colisiones y sustracción de objetos consumidos del multiconjunto). Por supuesto, en caso de que haya colisiones se necesita un bucle que retorne la ejecución al paso 3 (la figura solo representa "puntos de sincronización", no hilo de ejecución).

Al establecer las ventajas de este algoritmo se puede ver claramente que se hace necesario garantizar la finitud del mismo, cosa que puede complicarse si se detectan, sucesiva e indefinidamente, propuestas realizadas por las reglas que siempre exceden del número de objetos existentes en el multiconjunto. Establecido el problema, los autores determinan que se puede solucionar a base de llevar a cabo dos acciones:

 La primera consiste en que, en caso de que se detecten colisiones en la propuesta realizada por las reglas, para la siguiente iteración de la propuesta, no se calculará de manera aleatoria entre 1 y su máxima aplicabilidad como se ha realizado la primera vez sino que se calculará entre 1 y el número obtenido que se generó en dicha primera vez. De esta manera, ante la reiterada existencia de colisiones siempre se garantiza que la propuesta se decrementa de forma monótona y que, por tanto, será finito el algoritmo.

 La segunda consiste en utilizar la mencionada probabilidad global que determinará qué reglas pueden ser aplicadas o no en cada una de las iteraciones. Esto favorece una menor propuesta de consumo y por tanto una menor probabilidad de existencia de colisiones. Esta probabilidad se incrementará o decrementará para cada regla dependiendo de la existencia o ausencia de colisiones con su propuesta.

Los resultados experimentales con este algoritmo establecen una importante mejora ya que, aunque en el peor de los casos presenta una complejidad log2N*log2R, es cierto que consume hasta R veces más símbolos que el algoritmo secuencial.

Analizando cada uno de los pasos del algoritmo paralelo propuesto se puede observar que se podría mejorar mucho la eficiencia del mismo si se pudiese reducir el

153

coste de ejecución de dos pasos concretos: la suma de las propuestas realizadas por las reglas, que se ejecutan de dos en dos en diferentes niveles (aunque en paralelo para cada nivel) y la gestión de las colisiones si éstas son muchas. Es por esto por lo que los autores proponen una variante del algoritmo que se basa en eliminar la suma a base de realizar un análisis previo a los pasos de ejecución que carguen en un vector todas las posibles combinaciones de los multiconjuntos pertenecientes a los antecedentes de las reglas (los objetos que consumirían). De esta manera no hay que efectuar la suma y el algoritmo se limita a buscar en el vector el resultado deseado. Esta búsqueda se realizará a través de los índices de las reglas que realizan propuesta de consumo codificado en binario (cada posición representará las reglas que se correspondan con los unos del número en binario). Los pasos a realizar, comparándolos con los ya vistos para el algoritmo anterior serían:

1.- (Proceso membrana). Es igual que en el algoritmo anterior. Se inicializa la membrana y se genera la probabilidad global de las reglas.

2.- No existe el cálculo de la máxima aplicabilidad de la regla puesto que no se usa.

3.- (Proceso de reglas). Cada una de las reglas simplemente indica si va a proponer el consumo de recursos o no.

4.- No se necesita ningún tipo de suma puesto que las sumas de todos los posibles consumos han sido cargados previamente en un vector.

5.- (Proceso membrana). El proceso accede al vector que contiene todas las combinaciones de antecedentes de las reglas a través de la indexación de la