Agrupamiento de Nodos Vecino en un Arreglo (Mineria de Datos)

Iniciado por cyberserver, 2 Julio 2010, 07:01 AM

0 Miembros y 1 Visitante están viendo este tema.

cyberserver

Para aquellos que les interesa agrupar nodos, ya sea para agrupar patrones individuales en uno solo si se cumple la condicion de que los nodos sean vecinos.

Ejemplo muy sencillo pero muy practico:

NOTA: Este ejemplo Remplaza los valores Agrupados con un Valor que uno especifica en la llamada al constructor.

Código (java) [Seleccionar]
AgrupamientoVecinos objeto=new AgrupamientoVecinos(arreglo,"1","8");

Y el codigo es el siguiente:
Código (java) [Seleccionar]
import javax.swing.*;

public class Agrupamiento {
public static String arreglo[][]=new String[10][10];
public static void main (String[] args) {

    for(int yx=0;yx<=9;yx++){
    for(int yy=0;yy<=9;yy++){
    arreglo[yx][yy]="0";
    }
    }
    arreglo[3][2]="1";
    arreglo[3][3]="1";
    arreglo[4][2]="1";
    arreglo[2][4]="1";
    arreglo[4][4]="1";
   
    arreglo[6][6]="1";
    arreglo[6][7]="1";
   
    AgrupamientoVecinos objeto=new AgrupamientoVecinos(arreglo,"1","8");
   
    for(int yx=0;yx<=9;yx++){
    for(int yy=0;yy<=9;yy++){
    if(arreglo[yx][yy]=="1"){
    objeto.BuscarVecino(yx,yy);
    }
    }
    }
   
    JOptionPane.showMessageDialog(null,"Termino de Buscar");
   
    for(int yx=0;yx<=9;yx++){
    for(int yy=0;yy<=9;yy++){
    if(arreglo[yx][yy]=="8"){
    JOptionPane.showMessageDialog(null,"Encontre desdepues en "+ yx + " y " + yy);
   
    }
    }
    }
   
   
   }
   
}
class AgrupamientoVecinos extends Agrupamiento{
public String ValorNuevo;
public String ValorViejo;
public String arreglo[][];
public AgrupamientoVecinos(String ArregloDeBusqueda[][],String ValorABuscar,String ValorAModificar){
arreglo=ArregloDeBusqueda;
ValorNuevo=ValorAModificar;
ValorViejo=ValorABuscar;
}
void BuscarVecino(int x,int y){
arreglo[x][y]=ValorNuevo;
if(arreglo[x][y-1]==ValorViejo){
BuscarVecino(x,y-1);
}
if(arreglo[x-1][y-1]==ValorViejo){
BuscarVecino(x-1,y-1);
}
if(arreglo[x-1][y]==ValorViejo){
BuscarVecino(x-1,y);
}
if(arreglo[x-1][y+1]==ValorViejo){
BuscarVecino(x-1,y+1);
}
if(arreglo[x][y+1]==ValorViejo){
BuscarVecino(x,y+1);
}
if(arreglo[x+1][y+1]==ValorViejo){
BuscarVecino(x+1,y+1);
}
if(arreglo[x+1][y]==ValorViejo){
BuscarVecino(x+1,y);
}
if(arreglo[x+1][y-1]==ValorViejo){
BuscarVecino(x+1,y-1);
}
}

}





Nota: Si quieres que comienze a agrupar los nodos vecinos desde una cordenada especifica y modifique los numero 1 a 8 del arreglo "arreglo":
Código (java) [Seleccionar]

AgrupamientoVecinos objeto=new AgrupamientoVecinos(arreglo,"1","8");
objeto.BuscarVecino(3,4)


Si quieres que busque los nodos 1 en el arreglo "arreglo" y que de aii comienze a agrupar y a modificar los 1 por los 8:
Código (java) [Seleccionar]

