Пример #1
0
        private GeradorCluster[,] geraMatrizCluster(Dissimilaridade[,] matrizDissimilaridade)
        {
            int dimensaoMatriz = (int)Math.Sqrt(matrizDissimilaridade.Length);

            GeradorCluster[,] novaMatriz = new GeradorCluster[dimensaoMatriz, dimensaoMatriz];

            for (int i = 0; i < dimensaoMatriz; i++)
            {
                //percorre a matriz de dissimilaridade criando uma matriz de cluster, onde cada posição agora poderá ter uma lista de areas de pesquisa
                for (int j = 0; j < dimensaoMatriz; j++)
                {
                    if (matrizDissimilaridade[i, j] != null)
                    {
                        GeradorCluster cluster = new GeradorCluster();
                        if (matrizDissimilaridade[i, j].AreaPesquisa.Equals(matrizDissimilaridade[i, j].AreaPesquisaCorrespondente))
                        {
                            cluster.listaAreaPesquisa.Add(matrizDissimilaridade[i, j].AreaPesquisa);
                            novaMatriz[i, j] = cluster;
                        }
                        else
                        {
                            cluster.listaAreaPesquisa.Add(matrizDissimilaridade[i, j].AreaPesquisa);
                            cluster.listaAreaPesquisa.Add(matrizDissimilaridade[i, j].AreaPesquisaCorrespondente);
                            cluster.distanciaCluster = matrizDissimilaridade[i, j].Grau;
                            novaMatriz[i, j]         = cluster;
                        }
                    }
                }
            }
            return(novaMatriz);
        }
Пример #2
0
        private void adicionaEBuscaClusterComLigacaoNovoCluster(GeradorCluster[,] novaMatriz, int linhaMenorDistanciaCluster, int colunaMenorDistanciaCluster, GeradorCluster[,] matrizCluster)
        {
            //une cluster mais proximo e o coloca na primeira posição da matriz
            novaMatriz[0, 0] = new GeradorCluster();
            novaMatriz[0, 0].listaAreaPesquisa = new List <AreaPesquisa>();
            novaMatriz[0, 0].listaAreaPesquisa.AddRange(matrizCluster[linhaMenorDistanciaCluster, linhaMenorDistanciaCluster].listaAreaPesquisa);
            foreach (AreaPesquisa item in matrizCluster[colunaMenorDistanciaCluster, colunaMenorDistanciaCluster].listaAreaPesquisa)
            {
                if (!novaMatriz[0, 0].listaAreaPesquisa.Contains(item))
                {
                    novaMatriz[0, 0].listaAreaPesquisa.Add(item);
                    novaMatriz[0, 0].distanciaCluster = 0;
                }
            }
            //busca todos os outros clusters e calcula sua distancia para o novo cluster
            int coluna = 0;

            for (int linha = 0; linha < matrizCluster.GetLength(0); linha++)
            {
                if (linha != linhaMenorDistanciaCluster && coluna != colunaMenorDistanciaCluster)
                {
                    setaClusterComNovoCluster(novaMatriz, linhaMenorDistanciaCluster, colunaMenorDistanciaCluster, linha, matrizCluster);
                }
                coluna++;
            }
        }
Пример #3
0
        private GeradorCluster[,] setaMatrizFilha(GeradorCluster[,] matrizCluster, int linhaMenorDistanciaCluster, int colunaMenorDistanciaCluster)
        {   //cria uma nova matriz com tamanho de linha e coluna uma unidade menor que a matriz atual
            int tamanhoMatriz = (int)Math.Sqrt(matrizCluster.Length);

            GeradorCluster[,] novaMatriz = new GeradorCluster[tamanhoMatriz - 1, tamanhoMatriz - 1];
            //seta nova matriz a partir das cordenadas do menor cluster encontradas
            adicionaEBuscaClusterComLigacaoNovoCluster(novaMatriz, linhaMenorDistanciaCluster, colunaMenorDistanciaCluster, matrizCluster);
            buscaClusterSemLigacaoComNovoCluster(novaMatriz, linhaMenorDistanciaCluster, colunaMenorDistanciaCluster, matrizCluster);

            return(novaMatriz);
        }
Пример #4
0
        private GeradorCluster buscaUltimoClusterPai(GeradorCluster clusterPai)
        {   //busca o ultimo pai para a fila de clusters
            GeradorCluster ultimoPaiEncontrado = clusterPai;

            while (ultimoPaiEncontrado.clusterFilho != null)
            {
                if (ultimoPaiEncontrado.clusterFilho == null)
                {
                    ultimoPaiEncontrado = clusterPai;
                }
                else
                {
                    ultimoPaiEncontrado = ultimoPaiEncontrado.clusterFilho;
                }
            }
            return(ultimoPaiEncontrado);
        }
Пример #5
0
        private void geraCluster(GeradorCluster[,] matrizCluster)
        {
            int tamanhoVetorCluster = int.MaxValue;

            while (tamanhoVetorCluster > 1)
            {   //se o pai ainda nao tiver sido iniciado, gera o primeiro cluster com todas areas de pesquisa disponiveis em seu vetor de cluster
                if (this.clusterPai == null)
                {
                    int coluna = 0;
                    this.clusterPai              = new GeradorCluster();
                    this.clusterPai.clusterPai   = null;
                    tamanhoVetorCluster          = (int)Math.Sqrt(matrizCluster.Length);
                    this.clusterPai.vetorCluster = new GeradorCluster[tamanhoVetorCluster];
                    for (int linha = 0; linha < tamanhoVetorCluster; linha++)
                    {
                        this.clusterPai.vetorCluster[linha] = new GeradorCluster();
                        this.clusterPai.vetorCluster[linha].listaAreaPesquisa = new List <AreaPesquisa>();
                        this.clusterPai.vetorCluster[linha].listaAreaPesquisa.Add(matrizCluster[linha, coluna].listaAreaPesquisa[0]);
                        coluna++;
                    }
                }

                else
                {   //busca cluster com menor grau de dissimilaridade para setar cluster filho
                    int[] indiceMenorDissimilaridade = buscaIndiceMenorDissimilaridade(matrizCluster);
                    GeradorCluster[,] matrizFilha = setaMatrizFilha(matrizCluster, indiceMenorDissimilaridade[0], indiceMenorDissimilaridade[1]);
                    matrizCluster = null;
                    matrizCluster = matrizFilha;
                    tamanhoVetorCluster--;
                    GeradorCluster ultimoclusterPai = buscaUltimoClusterPai(this.clusterPai);
                    ultimoclusterPai.clusterFilho = new GeradorCluster();
                    ultimoclusterPai.clusterFilho.vetorCluster = new GeradorCluster[tamanhoVetorCluster];

                    for (int i = 0; i < matrizFilha.GetLength(0); i++)
                    {   //seta cluster filho com todos clusters da diagonal da matriz (o tamanho do vetorCluster, determina o grau de corte desse cluster)
                        ultimoclusterPai.clusterFilho.vetorCluster[i] = new GeradorCluster();
                        ultimoclusterPai.clusterFilho.vetorCluster[i].listaAreaPesquisa = new List <AreaPesquisa>();
                        ultimoclusterPai.clusterFilho.vetorCluster[i].listaAreaPesquisa.AddRange(matrizFilha[i, i].listaAreaPesquisa);
                    }
                }
            }
        }
Пример #6
0
        private void setaClusterSemLigacaoComNovoCluster(GeradorCluster[,] novaMatriz, List <AreaPesquisa> lista, int distanciaCluster)
        {
            int auxiliarDiagonal = 1;

            for (int i = 1; i < novaMatriz.GetLength(0); i++)
            {
                for (int j = auxiliarDiagonal; j < novaMatriz.GetLength(0); j++)
                {   //busca uma posicao da matriz que esteja vazia, sempre andando na metade a direita da diagonal
                    if (novaMatriz[i, j] == null)
                    {
                        novaMatriz[i, j] = new GeradorCluster();
                        novaMatriz[i, j].listaAreaPesquisa = new List <AreaPesquisa>();
                        novaMatriz[i, j].listaAreaPesquisa.AddRange(lista);
                        novaMatriz[i, j].distanciaCluster = distanciaCluster;
                        return;
                    }
                }
                auxiliarDiagonal++;
            }
        }
Пример #7
0
        private void setaClusterComNovoCluster(GeradorCluster[,] novaMatriz, int linhaMenorDistanciaCluster, int colunaMenorDistanciaCluster, int posicaoClusterPraAdicionar, GeradorCluster[,] matrizCluster)
        {   //pega distancia do cluster atual para o primeiro cluster da nova ligação
            int distanciaParaClusterUm = 0;

            if (posicaoClusterPraAdicionar < linhaMenorDistanciaCluster)
            {
                distanciaParaClusterUm = matrizCluster[posicaoClusterPraAdicionar, linhaMenorDistanciaCluster].distanciaCluster;
            }
            else
            {
                distanciaParaClusterUm = matrizCluster[linhaMenorDistanciaCluster, posicaoClusterPraAdicionar].distanciaCluster;
            }
            //pega distancia do cluster atual para o segundo cluster da nova ligação
            int distanciaParaClusterDois = 0;

            if (posicaoClusterPraAdicionar < colunaMenorDistanciaCluster)
            {
                distanciaParaClusterDois = matrizCluster[posicaoClusterPraAdicionar, colunaMenorDistanciaCluster].distanciaCluster;
            }
            else
            {
                distanciaParaClusterDois = matrizCluster[colunaMenorDistanciaCluster, posicaoClusterPraAdicionar].distanciaCluster;
            }
            //calcula sua distancia para o novo cluster e o adiciona na primeira posição vazia da primeira linha da nova matriz
            for (int coluna = 1; coluna < novaMatriz.GetLength(0); coluna++)
            {
                if (novaMatriz[0, coluna] == null)
                {
                    int            distancia   = Convert.ToInt32((distanciaParaClusterUm + distanciaParaClusterDois) * 0.5);
                    GeradorCluster novoCluster = new GeradorCluster();
                    novoCluster.listaAreaPesquisa = new List <AreaPesquisa>();
                    novoCluster.listaAreaPesquisa.AddRange(matrizCluster[0, 0].listaAreaPesquisa);
                    novoCluster.listaAreaPesquisa.AddRange(matrizCluster[posicaoClusterPraAdicionar, posicaoClusterPraAdicionar].listaAreaPesquisa);
                    novoCluster.distanciaCluster = distancia;
                    novaMatriz[0, coluna]        = novoCluster;
                    return;
                }
            }
        }