2011
03.22
03.22
Ayer a medianoche se cumplió el plazo para enviar la solución del camino hamiltoniano del concurso de El País. Efectivamente no tiene solución. Un amigo del trabajo me comentó la demostración (elegante y sencilla al a vez) que es la que se comenta en el vídeo. Te animo a que lo veas, porque resulta fácil de comprender.
Este pequeño programa en python busca caminos hamiltonianos en grafos e imprime la solución (o None si no existe, como es en el ejemplo del concurso):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
#!/usr/bin/env python # -*- coding: utf-8 -*- # vim:ts=4:et:sw=4 class Vertex(object): def __init__(self, node, *nodeList): self.i = node self.nodeList = list(nodeList) def __hash__(self): return self.i def reaches(self, vertex): ''' Can receive an integer or a Vertex ''' if isinstance(vertex, int): return vertex in self.nodeList return self.reaches(vertex.i) def __str__(self): return '< ' + str(self.i) + '>' def __repr__(self): return self.__str__() class Graph(object): def __init__(self): self.vList = {} def add(self, node, *nodeList): vertex = Vertex(node, *nodeList) self.vList[node] = vertex def hamiltonian(self, current = None, pending = None, destiny = None): ''' Returns a list of nodes which represent a hamiltonian path, or None if not found ''' if pending is None: pending = self.vList.values() result = None if current is None: for current in pending: result = self.hamiltonian(current, [x for x in pending if x is not current], current) if result is not None: break else: if pending == []: if current.reaches(destiny): return [current] else: return None for x in [self.vList[v] for v in current.nodeList]: if x in pending: result = self.hamiltonian(x, [y for y in pending if y is not x], destiny) if result is not None: result = [current] + result break return result if __name__ == '__main__': G = Graph() G.add(1, 2, 8, 11) G.add(2, 1, 6, 9) G.add(3, 6, 7, 9, 10) G.add(4, 5, 7, 10) G.add(5, 4, 8, 11) G.add(6, 2, 3, 8) G.add(7, 3, 4, 8) G.add(8, 1, 6, 7, 5) G.add(9, 2, 3, 11) G.add(10, 3, 4, 11) G.add(11, 1, 9, 10, 5) print G.hamiltonian() |

En enlace del vídeo está puesto (en naranja) en la primera línea del primer párrafo del artículo.
Like or Dislike:
0
0
Hola!
Te falta poner el enlace al video!
Saludos
Like or Dislike:
0
0
Hola
Dices algo de un video ¿Podrias poner el enlace?
Like or Dislike:
0
0