AgrupamientoVecinos objeto=new AgrupamientoVecinos(arreglo,"1","8");
for(int yx=0;yx<=9;yx++){
    for(int yy=0;yy<=9;yy++){
    if(arreglo[yx][yy]=="1"){
    objeto.BuscarVecino(yx,yy);
    }
    }
    }


Atte: CyberServer Abel de la Fuente Arriaga :P Saludos desde Atlacomulco eaea

EDITO-DEBCI:Usa las quotes de codigo en java para su mejor comprensión y analisis.






Debci

Muy bien amigo  :D
Solo que agradeceria por enésima vez que se usen las quotes de codigo con java
Código (java) [Seleccionar]


Saludines

cyberserver

#2
 :D que bueno que les gusto, para muchos esto es aburrido y sin chiste pero para muchos otros es la base de muchas cosas:

Aqui les traigo otra cosita que le agregue que es........Agrupamiento con numeros, esto quiere decir que a cada grupo que tenga vecinos sercanos se les va a poner un numero, y entre mas nodos conectados tengas como vecinos o alejados unos de otros mas grupos vas a tener.

Código (java) [Seleccionar]

import javax.swing.*;

public class Agrupamiento {
public static String arreglo[][]=new String[10][10];
public static void main (String[] args) {
int grupos=1;
    for(int yx=0;yx<=9;yx++){
    for(int yy=0;yy<=9;yy++){
    arreglo[yx][yy]="0";
    }
    }
    arreglo[3][2]="1";
    arreglo[3][3]="1";
    arreglo[4][2]="1";
    arreglo[2][4]="1";
    arreglo[4][4]="1";
   
    arreglo[6][6]="1";
    arreglo[6][7]="1";
   
   
   
   
    for(int yx=0;yx<=9;yx++){
    for(int yy=0;yy<=9;yy++){
    if(arreglo[yx][yy]=="1"){
    AgrupamientoVecinos objeto=new AgrupamientoVecinos(arreglo,"1",Integer.toString(grupos));
    objeto.BuscarVecino(yx,yy);
    grupos++;
    }
    }
    }
   
    JOptionPane.showMessageDialog(null,"Termino de Buscar");
   
    for(int yx=0;yx<=9;yx++){
    for(int yy=0;yy<=9;yy++){
    if(arreglo[yx][yy].equals( "0" )==false ){
    JOptionPane.showMessageDialog(null,"Encontre Agrupaciones con numero "+ arreglo[yx][yy] + " en " + yx + "," + yy);
   
    }
    }
    }
   
   
   }
   
}
class AgrupamientoVecinos extends Agrupamiento{
public String ValorNuevo;
public String ValorViejo;
public String arreglo[][];
public AgrupamientoVecinos(String ArregloDeBusqueda[][],String ValorABuscar,String ValorAModificar){
arreglo=ArregloDeBusqueda;
ValorNuevo=ValorAModificar;
ValorViejo=ValorABuscar;
}
void BuscarVecino(int x,int y){
arreglo[x][y]=ValorNuevo;
if(arreglo[x][y-1]==ValorViejo){
BuscarVecino(x,y-1);
}
if(arreglo[x-1][y-1]==ValorViejo){
BuscarVecino(x-1,y-1);
}
if(arreglo[x-1][y]==ValorViejo){
BuscarVecino(x-1,y);
}
if(arreglo[x-1][y+1]==ValorViejo){
BuscarVecino(x-1,y+1);
}
if(arreglo[x][y+1]==ValorViejo){
BuscarVecino(x,y+1);
}
if(arreglo[x+1][y+1]==ValorViejo){
BuscarVecino(x+1,y+1);
}
if(arreglo[x+1][y]==ValorViejo){
BuscarVecino(x+1,y);
}
if(arreglo[x+1][y-1]==ValorViejo){
BuscarVecino(x+1,y-1);
}
}

}




entonces el arreglo ya agrupado quedaria asi:




notaaaa: NO SE COMO HACER ESO DE "Usa las quotes de codigo en java para su mejor comprensión y analisis." :p









