• No se han encontrado resultados

Capítulo 2 “Propuesta de paralelización”

2.2 Procedimiento serial para clasificar a un SDI

En la versión secuencial del algoritmo un solo nodo es el encargado de ejecutar todo el trabajo.

El procedimiento básico empleado para calcular la calidad del sistema de información, independiente de la variante seleccionada, consta de dos pasos:

Estas variantes se resumen en el mismo algoritmo secuencial, que se muestra a continuación:

1) Invocar a la función que determina la relación de tolerancia entre los objetos (función tolerancia, tolerancil o similitud).

2) Imprimir la calidad de la aproximación del sistema.

program calc_calidad;

1 cargar_SDI(name); SumAinf=0;

2 Repetir Desde i:=0 hasta ctad_obj, hacer Si la clase_d (i) esta en array_cd entonces inc(array_cd[clase_d[i]]) ;

sino

add(clase_d[i],array_cd) ;

3 Repetir Desde j:=0 hasta ctad_cd hacer

Repetir Desde k:=0 hasta ctad_obj hacer Si clase_d(k) = array_cd(j) entonces

n:=0;

válido:=true;

Mientras (n<= ctad_obj) y (válido=true) hacer

Si clase_d(n) = clase_d(k) entonces válido = objATobjBCD (n,k); inc(n);

Si (válido=true) entonces inc(SumAinf);

4 calidad = SumAinf/ctad_obj;

En este pseudo código es necesario aclarar el significado de algunas funciones y variables:

add: Esta función adiciona una clase de decisión al arreglo de clases de decisión.

array_cd: En este arreglo se almacenan las clases de decisión diferentes que tiene el SDI.

calidad: Esta es la variable donde se guarda el objetivo final del programa, que es calcular la calidad de aproximación del SDI mediante los atributos entrados como parámetros.

cargar_SDI: Esta función lee de un archivo cuyo nombre fue entrado como parámetro (name) el sistema de decisión y lo almacena en memoria.

clase_d: Esta función devuelve el valor del atributo de decisión del objeto que se le pasa como parámetro.

ctad_cd: Es el número de clases de decisión diferentes con que cuenta el sistema.

ctad_obj: Es el número de objetos con que cuenta el sistema de decisión incompleto.

SumAinf: En esta variable se van contabilizando todos los objetos que pertenecen a la aproximación inferior de un conjunto.

válido: Esta bandera nos evita tener que recorrer todos los objetos de una clase de tolerancia para comprobar si este objeto no pertenece a la aproximación inferior del conjunto (siempre que el objeto a comparar no pertenezca a la aproximación inferior del conjunto), debido a que en el momento que se encuentre un objeto en la misma clase de tolerancia pero que tenga una clase de decisión diferente válido toma valor false y se detiene la búsqueda.

La función objATobjBCD (n,k) marca la diferencia al utilizar tolerancia,

tolerancil, o similitud. Para cada una de estas funciones el algoritmo varía dado al enfoque que teóricamente se le da, pero básicamente es la función que dice si dos objetos A y B (n,k) están en la misma clase de tolerancia.

Para el anterior algoritmo tenemos que la función objATobjBCD varia en dependencia de la variante que se implemente. Por ejemplo objATobjBCD1 es la correspondiente a la primera extensión, la relación II del primer capítulo,

objATobjBCD2 es la correspondiente a la segunda extensión. La relación V del primer capítulo y objATobjBCD3 es la correspondiente a la tercera extensión, o sea, la relación de similaridad, esta última consta básicamente solamente de la llamada a la función funcionSemejanza dado que dicha función, es la que define si dos objetos son o no similares y no objATobjBCD3.

La función de comparación de objetos para la primera extensión se define por:

Esta es una función muy simple donde hay que aclarar que:

- La función rasgo (i,n) devuelve el valor del rasgo i en el objeto n.

- La variable ctad_rasgos tiene la cantidad de rasgos que se quieren analizar del SDI.

- La bandera iguales que nos evita tener que recorrer todo el conjunto de rasgos si ya uno de ellos tiene un valor diferente en ambos objetos.

función objATobjBCD1(n, k) 1. iguales=true;

2. Mientras (i<=ctad_rasgos) y (iguales=true) hacer

Si (rasgo (i, n) <> rasgo (i, k)) y (rasgo (i, n)!=*) y (rasgo (i, k)!=*) entonces

iguales = false; inc(i);

La función de comparación de objetos para la segunda extensión se define por:

En esta función el procedimiento rasgo(i,n) es el mismo que en la variante anterior. Lo mismo pasa con la variable iguales y la variable ctad_rasgos. Tenemos además la bandera valido que usamos para verificar si la pareja de objetos tiene al menos un atributo conocido en común (cuando esto sucede el primer ciclo la incrementa). Es muy importante el papel que desempeña la variable conocido que es la encargada de almacenar si alguno de los dos objetos tiene al menos un atributo conocido en cuyo caso no seria posible que ambos fuesen semejantes por falta de información total (caso que es tratado de esa forma en la segunda relación del primer capítulo).

Conviene describir el objetivo del ciclo usado en este pseudo código.

El paso 2 (ciclo) verifica si los objetos están relacionados, es decir, si están en la misma clase de tolerancia, comprueba que los objetos tengan al menos un atributo común con valor conocido y que cualquiera de los dos objetos tenga al menos un atributo con valor conocido, almacenándolo en la variable conocido la

función objATobjBCD2(n, k)

1. iguales=true; valido=true; i=0; conocido;

2. Mientras (i<=ctad_rasgos) y (iguales=true) hacer Si ((rasgo (i, n) <> *) y (rasgo (i, k) <> *)) entonces iguales:=(rasgo (i, n)=rasgo (i, k));

inc(valido);

Si ((rasgo (i, n) <> *) o (rasgo (i, k) <> *)) entonces inc(conocido);

inc(i);

3. Si (valido<>0)entoncesdevolver(iguales) sino

Si (conocido<>0) entonces devolver(0);

sino

cual será 0 ssi ambos objetos en cuestión tienen todos sus atributos desconocidos.

La función de comparación de objetos para la tercera extensión (función de semejanza) se define por:

Aquí es importante resaltar que gamma no es una variable de la función sino un parámetro pasado a objATobjBCD3 (este parámetro ha de ser pasado a la llamada inicial de similitud) y según sea su signo la función similitud estará basada en una función de semejanza (cuando sea gamma > 0) o en una función de discrepancia (cuando sea gamma < 0).

Recordemos que la función funcionSemejanza no está incluida en la biblioteca

libext.a, el usuario puede implementarla como desee. No obstante, dentro de la biblioteca libsemej.a encontramos una implementación de esta que desarrolla una función de comparación de rasgos conocida, mediante la suma ponderada de los atributos.

La funcionSemejanza brindada en la biblioteca tiene básicamente los siguientes pasos:

función objATobjBCD3(n, k, gamma) 1. iguales=true; i=0;

2. Si (gamma >=0) entonces iguales = (funcionSemejanza(n, k) >= gamma); sino

gamma = gamma *(-1);

iguales = (funcionSemejanza(n, k) <= gamma);

3. devolver(iguales);

3. devolver(iguales);

función funcionSemejanza (n, k)

1. epsilon=0; i=0; beta=0;

2. epsilon = loadPesos(array_pesos);

3. Repetir Desde i:=0 hasta ctad_rasgos hacer

beta = beta + array_pesos[i] *(

|

(rasgo[i, n] - rasgo[i, k])

|

<= epsilon )

4. devolver(beta);

En el caso de nuestra simple funcionSemejanza hay que aclararque epsilones una variable en la que se guarda el valor de retorno de la función loadPesos (la cual es responsable de cargar en la variable array_pesos el valor de los pesos que se le dan a los atributos mediante el archivo predeterminado pesos.txt) y que necesitamos para poder computar el valor de las expresiones 2.1 o 2.2, según sea el valor de este (cero, o diferente de cero respectivamente).

El archivo pesos.txt es un archivo de texto que ha de tener en la primera línea el valor de epsilon y a partir de ahí el listado de los pesos que le queremos dar a los atributos (con que vamos a aproximar el sistema).

Por ejemplo, para un SDI con 4 atributos de condición el archivo podría ser el siguiente:

Es muy importante señalar que si este archivo no tiene la cantidad de pesos estrictamente necesarios la función de semejanza no trabajará apropiadamente. Por ejemplo el archivo mostrado anteriormente deberá tener solo cinco líneas una para el epsilon y cuatro para los pesos que vamos a asignarle a cada uno de los atributos con que vamos a trabajar. En caso de que solo fuéramos a calcular la calidad del sistema con un subconjunto de todos los atributos, el archivo tendrá tantos pesos como elementos tenga este subconjunto.

2.3 Método paralelo propuesto para el cálculo de la calidad en

Documento similar