def travel(adj_mat, src=0): # Start time start = clock() optimal_tour = [] n = len(adj_mat) if not n: raise ValueError("Invalid adj Matrix") u = Node() PQ = PriorityQueue() optimal_length = 0 v = Node(level=0, path=[0]) min_length = float('inf') # infinity v.bound = bound(adj_mat, v) PQ.put(v) while not PQ.empty(): v = PQ.get() if v.bound < min_length: u.level = v.level + 1 for i in filter(lambda x: x not in v.path, range(1, n)): u.path = v.path[:] u.path.append(i) if u.level == n - 2: l = set(range(1, n)) - set(u.path) u.path.append(list(l)[0]) # putting the first vertex at last u.path.append(0) _len = length(adj_mat, u) if _len < min_length: min_length = _len optimal_length = _len optimal_tour = u.path[:] else: u.bound = bound(adj_mat, u) if u.bound < min_length: PQ.put(u) # make a new node at each iteration! python it is!! u = Node(level=u.level) # shifting to proper source(start of path) optimal_tour_src = optimal_tour if src is not 1: optimal_tour_src = optimal_tour[:-1] y = optimal_tour_src.index(src) optimal_tour_src = optimal_tour_src[y:] + optimal_tour_src[:y] optimal_tour_src.append(optimal_tour_src[0]) BnB_time = clock() - start BnB_output = [ "Branch and Bound", optimal_length, optimal_tour_src, BnB_time ] #return optimal_tour_src, optimal_length return BnB_output
def travel(adj_mat, src=0): optimal_tour = [] n = len(adj_mat) if not n: raise ValueError("Invalid adj Matrix") u = Node() PQ = PriorityQueue() optimal_length = 0 v = Node(level=0, path=[0]) min_length = float('inf') # infinity v.bound = bound(adj_mat, v) PQ.put(v) while not PQ.empty(): v = PQ.get() if v.bound < min_length: u.level = v.level + 1 for i in filter(lambda x: x not in v.path, range(1, n)): u.path = v.path[:] u.path.append(i) if u.level == n - 2: l = set(range(1, n)) - set(u.path) u.path.append(list(l)[0]) # putting the first vertex at last u.path.append(0) _len = length(adj_mat, u) if _len < min_length: min_length = _len optimal_length = _len optimal_tour = u.path[:] else: u.bound = bound(adj_mat, u) if u.bound < min_length: PQ.put(u) # make a new node at each iteration! python it is!! u = Node(level=u.level) # shifting to proper source(start of path) optimal_tour_src = optimal_tour if src is not 1: optimal_tour_src = optimal_tour[:-1] y = optimal_tour_src.index(src) optimal_tour_src = optimal_tour_src[y:] + optimal_tour_src[:y] optimal_tour_src.append(optimal_tour_src[0]) return optimal_tour_src, optimal_length
def greenTravel(adj_mat, src): optimal_tour = [] n = len(adj_mat) u = Node() PQ = PriorityQueue() optimal_length = 0 v = Node(level=0, path=[0]) min_length = float('inf') v.bound = bound(adj_mat, v) PQ.put(v) while not PQ.empty(): v = PQ.get() if v.bound < min_length: u.level = v.level + 1 for i in filter(lambda x: x not in v.path, range(1, n)): u.path = v.path[:] u.path.append(i) if u.level == n - 2: l = set(range(1, n)) - set(u.path) u.path.append(list(l)[0]) u.path.append(0) _len = length(adj_mat, u) if _len < min_length: min_length = _len optimal_length = _len optimal_tour = u.path[:] else: u.bound = bound(adj_mat, u) if u.bound < min_length: PQ.put(u) u = Node(level=u.level) optimal_tour_src = optimal_tour if src is not 1: optimal_tour_src = optimal_tour[:-1] y = optimal_tour_src.index(src) optimal_tour_src = optimal_tour_src[y:] + optimal_tour_src[:y] optimal_tour_src.append(optimal_tour_src[0]) return optimal_tour_src, optimal_length