cyberserver

#3
Y si eres de aquellos que solo quieres usar el metodo y no complicarte con constructores y bucles y un sin fin de cosas aqui esta el metodo.

Código (java) [Seleccionar]

class AgrupamientoVecinos{
public String ValorNuevo;
public String ValorViejo;
public String arreglo[][];
public int Agrupar(String ArregloDeBusqueda[][],String ValorABuscar,boolean RenombradoAutomaticoGrupos,String ValorAModificar){
int grupos=0;
arreglo=ArregloDeBusqueda;
ValorNuevo=ValorAModificar;
ValorViejo=ValorABuscar;

for(int yx=0;yx<ArregloDeBusqueda.length;yx++){
    for(int yy=0;yy<ArregloDeBusqueda.length;yy++){
    if(ArregloDeBusqueda[yx][yy]==ValorViejo){
    if(RenombradoAutomaticoGrupos==false){
    grupos++;
    this.BuscarVecino(yx,yy);
    }else{
    grupos++;
    ValorNuevo=Integer.toString(grupos);
    this.BuscarVecino(yx,yy);
    }
    }
    }
    }
    return grupos;
}
private void BuscarVecino(int x,int y){
arreglo[x][y]=ValorNuevo;
if(arreglo[x][y-1]==ValorViejo ){
BuscarVecino(x,y-1);
}
if(arreglo[x-1][y-1]==ValorViejo){
BuscarVecino(x-1,y-1);
}
if(arreglo[x-1][y]==ValorViejo){
BuscarVecino(x-1,y);
}
if(arreglo[x-1][y+1]==ValorViejo){
BuscarVecino(x-1,y+1);
}
if(arreglo[x][y+1]==ValorViejo){
BuscarVecino(x,y+1);
}
if(arreglo[x+1][y+1]==ValorViejo){
BuscarVecino(x+1,y+1);
}
if(arreglo[x+1][y]==ValorViejo){
BuscarVecino(x+1,y);
}
if(arreglo[x+1][y-1]==ValorViejo){
BuscarVecino(x+1,y-1);
}
}

}





y para poder usarlo solo necesitas escribir estas pocas lineas

Código (java) [Seleccionar]

AgrupamientoVecinos objeto=new AgrupamientoVecinos();
    int GruposTotales=objeto.Agrupar(arreglo,"1",true,null);
    JOptionPane.showMessageDialog(null,"Termino de Buscar en total fueron " + GruposTotales + " grupos");



E aqui el ejemplo completo de como usarlo

Código (java) [Seleccionar]

import javax.swing.*;

public class Agrupamiento {
public static String arreglo[][]=new String[10][10];
public static void main (String[] args) {
int grupos=1;
    for(int yx=0;yx<=9;yx++){
    for(int yy=0;yy<=9;yy++){
    arreglo[yx][yy]="0";
    }
    }
    arreglo[3][2]="1";
    arreglo[3][3]="1";
    arreglo[4][2]="1";
    arreglo[2][4]="1";
    arreglo[4][4]="1";
   
    arreglo[6][6]="1";
    arreglo[6][7]="1";
   
    arreglo[6][2]="1";
   
arreglo[8][5]="1";
   
   
    AgrupamientoVecinos objeto=new AgrupamientoVecinos();
    int GruposTotales=objeto.Agrupar(arreglo,"1",true,null);
    JOptionPane.showMessageDialog(null,"Termino de Buscar en total fueron " + GruposTotales + " grupos");
   
   
    //Comprobacion de los grupos
    for(int yx=0;yx<=9;yx++){
    for(int yy=0;yy<=9;yy++){
    if(arreglo[yx][yy].equals( "0" )==false ){
    JOptionPane.showMessageDialog(null,"Encontre Agrupaciones con numero "+ arreglo[yx][yy] + " en " + yx + "," + yy);
   
    }
    }
    }
   
  }
   
}



:P saludos






Debci

