예제 #1
0
        public Isomorfismo(Grafo a, Grafo b)
        {
            //Cargar todos los datos de los grafos en las vistas
            this.grafo_a = a;
            this.grafo_b = b;
            InitializeComponent();

            grafo_a.generaMatriz_Adaycencia();
            grafo_b.generaMatriz_Adaycencia();

            data_matriz_a.Columns.Clear();
            data_matriz_a.Rows.Clear();

            int[,] array = new int[grafo_a.list_vertice.Count() + 1, grafo_a.list_vertice.Count() + 1];

            for (int i = 0; i < grafo_a.list_vertice.Count(); i++)
            {
                for (int j = 0; j < grafo_a.list_vertice.Count(); j++)
                {
                    array[i, j] = 0;
                }
            }

            foreach (Arista aris in grafo_a.list_arista)
            {
                array[aris.origen.indice_vertice, aris.destino.indice_vertice] = 1;
                array[aris.destino.indice_vertice, aris.origen.indice_vertice] = 1;
            }

            data_matriz_a.Columns.Add("Index", "");

            for (int i = 0; i < array.GetLength(1) - 1; i++)
            {
                data_matriz_a.Columns.Add("Value", i.ToString());
            }

            for (int i = 0; i < grafo_a.list_vertice.Count(); i++)
            {
                DataGridViewRow row = new DataGridViewRow();
                row.CreateCells(data_matriz_a);
                for (int j = 0; j < grafo_a.list_vertice.Count(); j++)
                {
                    if (j == 0)
                    {
                        row.Cells[j].Value = i.ToString();
                    }
                    row.Cells[j + 1].Value = array[i, j].ToString();
                }
                data_matriz_a.Rows.Add(row);
            }


            data_matriz_b.Columns.Clear();
            data_matriz_b.Rows.Clear();

            array = new int[grafo_b.list_vertice.Count() + 1, grafo_b.list_vertice.Count() + 1];

            for (int i = 0; i < grafo_b.list_vertice.Count(); i++)
            {
                for (int j = 0; j < grafo_b.list_vertice.Count(); j++)
                {
                    array[i, j] = 0;
                }
            }

            foreach (Arista aris in grafo_b.list_arista)
            {
                array[aris.origen.indice_vertice, aris.destino.indice_vertice] = 1;
                array[aris.destino.indice_vertice, aris.origen.indice_vertice] = 1;
            }

            data_matriz_b.Columns.Add("Index", "");

            for (int i = 0; i < array.GetLength(1) - 1; i++)
            {
                data_matriz_b.Columns.Add("Value", i.ToString());
            }

            for (int i = 0; i < grafo_b.list_vertice.Count(); i++)
            {
                DataGridViewRow row = new DataGridViewRow();
                row.CreateCells(data_matriz_b);
                for (int j = 0; j < grafo_b.list_vertice.Count(); j++)
                {
                    if (j == 0)
                    {
                        row.Cells[j].Value = i.ToString();
                    }
                    row.Cells[j + 1].Value = array[i, j].ToString();
                }
                data_matriz_b.Rows.Add(row);
            }

            indice_grafo_label_a.Text = "Indice de Grafo: " + grafo_a.indice_grafo.ToString();
            num_vertices_a.Text       = "Numero de Vertices: " + grafo_a.list_vertice.Count();
            num_aristas_a.Text        = "Numero de Aristas: " + grafo_a.list_arista.Count();

            indice_grafo_label_b.Text = "Indice de Grafo: " + grafo_b.indice_grafo.ToString();
            num_vertices_b.Text       = "Numero de Vertices: " + grafo_b.list_vertice.Count();
            num_aristas_b.Text        = "Numero de Aristas: " + grafo_b.list_arista.Count();

            //Prueba de biyeccion a los grafos para verificar isomorfismo
            if (biyeccion(grafo_a, grafo_b))
            {
                MessageBox.Show("SON ISOMORFICOS");
            }
            else
            {
                MessageBox.Show("NO SON ISOMORFICOS");
            }
        }
