Пример #1
0
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