*๋
8:ํ>c       s     d  k  Z   d  k Z  d  k Z  d d  Z  g  d  Z  d d  Z > d d d  Z q d d  Z  e d j o e i	 d  Z
  d	 GH e e
 d  Z  e i e e
  Z  xo e d
 e
 i    d  rS Z  e e
 e  Z  e i e e
  Z  e e j  o  e Z  e Z n qแ W  d Ge Gd Gd Gก x e d ก r Z ข e GqZWฃ d GHฅ d GHฆ d GHง e e
 d d
 Z จ e e d d d Z ฉ e i e e
  Z ช x e d
 e
 i    d ช rp Z ซ d Ge Gฌ e e e d d Z ญ e i e e
  Z ฎ d Ge GHฏ e e j  o ฐ e Z ฑ e Z n qใWฒ d Ge Gd Gd Gณ x e d ณ r Z ด e GqyWต d GHn d  S(   Ni    c    s|    
  g  }  t |  | |   xI |  i   d  r6 }  |  i |  d j o  t |  | |  n q4 W | Sd S(   s}   Retorna a ordem de visita de vertices num percurso feito atrav้s
	de busca em profundidade. Vertices aparecem apenas uma vez.i    s   brancoN(   s   caminhos   VisitaBuscaProfundidades   gs   inicios   listaVerticess   vs   getCor(   s   gs   inicios   vs   caminho(    (    s   ./Heuristicas.pys   PercursoBuscaProfundidade s   	 	c    s|     | i |   |  i | d   xL |  i |  d  r6 }  |  i |  d j o  t |  | |  n q; Wd  S(   Ns   cinzai    s   branco(	   s   caminhos   appends   vs   gs   setCors   listaAdjacencias   us   getCors   VisitaBuscaProfundidade(   s   gs   vs   caminhos   u(    (    s   ./Heuristicas.pys   VisitaBuscaProfundidade s    	c 	   sm     " | o " d GHn # |  i   } $ | i   } ' g  } ( | o ( d GHn ) t i | |  oF * x< | d * r/ } + | \ } } , | i | | d |  q| Wn 0 | o 0 d GHn 1 t i | d d } 2 | d j on 3 | o 3 d GHn 6 xN | i   d 6 r; } 7 | \ } } 8 | i | | | i | |  |  qWn : | Sd S(	   su   Conserta um grafo para a Heuristica da AGM.
	
	Converte ele num grafo completo que garanta a desigualdade triangular.s   	Duplicando o grafo original...s"   	Verificando se o grafo ้ completoi    i   s6   	Verificando se o grafo ้ respeita a desig. triangulars   debugs)   	Modificando o grafo para respeitar a D.TN(   s   debugs   grafo_originals   copys   gs   obtemMaiorArestas   maxs   faltams
   GrafoUtilss
   ehCompletos   es   us   vs   insereArestas   respeitaDesigualdadeTriangulars   max_diffs   listaArestass   modificaArestas   obtemAresta(	   s   grafo_originals   debugs   faltams   us   maxs   vs   gs   es   max_diff(    (    s   ./Heuristicas.pys   ConsertaParaAGM s0   
 	
  	"
 
  	.c    s๏   > ? ] |  } ` | o ` d GHn a t i | |  } c t i | i    } e xN t
 t |   d e r5 } f | | t j	 o g | i | | |  n qj Wj | o j d GHn k t | |  } n | o n d GHn o | Sd S(   s3   Calcula o caminho do TSP usando a heuristica da AGMs   	Gerando AGMi    s   	Gerando o caminho...s   	Feito.N(   s   grafo_originals   gs   debugs   Prims   AGMPrims   raizs   paiss   Grafos   numeroVerticess   g_dfss   ranges   lens   us   Nones   insereArestas   PercursoBuscaProfundidades   caminho(   s   grafo_originals   raizs   debugs   paiss   us   g_dfss   caminhos   g(    (    s   ./Heuristicas.pys   HeuristicaDaAGM> s    	
  	
 
 c    sU  q t w x, |  i   d w r } x |  i | d  q Wy g  } | | }  x๚ t |  i    d  rแ }  |  i | d   | i
 |   t }  t }  x |  i |  d  r }  |  i |  d j o
  qต n  | t j	 o*  | |  i | |  j o
  qต n n  | }  |  i | |  } qต W | } qb W | Sd S(   sl   Executa a heuristica do vizinho mais pr๓ximo no grafo g.
	
	Returna uma lista contendo o caminho encontrado.i    s   brancas   cinzaN(   s   gs   listaVerticess   us   setCors   caminhos   inicios   vertices   ranges   numeroVerticess   zs   appends   Nones   menor_custos   menor_vizinhos   listaAdjacencias   getCors   obtemAresta(   s   gs   inicios   menor_custos   caminhos   zs   vertices   us   menor_vizinho(    (    s   ./Heuristicas.pys   VizinhoMaisProximoq s.    			 			 	
	s   __main__s   ../brazil58.tsps/   Aplicando a heuristica do vizinho mais proximo.i   sD   Pela Heuristica do Caminho Mais proximo, achamos um caminho de custos   
s   Caminho:s    s0   Aplicando a heuristica da Arvore Geradora Minimas&   	Consertando o grafo para a heuristicas   debugs	   	 raiz nos    custos3   Pela Heuristica da AGM, achamos um caminho de custo(   s   Grafos   Prims
   GrafoUtilss   PercursoBuscaProfundidades   VisitaBuscaProfundidades   ConsertaParaAGMs   HeuristicaDaAGMs   VizinhoMaisProximos   __name__s   TSPLIB2Grafos   gs   min_caminhos   custo_caminhos	   min_custos   ranges   numeroVerticess   us   caminhos   custos   is   g_fix(   s
   GrafoUtilss   Grafos   PercursoBuscaProfundidades   HeuristicaDaAGMs   us   VizinhoMaisProximos	   min_custos   g_fixs   VisitaBuscaProfundidades   caminhos   ConsertaParaAGMs   is   gs   custos   Prims   min_caminho(    (    s   ./Heuristicas.pys   ? sV   !3# 		 	 		 	