branchandprune
Branch and bound is a general algorithm design paradigm for discrete and combinatorial optimization problems, as well as mathematical optimization. It is a systematic search of the solution space. The "branching" part refers to the process of dividing the problem into smaller subproblems. This is typically done by selecting a variable and creating new subproblems where the variable is constrained to take on specific values or fall within certain ranges. The "bounding" part involves calculating an upper or lower bound for the optimal solution within each subproblem. If the bound of a subproblem indicates that it cannot possibly contain a better solution than the best one found so far, that subproblem can be "pruned" and discarded, meaning it is not explored further. This pruning step is crucial for efficiency, as it avoids the exhaustive enumeration of all possible solutions. Branch and bound algorithms typically maintain a list of active subproblems and iteratively select one to branch on. The choice of which subproblem to explore next can influence the algorithm's performance. This method is widely applied in areas such as integer programming, the traveling salesman problem, and job scheduling.