def branch_bound_search(order): branch_bound_matrix, point_list = build_bb_matrix(order) points = sorted(set(point_list), key=point_list.index) points = find_common_point(points, point_list) start_point = startpoint reduced_matrix, cost = reduce_matrix(branch_bound_matrix) start_node = TreeNode(startpoint, reduced_matrix, cost) start_node.set_id(0) last_node = start_node queue = Queue.PriorityQueue() # queue.put(start_node) nn_path, _, _ = nn_search(order) upper_bound_cost = find_upper_bound(nn_path, point_list, start_node) # print upper_bound_cost id = start_node.get_id() for point in points: # if point == endpoint: # continue child = build_tree_node(point, start_node, point_list) id = id + 1 child.set_id(id) if child.get_cost() > upper_bound_cost: continue queue.put(child) candidate = nn_path paths = {} id = 0 start = time.time() last_matrix = None visited = [] while (queue.qsize() > 0): if (time.time() > start + 30): print('Time Out!') return candidate, calculate_path_distance(candidate), last_matrix parent_node = queue.get() visited.append(parent_node.get_point()) if (paths.has_key(parent_node)): path = paths[parent_node] else: path = [] path.append(start_point) path.append(parent_node.get_point()) parent_level = parent_node.get_level() for point in points: # neighbor = get_neighbor(point, point_list) if point == parent_node.get_point( ) or point in path or point == endpoint: continue # if(parent_node.get_point() <> neighbor): id = id + 1 child = build_tree_node(point, parent_node, point_list) child.set_level(parent_level + 1) child.set_id(id) parent_node.add_child(child) # visited.append(point) path.append(child.get_point()) # print len(path) # else: # continue if (len(path) == len(nn_path) - 1): if (child.get_cost() > INFINITY - 2000): path.remove(child.get_point()) continue path.append(endpoint) candidate = path return candidate, calculate_path_distance( candidate), last_matrix else: # print (len(path)) paths[child] = copy.deepcopy(path) path.remove(child.get_point()) last_matrix = child.get_matrix() if (child.get_cost() >= upper_bound_cost): continue queue.put(child) path.append(endpoint) return candidate, calculate_path_distance(candidate), last_matrix