예제 #2
0
        //Funcion de isomorfismo por fuerza bruta
        public bool isomorfismo_fuerza_bruta(Grafo g1, Grafo g2)
        {
            if (g1 != null && g2 != null)
            {
                if (g1.list_vertice.Count == g2.list_vertice.Count)
                {
                    if (g1.list_arista.Count == g2.list_arista.Count)
                    {
                        int tam = g1.list_vertice.Count;

                        g1.generaMatriz_Adaycencia();
                        int[,] matrizGrafo1 = g1.array_adyacencia;
                        g2.generaMatriz_Adaycencia();
                        int[,] matrizGrafo2 = g2.array_adyacencia;

                        if (comparaMatriz(matrizGrafo1, matrizGrafo2, tam))
                        {
                            MessageBox.Show("Las Matrices son Iguales");
                            return(true);
                        }
                        else
                        {
                            long[] fact = { 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800,
                                            39916800 };
                            int    count  = g1.list_vertice.Count;
                            int[]  indexp = new int[count];

                            for (int i = 0; i < count; i++)
                            {
                                indexp[i] = i;
                            }

                            for (int i = 0; i < fact[count - 1]; i++)
                            {
                                siguientePermutacion(indexp);
                                string Aux = "";
                                for (int z = 0; z < indexp.GetLength(0); z++)
                                {
                                    Aux += "{" + (z + 1) + " , " + (indexp[z] + 1) + "}   ";
                                }
                                if (PruebaPermutacion(matrizGrafo1, matrizGrafo2, indexp))
                                {
                                    MessageBox.Show("Las Matrices fueron sometidas a fuerza bruta y son iguales");
                                    return(true);
                                }
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("Numero de aristas diferente");
                        return(false);
                    }
                }
                else
                {
                    MessageBox.Show("Numero de vertices diferente");
                    return(false);
                }
            }
            else
            {
                MessageBox.Show("Uno o ambos nodos sobn Nulos");
                return(false);
            }
            return(false);
        }
예제 #3
0
        public bool biyeccion(Grafo grafo1, Grafo grafo2)
        {
            int sumaColumna = 0;

            //Generar matrices de adyacencia
            grafo1.generaMatriz_Adaycencia();
            grafo2.generaMatriz_Adaycencia();

            int[,] MatrizU = grafo1.array_adyacencia;
            int[,] MatrizV = grafo2.array_adyacencia;

            List <int> arregloGradosSalidaColumna;

            if ((grafo1.list_vertice.Count == grafo2.list_vertice.Count))   // Si tenemos el mismo número de relaciones y nodos
            {
                if (grafo1.list_arista.Count == grafo2.list_arista.Count)   // Si tenemos el mismo número de relaciones y nodos
                {
                    for (int i = 0; i < grafo1.list_vertice.Count - 1; i++) // Calcula los grados
                    {
                        arregloGradosSalidaColumna = new List <int>();
                        sumaColumna = grafo1.obtenGradoEntradaNodo(grafo1.list_vertice[i]);
                        for (int j = 0; j < grafo1.list_vertice.Count; j++)
                        {
                            if (MatrizU[j, i] == 1)
                            {
                                int NumAuxGrados = 0;
                                for (int z = 0; z < grafo1.list_vertice.Count; z++)
                                {
                                    NumAuxGrados += MatrizU[z, j];
                                }
                                arregloGradosSalidaColumna.Add(NumAuxGrados);
                            }
                        }
                        int colSim = buscaColumnaSimilar(sumaColumna, i + 1, MatrizV, grafo2, arregloGradosSalidaColumna);

                        if (colSim != 0)
                        {
                            //Permutar columnas con filas
                            intercambiaColumnna(i, colSim, MatrizV, grafo1.list_vertice.Count);
                            intercambiaRenglon(i, colSim, MatrizV, grafo1.list_vertice.Count);
                            if (comparaMatrices(MatrizU, MatrizV, grafo1.list_vertice.Count))
                            {
                                ady_biy_resultante.Columns.Add("Index", "");

                                for (int j = 0; j < MatrizV.GetLength(1) - 1; j++)
                                {
                                    ady_biy_resultante.Columns.Add("Value", "");
                                }

                                for (int k = 0; k < grafo2.list_vertice.Count(); k++)
                                {
                                    DataGridViewRow row = new DataGridViewRow();
                                    row.CreateCells(ady_biy_resultante);
                                    for (int j = 0; j < grafo2.list_vertice.Count(); j++)
                                    {
                                        row.Cells[j].Value = MatrizV[k, j].ToString();
                                    }
                                    ady_biy_resultante.Rows.Add(row);
                                }
                                MessageBox.Show("Grafo V recorrido por biyeccion y las matrices coinciden");
                                return(true);
                            }
                        }
                    }
                }
                else
                {
                    MessageBox.Show("Los grafos no tienen el mismo número de aristas!!!!");
                    return(false);
                }
            }
            else
            {
                MessageBox.Show("Los grafos no tienen el mismo número de nodos!!!!");
                return(false);
            }
            return(false);
        }