#4
Muy buen aporte pero es para cerrar el tema macho... no has visto mi modificacion en tu primer mensaje? te he añadido las quotes de code java, y te he puesto una advertencia...

Cambialo anda que no cuesta nada.

[code=java]
Si nos abes es tan sencillo como darle a editar el primer mensaje que ya lo tienes hecho y mirar como te lo puse...
Saludos[/code]

cyberserver

OO dios vendito Dios que estudiamos ingenieria!!!!! vaya que si es bueno leer las viejas notas....

Deacuerdo con el Agrupamiento de nodos vecinos ooo dios que equivocado estaba, bueno en realidad equivocado no pero no tenia una semantica mi codigo ni un Orden!!!!

Pero en que no tenia orden? Cuando buscaba los nodos conectados los buscaba en DESORDEN, que es Raiz,Izquierda,Raiz,Derecha :S bueno igual y no estaba tan mal pero pues en investigaciones futuras de busqueda de caminos nos mostraria datos erroneos

¿A chinga me entendiedon que Dije?

Muy Facil!!!! un arreglo es igual a un ARBOL, entonces los metodos de Ordenamiento de caminos en un arbol para tener como resultado una cadena son:

    * N-ORDEN (IRD). Consiste en recorrer el árbol en el orden en que está.

    * POST-ORDEN (IDR). Consiste en recorrer las ramas en orden inverso.

    * PRE-ORDEN (RID). Consiste en recorrer las ramas desde la raíz hacia abajo.

Entonces para buscar los vecinos (nodos hijos) tenemos que buscalos con un Orden.

Nosotros escojimos RID ya que buscaremos los nodos vecinos primero la RAIZ, luego buscaremos en la parte izquierda y despues en la parte derecha!!!



Y bingo!!!! encontro el orden y nos mando como resultado un mensaje diciendonos el recorrido de los nodos en una cadena!!!

NOTA: esta cadena parece k no nos sirve para NADA pero error  ;-) ;-) ;-)

Esta cadena es la representacion de un objeto agrupado, entonces si kieremos saber si en un arreglo A de 100X100 existe dentro de este un arreglo B de 5X5 tomamos las cadenas de cada agrupacion y comparamos una por una!!!! asi si son iguales alguna de ellas nos dira que el objeto del arreglo B esta en el Arreglo A.

Esto es usado en redes neuronales y reconocimiento de patrones asi como tratamiento de imagenes

Miren graficamente asi funciona:





Auuuu!!!

Aqui esta el codiguin por si alguien le interesa

Código (java) [Seleccionar]

import javax.swing.*;

