Cuando aprendemos sobre reticulados nos enseñan un algoritmo para conseguir la
matriz de la relación de predecesores inmediatos de un CPO (Conjunto Parcialmente Ordenado) a partir de la matriz de la relación de orden [A,
] donde A tiene n elementos.
El algoritmo sería el siguiente:-Se calcula la matriz de la relación de orden M.-Determinamos la matriz M = M- In . M es igual a la matriz de relación de orden menos la matriz identidad.
-Calculamos M^2 (M al cuadrado = MxM) haciendo una multiplicación binaria. Es decir, la matriz resultante solo contendrá unos y ceros como entradas.
-Hallamos M = M - M^2 (matriz de la relación predecesor inmediato). La matriz de la relación predecesor inmediato es igual a la matriz M menos la matriz M^2.
Ejercicio de ejemplo:Dado el CPO [A, /] en dondeA = {200,60,30,10,5,1} y"/" es la relación binaria dedivisibilidad enA, (a/b si y sólo si "a" divide a "b") entonces: Hallar lamatriz de predecesores inmediatos.
Siguiendo el algoritmo calculamos la matriz M:M
=1 divide a todo número real, por ello todas las entradas de esta fila de la matriz son 1.5 divide a 5, 10, 30,60,200.10 divide a 10,30,60,200.30 divide a 30 y 60.60 divide a 60.200 divide a 200.
Siguiente paso, calculamos la matriz M que esta dada por M = M- In.M
=In =
M = M- In M =
Luego, calculamos M^2:M^2 = M x M
X
M^2 =
Finalmente, hallamos la matriz de la relación predecesor inmediato.M = M - M^2
M =
Una buena opción es desarrollar este algoritmo en algún lenguaje de programación que conozcamos, con el fin de aprender un poco más y a su vez comprobar los ejercicios que realizamos en nuestras horas de estudio. Este algoritmo lo podemos desarrollar enc++ de la siguiente forma:
#include iostreamusing namespace std;int main(){ int filas, colum; cout "Ingrese la cantidad de filas de la matriz de la relación de orden: " endl; cin filas; cout "Ingrese la cantidad de columnas de la matriz de la relación de orden: " endl; cin colum; int matrizRO[filas][colum]; //matriz de relación de orden int matrizRO2[filas][colum]; int matrizm2[filas][colum]; int matrizPI[filas][colum]; // Ingresamos las entradas de la matriz de relación de orden cout "Ingrese las entradas de la matriz de la relación de orden" endl; for(int i = 0; i filas; i++){ for(int j = 0; j colum; j++){ cout "Ingrese la entrada a" i j endl; cin matrizRO[i][j]; } } // Restamos la matriz identidad a nuestra matriz for(int diagonal = 0; diagonal colum; diagonal++) { matrizRO[diagonal][diagonal] = 0; } //Imprimimos el valor de M cout "Matriz M: " endl; for(int i = 0; i filas; i++){ for(int j = 0; j colum; j++){ cout matrizRO[i][j] " "; } cout endl; } //segunda matriz for(int i = 0; i filas; i++){ for(int j = 0; j colum; j++){ matrizRO2[i][j] = matrizRO[i][j]; } } // //Calculamos M^2 (Binarizada) for(int i=0;ifilas;i++){ for(int j=0;jcolum;j++){ matrizm2[i][j]=0; for(int k=0;kcolum;k++){ if(matrizRO[i][k] == 1 and matrizRO2[k][j] == 1) matrizm2[i][j] = 1; } } } // Imprimimos M^2 cout "Matriz M^2: " endl; for(int i = 0; i filas; i++){ for(int j = 0; j colum; j++){ cout matrizm2[i][j] " "; } cout endl; } //Calculamos la matriz de la relación predecesor inmediato for(int i = 0; i filas; i++){ for(int j = 0; j colum; j++){ matrizPI[i][j] = matrizRO[i][j] - matrizm2[i][j]; } } //Imprimimos la matriz de la relación predecesor inmediato cout "Matriz de la relación predecesor inmediato: " endl; for(int i = 0; i filas; i++){ for(int j = 0; j colum; j++){ cout matrizPI[i][j] " "; } cout endl; } return 0;}
int matrizRO[filas][colum]; //matriz de relación de orden int matrizRO2[filas][colum]; int matrizm2[filas][colum]; int matrizPI[filas][colum];La matrizRO representa la matriz de relación de orden, la matrizRO2 contiene las mismas entradas que la anterior, esta se usará solo para realizar la multiplicación para obtener M^2.
La matrizm2 representa la matriz M^2.
La matrizPI representa la matriz de la relación de predecesores inmediatos.
int filas, colum; cout "Ingrese la cantidad de filas de la matriz de la relación de orden: " endl; cin filas; cout "Ingrese la cantidad de columnas de la matriz de la relación de orden: " endl; cin colum;Inicialmente ingresamos la cantidad de filas y columnas que tiene nuestra matriz. Dicha matriz es una matriz cuadrada de orden nxn.
// Restamos la matriz identidad a nuestra matriz for(int diagonal = 0; diagonal colum; diagonal++) { matrizRO[diagonal][diagonal] = 0; }Para encontrar el valor de M solo debemos anular la diagonal principal de nuestra matriz.//Calculamos M^2 (Binarizada) for(int i=0;ifilas;i++){ for(int j=0;jcolum;j++){ matrizm2[i][j]=0; for(int k=0;kcolum;k++){ if(matrizRO[i][k] == 1 and matrizRO2[k][j] == 1) matrizm2[i][j] = 1; } } }Calculamos M^2 con el anterior algoritmo, tomar en cuenta que como es una matriz binarizada solo tendrá ceros y unos. Al conseguir una coincidencia de dos 1 almacenamos 1 en la matriz M^2.
//Calculamos la matriz de la relación predecesor inmediato for(int i = 0; i filas; i++){ for(int j = 0; j colum; j++){ matrizPI[i][j] = matrizRO[i][j] - matrizm2[i][j]; } }Calculamos la matriz de la relación de predecesor inmediato con la diferencia entre la matriz M y M^2.
Resolviendo el ejercicio anterior con nuestro programa de consola hecho en c++, ésta sería su ejecución:
Ingrese la cantidad de filas de la matriz de la relación de orden:6Ingrese la cantidad de columnas de la matriz de la relación de orden:6Ingrese las entradas de la matriz de la relación de ordenIngrese la entrada a001Ingrese la entrada a011Ingrese la entrada a021Ingrese la entrada a031Ingrese la entrada a041Ingrese la entrada a051Ingrese la entrada a100Ingrese la entrada a111Ingrese la entrada a121Ingrese la entrada a131Ingrese la entrada a141Ingrese la entrada a151Ingrese la entrada a200Ingrese la entrada a210Ingrese la entrada a221Ingrese la entrada a231Ingrese la entrada a241Ingrese la entrada a251Ingrese la entrada a300Ingrese la entrada a310Ingrese la entrada a320Ingrese la entrada a331Ingrese la entrada a341Ingrese la entrada a350Ingrese la entrada a400Ingrese la entrada a410Ingrese la entrada a420Ingrese la entrada a430Ingrese la entrada a441Ingrese la entrada a450Ingrese la entrada a500Ingrese la entrada a510Ingrese la entrada a520Ingrese la entrada a530Ingrese la entrada a540Ingrese la entrada a551Matriz M:0 1 1 1 1 10 0 1 1 1 10 0 0 1 1 10 0 0 0 1 00 0 0 0 0 00 0 0 0 0 0Matriz M^2:0 0 1 1 1 10 0 0 1 1 10 0 0 0 1 00 0 0 0 0 00 0 0 0 0 00 0 0 0 0 0Matriz de la relación predecesor inmediato:0 1 0 0 0 00 0 1 0 0 00 0 0 1 0 10 0 0 0 1 00 0 0 0 0 00 0 0 0 0 0
Optimizando el algoritmo en c++:El código fuente del algoritmo hecho en c++ está escrito con el mayor detalle posible con el fin de que pueda ser entendido fácilmente. Sin embargo, este puede ser optimizado evitando la creación de algunas matrices no tan necesarias y algunos ciclos repetitivos for. Esto con el fin de minimizar el tiempo de ejecución y reducir el espacio utilizado en la memoria.
#include iostreamusing namespace std;int main(){ int n; char respuesta; do{ cout "Ingrese el valor de n para su matriz de orden nxn " endl; cin n; int matrizR[n][n]; //matriz de relación de orden y luego de la relación predecesor inmediato. int matrizm2[n][n]; // Ingresamos las entradas de la matriz de relación de orden cout "Ingrese las entradas de la matriz de la relación de orden" endl; for(int i = 0; i n; i++){ for(int j = 0; j n; j++){ cout "Ingrese la entrada a" i j endl; cin matrizR[i][j]; //Anulando diagonal principal al momento de ingresar la matriz if(i == j) matrizR[i][j] = 0; } } //Calculamos M^2 (Binarizada) for(int i=0;in;i++){ for(int j=0;jn;j++){ matrizm2[i][j]=0; for(int k=0;kn;k++){ if(matrizR[i][k] == 1 and matrizR[k][j] == 1){ matrizm2[i][j] = 1;
break;
} } } } //Calculamos la matriz de la relación predecesor inmediato y la imprimimos al mismo tiempo cout "Matriz de la relación predecesor inmediato:" endl; for(int i = 0; i n; i++){ for(int j = 0; j n; j++){ matrizR[i][j] = matrizR[i][j] - matrizm2[i][j]; cout matrizR[i][j] " "; } cout endl; } cout "Desea obtener una nueva matriz de la relación predecesor inmediato a partir de otra matriz de relación de orden? si = s no = n" endl; cin respuesta; }while(respuesta == 's'); return 0;}
Inicialmente ingresamos el valor de n, la matriz de la relación de orden es una matriz cuadrada de orden nxn.
Mientras ingresamos las entradas o componentes de la matriz podemos ir anulando automática la diagonal principal, esto lo hacemos cuando los índices i y j son iguales.
if(i == j)matrizR[i][j] = 0;Para obtener la matriz M^2 solo necesitaremos conseguir un 1, recordemos que esta matriz debe estar binarizada. Por ello le agregamos el break al ciclo de manera que cuando encuentre un 1 salga del ciclo y no ejecute instrucciones innecesarias.
if(matrizR[i][k] == 1 and matrizR[k][j] == 1){
matrizm2[i][j] = 1;
break;
}
Al momento de obtener la matriz de la relación predecesor inmediato podemos guardar el resultado en la misma matriz inicial, además podemos ir imprimiendo los resultados en paralelo se van obteniendo.
for(int i = 0; i n; i++){ for(int j = 0; j n; j++){ matrizR[i][j] = matrizR[i][j] - matrizm2[i][j]; cout matrizR[i][j] " "; }cout endl;}Descarga del código fuente del proyecto:http://www.mediafire.com/download/urr...También te podría interesar:4 Ejercicios Básicos de Programación Orientada a Objetos en c++De sistema decimal a sistema binario en c++ y Java3 libros sobre programacion orientada a objetos[Ejercicio resuelto c++ POO Herencia Vectores MVC] Una Asociación de Lancheros trasladan turistas