Advertisement
Guest User

heuristicabool

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