public class Agrupamiento {
public static String arreglo[][]=new String[10][10];
public static void main (String[] args) {
int grupos=1;
    for(int yx=0;yx<=9;yx++){
    for(int yy=0;yy<=9;yy++){
    arreglo[yx][yy]="0";
    }
    }
    arreglo[4][2]="1";
    arreglo[5][3]="1";
    arreglo[4][4]="1";
    arreglo[4][5]="1";
   
   
   
   
    AgrupamientoVecinos objeto=new AgrupamientoVecinos();
    int GruposTotales=objeto.Agrupar(arreglo,"1",true,null);
    JOptionPane.showMessageDialog(null,"Termino de Buscar en total fueron " + GruposTotales + " grupos");
   
   
    //Comprobacion de los grupos
    for(int yx=0;yx<=9;yx++){
    for(int yy=0;yy<=9;yy++){
    if(arreglo[yx][yy].equals( "0" )==false ){
    JOptionPane.showMessageDialog(null,"Encontre Agrupaciones con numero "+ arreglo[yx][yy] + " en " + yx + "," + yy);
   
    }
    }
    }
   
   
    }
   
}
class AgrupamientoVecinos{
public String ValorNuevo;
public String ValorViejo;
public String arreglo[][];
public String CadenaGrafo[];
public int Agrupar(String ArregloDeBusqueda[][],String ValorABuscar,boolean RenombradoAutomaticoGrupos,String ValorAModificar){
int grupos=0;
arreglo=ArregloDeBusqueda;
ValorNuevo=ValorAModificar;
ValorViejo=ValorABuscar;
CadenaGrafo=new String[10];
for(int yx=0;yx<ArregloDeBusqueda.length;yx++){
    for(int yy=0;yy<ArregloDeBusqueda[0].length;yy++){
    if(ArregloDeBusqueda[yx][yy]==ValorViejo){
    if(RenombradoAutomaticoGrupos==false){
    grupos++;
    this.BuscarVecino(yx,yy,grupos);
    }else{
    grupos++;
    ValorNuevo=Integer.toString(grupos);
    this.BuscarVecino(yx,yy,grupos);
    }
    }
    }
    }
    JOptionPane.showMessageDialog(null,"Cadena de Recorrido " + CadenaGrafo[1]);
    return grupos;
}
public  void BuscarVecino(int x,int y,int Grupos){
arreglo[x][y]=ValorNuevo;
//Tipo de Busqueda RID(Raiz-Izquieda-Derecha con Busqueda Descendente)

//Raiz
try{
if(arreglo[x][y-1]==ValorViejo ){
CadenaGrafo[Grupos]=CadenaGrafo[Grupos]+"5,";
CadenaGrafo[Grupos]=CadenaGrafo[Grupos]+"2,";
BuscarVecino(x,y-1,Grupos);
}
}catch(Exception e){}
try{
if(arreglo[x][y+1]==ValorViejo){
CadenaGrafo[Grupos]=CadenaGrafo[Grupos]+"5,";
CadenaGrafo[Grupos]=CadenaGrafo[Grupos]+"8,";
BuscarVecino(x,y+1,Grupos);
}
}catch(Exception e){}

//Izquierda

try{
if(arreglo[x-1][y-1]==ValorViejo){
CadenaGrafo[Grupos]=CadenaGrafo[Grupos]+"5,";
CadenaGrafo[Grupos]=CadenaGrafo[Grupos]+"1,";
BuscarVecino(x-1,y-1,Grupos);
}
}catch(Exception e){}
try{
if(arreglo[x-1][y]==ValorViejo){
CadenaGrafo[Grupos]=CadenaGrafo[Grupos]+"5,";
CadenaGrafo[Grupos]=CadenaGrafo[Grupos]+"4,";

BuscarVecino(x-1,y,Grupos);
}
}catch(Exception e){}
try{
if(arreglo[x-1][y+1]==ValorViejo){
CadenaGrafo[Grupos]=CadenaGrafo[Grupos]+"5,";
CadenaGrafo[Grupos]=CadenaGrafo[Grupos]+"7,";

BuscarVecino(x-1,y+1,Grupos);
}
}catch(Exception e){}

//Derecha
try{
if(arreglo[x+1][y-1]==ValorViejo){
CadenaGrafo[Grupos]=CadenaGrafo[Grupos]+"5,";
CadenaGrafo[Grupos]=CadenaGrafo[Grupos]+"3,";
BuscarVecino(x+1,y-1,Grupos);
}
}catch(Exception e){}
try{
if(arreglo[x+1][y]==ValorViejo){
CadenaGrafo[Grupos]=CadenaGrafo[Grupos]+"5,";
CadenaGrafo[Grupos]=CadenaGrafo[Grupos]+"6,";
BuscarVecino(x+1,y,Grupos);
}
}catch(Exception e){}
try{
if(arreglo[x+1][y+1]==ValorViejo){
CadenaGrafo[Grupos]=CadenaGrafo[Grupos]+"5,";
CadenaGrafo[Grupos]=CadenaGrafo[Grupos]+"9,";
BuscarVecino(x+1,y+1,Grupos);
}
}catch(Exception e){}




}

}








Diell

Hola, estoy haciendo tratamiento de imagenes, mas especificamente lo que quiero es reconocer circulos u ovalos dentro de una imagen cargada desde archivo. Puedes ayudarme por favor.