Advertisement
Guest User

heuristica

a guest
Nov 23rd, 2014
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.28 KB | None | 0 0
  1. //Implementação da heuristica
  2.  
  3. bool colorirGrafo_Heuristica_(Grafo* grafo, int min) {    //pra ser bool tem que adaptar o codigo pra verificar T e F
  4.    
  5.     // Opt 1 Algoritmo ingenuo
  6.     /*  Supondo uma ordem de percurso dos vértices. Atribuimos uma cor ao primeiro vértice.
  7.     Depois, percorremos sequencialmente todos os vértices. Para cada vértice v visitado,
  8.     consideramos as cores já utilizadas. A primeira cor que não pertence a nenhum dos
  9.     vértices adjacentes a v será escolhida para colorir v. Se os vértices adjacentes
  10.     coloridos já usam todas as cores, o vértice v será colorido com uma nova cor.
  11.     O algoritmo continua assim por diante até a coloração completa do grafo.*/
  12.      //pseudo codigo muito confuso
  13.  
  14. //  opt 2
  15. //  //enquanto existir vertices nao coloridos em G
  16. //  while(   ){
  17. //        //Entre os vertices sem cor de maior grau
  18. //
  19. //        //Escolha o vertice v com maior grau de coloracao
  20. //
  21. //        //atribua a menor cor k possivel para o vertice v : f(v) = k
  22. //
  23. //    }
  24. //    //retorna a coloracao de vertices f
  25.  
  26. //opt 3
  27.  
  28.     int i , j, k;
  29.     int fim = 1;
  30.     int cor = 1;
  31.     int solucoes = 0;
  32.  
  33.     //percore os vertices do grafo
  34.     for(i = 0; i < (grafo)->n_vertices; i++){
  35.         //se o vertice ainda nao foi colorido
  36.         if ((grafo)->cores[i] == -1) {
  37.             //colore vertice com a menor cor possivel
  38.             (grafo)->cores[i] = 1;
  39.             // verifica se existe adjacente com mesma cor
  40.             for(j=0; j<(grafo)->n_vertices; j++) {
  41.                 if((i!=j) && ((grafo)->arestas[i][j] != -1)){
  42.                     // se existe adjacente com mesma cor, pula para prox. cor
  43.                     if((grafo)->cores[i] == (grafo)->cores[j]){
  44.                         (grafo)->cores[i] ++;
  45.                         // se ja encontrou um resultado melhor, poda ramo da arvore
  46.                         if((grafo)->cores[i] >= min){
  47.                             cor = 1;
  48.                             (grafo)->cores[i] = 0;
  49.                             for(k = 0; k < (grafo)->n_vertices; k++){
  50.                                 if( (grafo)->cores[k] > cor )
  51.                                     cor = (grafo)->cores[j];
  52.                             }
  53.                             return;
  54.                         }
  55.                         if( cor < (grafo)->cores[i]){
  56.                             cor = (grafo)->cores[i];
  57.                         }
  58.                         j=0;
  59.                         k=0;
  60.                     }
  61.                 }
  62.                 //repete o processo para os demais vertices nao coloridos
  63.                 colorirGrafo_Heuristica_(grafo, min);
  64.                 //descolore o vertice para tentar uma nova coloracao
  65.                 cor = 1;
  66.                 (grafo)->cores[i] = 0;
  67.                 for(k = 0; k < grafo->n_vertices; k++){
  68.                     if( (grafo)->cores[k] > cor)
  69.                         cor = (grafo)->cores[k];
  70.                 }
  71.                 //sinaliza que ainda nao coloriu o grafo inteiro
  72.                 fim = 0;
  73.             }
  74.         }
  75.         //se coloriu o grafo inteiro:
  76.         //incrementa o numero de solucoes testadas e atualiza o valor de cores
  77.         if (fim){
  78.             solucoes++;
  79.             if( (min) > cor){
  80.                 (min = cor);
  81.             }
  82.         }
  83.     }
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement