Guest User

Untitled

a guest
Oct 22nd, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.80 KB | None | 0 0
  1. from itertools import islice,combinations
  2.  
  3. def load(arq='pcv04.txt'):
  4. n, mat = [],[] #inicializa n, m e a lista de objetos como objetos mutáveis
  5. with open(arq,'r') as entrada:
  6. n = int((entrada.readline()).rstrip()) #extrai o n da primeira linha
  7. tmp = (list((islice(entrada,0,None)))) #salva o resto do arquivo em uma lista temporária
  8. for x in tmp:
  9. unidade = list(map(int, x.rstrip().split(" "))) #converte em inteiros, salva na lista
  10. mat.append(unidade)
  11.  
  12. return n, mat
  13.  
  14. def held_karp(mat,n):
  15.  
  16. mat_d = {(frozenset([0, x+1]), x+1): (dist, [0,x+1]) for x,dist in enumerate(mat[0][1:])}
  17. # Utilizando a matriz de entrada como iterador, para montar o dicionário inicial
  18. # Dicionário/Matriz de Distancias gerado:
  19. # Chave: set imutável (frozenset) com itens percorridos, rota escolhida
  20. # Valor: distancia percorrida, caminho feito
  21.  
  22. for m in range(2, n): #executa para cada linha da matriz
  23. tmp = {} #dicionario temporario, que será atualizado com os novos valores
  24. for S in [frozenset(C) | {0} for C in combinations(range(1, n), m)]: # para cada possivel combinação de
  25. for j in S - {0}: # loop que adiciona no dicionario os novos subsets (partes) do caminho percorridas e seus valores minimos
  26. tmp[(S, j)] = min( [(mat_d[(S-{j},k)][0] + mat[k][j], mat_d[(S-{j},k)][1] + [j]) for k in S if k != 0 and k!=j])
  27. mat_d = tmp # atualiza o dicionário com os novos valores
  28.  
  29. # o Resultado é a entrada no dicionário cujo caminho possui o valor mínimo.
  30. res = min([(mat_d[d][0] + mat[0][d[1]], mat_d[d][1]) for d in iter(mat_d)])
  31.  
  32. res[1].append(0) #adiciona o início no código
  33. print("Custo Total: " + str(res[0]) + ", Caminho: " + str(res[1]))
  34.  
  35.  
  36. n, mat = load("pcv04.txt")
  37.  
  38. held_karp(mat, n)
Add Comment
Please, Sign In to add comment