Jump to content

Branch and bound: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
top: Try to make the short description more understandable for a general audience as well
Tags: Mobile edit Mobile app edit Android app edit
 
(14 intermediate revisions by 11 users not shown)
Line 1: Line 1:
{{Short description|Optimization by eliminating non optimal solutions to sub-problems}}
{{Short description|Optimization by eliminating non optimal solutions to sub-problems}}
{{graph search algorithm}}
'''Branch and bound''' ('''BB''', '''B&B''', or '''BnB''') is a method for solving optimization problems by breaking them down into smaller sub-problems and using a bounding function to eliminate sub-problems that cannot contain the optimal solution. It is an [[algorithm]] [[algorithmic paradigm| design paradigm]] for [[discrete optimization|discrete]] and [[combinatorial optimization]] problems, as well as [[mathematical optimization]]. A branch-and-bound algorithm consists of a systematic enumeration of candidate solutions by means of [[state space search]]: the set of candidate solutions is thought of as forming a [[Tree (graph theory)|rooted tree]] with the full set at the root. The algorithm explores ''branches'' of this tree, which represent subsets of the solution set. Before enumerating the candidate solutions of a branch, the branch is checked against upper and lower estimated ''bounds'' on the optimal solution, and is discarded if it cannot produce a better solution than the best one found so far by the algorithm.
'''Branch and bound''' ('''BB''', '''B&B''', or '''BnB''') is a method for solving optimization problems by breaking them down into smaller sub-problems and using a bounding function to eliminate sub-problems that cannot contain the optimal solution. It is an [[algorithm]] [[algorithmic paradigm| design paradigm]] for [[discrete optimization|discrete]] and [[combinatorial optimization]] problems, as well as [[mathematical optimization]]. A branch-and-bound algorithm consists of a systematic enumeration of candidate solutions by means of [[state space search]]: the set of candidate solutions is thought of as forming a [[Tree (graph theory)|rooted tree]] with the full set at the root. The algorithm explores ''branches'' of this tree, which represent subsets of the solution set. Before enumerating the candidate solutions of a branch, the branch is checked against upper and lower estimated ''bounds'' on the optimal solution, and is discarded if it cannot produce a better solution than the best one found so far by the algorithm.


The algorithm depends on efficient estimation of the lower and upper bounds of regions/branches of the search space. If no bounds are available, the algorithm degenerates to an exhaustive search.
The algorithm depends on efficient estimation of the lower and upper bounds of regions/branches of the search space. If no bounds are available, the algorithm degenerates to an exhaustive search.


The method was first proposed by [[Ailsa Land]] and [[Alison Harcourt|Alison Doig]] whilst carrying out research at the [[London School of Economics]] sponsored by [[BP|British Petroleum]] in 1960 for [[discrete optimization|discrete programming]],<ref name=land_doig>{{cite news |author = A. H. Land and A. G. Doig | year = 1960 | title = An automatic method of solving discrete programming problems | journal = Econometrica | volume = 28 | issue = 3 | pages = 497–520 | doi=10.2307/1910129}}</ref><ref>{{Cite web|url=http://www.lse.ac.uk/newsletters/pressAndInformation/staffNews/2010/20100218.htm|title=Staff News|website=www.lse.ac.uk|access-date=2018-10-08|archive-date=2021-02-24|archive-url=https://web.archive.org/web/20210224173541/https://www.lse.ac.uk/newsletters/pressAndInformation/staffNews/2010/20100218.htm|url-status=dead}}</ref> and has become the most commonly used tool for solving [[NP-hard]] optimization problems.<ref name="clausen99"/> The name "branch and bound" first occurred in the work of Little ''et al.'' on the [[traveling salesman problem]].<ref name="little"/><ref>{{cite report |last1=Balas |first1=Egon |first2=Paolo |last2=Toth |year=1983 |title=Branch and bound methods for the traveling salesman problem |issue=Management Science Research Report MSRR-488 |publisher=[[Carnegie Mellon University]] Graduate School of Industrial Administration |url=http://apps.dtic.mil/dtic/tr/fulltext/u2/a126957.pdf |url-status=live |archive-url=https://web.archive.org/web/20121020235044/http://www.dtic.mil/dtic/tr/fulltext/u2/a126957.pdf |archive-date=October 20, 2012}}</ref>
The method was first proposed by [[Ailsa Land]] and [[Alison Harcourt|Alison Doig]] whilst carrying out research at the [[London School of Economics]] sponsored by [[BP|British Petroleum]] in 1960 for [[discrete optimization|discrete programming]],<ref name=land_doig>{{cite journal |author = A. H. Land and A. G. Doig | year = 1960 | title = An automatic method of solving discrete programming problems | journal = Econometrica | volume = 28 | issue = 3 | pages = 497–520 | doi=10.2307/1910129| jstor = 1910129 }}</ref><ref>{{Cite web|url=http://www.lse.ac.uk/newsletters/pressAndInformation/staffNews/2010/20100218.htm|title=Staff News|website=www.lse.ac.uk|access-date=2018-10-08|archive-date=2021-02-24|archive-url=https://web.archive.org/web/20210224173541/https://www.lse.ac.uk/newsletters/pressAndInformation/staffNews/2010/20100218.htm|url-status=dead}}</ref> and has become the most commonly used tool for solving [[NP-hard]] optimization problems.<ref name="clausen99"/> The name "branch and bound" first occurred in the work of Little ''et al.'' on the [[traveling salesman problem]].<ref name="little"/><ref>{{cite report |last1=Balas |first1=Egon |first2=Paolo |last2=Toth |year=1983 |title=Branch and bound methods for the traveling salesman problem |issue=Management Science Research Report MSRR-488 |publisher=[[Carnegie Mellon University]] Graduate School of Industrial Administration |url=http://apps.dtic.mil/dtic/tr/fulltext/u2/a126957.pdf |url-status=live |archive-url=https://web.archive.org/web/20121020235044/http://www.dtic.mil/dtic/tr/fulltext/u2/a126957.pdf |archive-date=October 20, 2012}}</ref>


==Overview==
==Overview==
Line 23: Line 22:


===Generic version===
===Generic version===
The following is the skeleton of a generic branch and bound algorithm for minimizing an arbitrary objective function {{mvar|f}}.<ref name="clausen99">{{cite techreport |first=Jens |last=Clausen |title=Branch and Bound Algorithms—Principles and Examples |year=1999 |publisher=[[University of Copenhagen]] |url=http://www.diku.dk/OLD/undervisning/2003e/datV-optimer/JensClausenNoter.pdf |access-date=2014-08-13 |archive-url=https://web.archive.org/web/20150923214803/http://www.diku.dk/OLD/undervisning/2003e/datV-optimer/JensClausenNoter.pdf |archive-date=2015-09-23 |url-status=dead }}</ref> To obtain an actual algorithm from this, one requires a bounding function {{math|bound}}, that computes lower bounds of {{mvar|f}} on nodes of the search tree, as well as a problem-specific branching rule. As such, the generic algorithm presented here is a [[higher-order function]].
The following is the skeleton of a generic branch and bound algorithm for minimizing an arbitrary objective function {{mvar|f}}.<ref name="clausen99">{{cite tech report |first=Jens |last=Clausen |title=Branch and Bound Algorithms—Principles and Examples |year=1999 |publisher=[[University of Copenhagen]] |url=http://www.diku.dk/OLD/undervisning/2003e/datV-optimer/JensClausenNoter.pdf |access-date=2014-08-13 |archive-url=https://web.archive.org/web/20150923214803/http://www.diku.dk/OLD/undervisning/2003e/datV-optimer/JensClausenNoter.pdf |archive-date=2015-09-23 |url-status=dead }}</ref> To obtain an actual algorithm from this, one requires a bounding function {{math|bound}}, that computes lower bounds of {{mvar|f}} on nodes of the search tree, as well as a problem-specific branching rule. As such, the generic algorithm presented here is a [[higher-order function]].


# Using a [[heuristic]], find a solution {{mvar|x<sub>h</sub>}} to the optimization problem. Store its value, {{math|''B'' {{=}} ''f''(''x<sub>h</sub>'')}}. (If no heuristic is available, set {{mvar|B}} to infinity.) {{mvar|B}} will denote the best solution found so far, and will be used as an upper bound on candidate solutions.
# Using a [[heuristic]], find a solution {{mvar|x<sub>h</sub>}} to the optimization problem. Store its value, {{math|''B'' {{=}} ''f''(''x<sub>h</sub>'')}}. (If no heuristic is available, set {{mvar|B}} to infinity.) {{mvar|B}} will denote the best solution found so far, and will be used as an upper bound on candidate solutions.
Line 46: Line 45:
BoundingFunction lower_bound_function /*bound*/)
BoundingFunction lower_bound_function /*bound*/)
{
{
// Step 1 above
// Step 1 above.
double problem_upper_bound = std::numeric_limits<double>::infinity; // = B
double problem_upper_bound = std::numeric_limits<double>::infinity; // = B
CombinatorialSolution heuristic_solution = heuristic_solve(problem); // x_h
CombinatorialSolution heuristic_solution = heuristic_solve(problem); // x_h
Line 96: Line 95:
</ref>
</ref>


==Applications==
== Applications ==
{{Prose|section|date=February 2023}}
This approach is used for a number of [[NP-hard]] problems:
This approach is used for a number of [[NP-hard]] problems:
* [[Integer programming]]
* [[Integer programming]]
Line 103: Line 103:
* [[Quadratic assignment problem]] (QAP)
* [[Quadratic assignment problem]] (QAP)
* [[Maximum satisfiability problem]] (MAX-SAT)
* [[Maximum satisfiability problem]] (MAX-SAT)
* [[Nearest neighbor search]]<ref>{{cite journal |last1=Fukunaga |first1=Keinosuke |first2=Patrenahalli M. |last2=Narendra |title=A branch and bound algorithm for computing {{mvar|k}}-nearest neighbors |journal=IEEE Transactions on Computers |year=1975 |pages=750–753|doi=10.1109/t-c.1975.224297 }}</ref> (by [[Keinosuke Fukunaga]])
* [[Nearest neighbor search]]<ref>{{cite journal |last1=Fukunaga |first1=Keinosuke |first2=Patrenahalli M. |last2=Narendra |title=A branch and bound algorithm for computing {{mvar|k}}-nearest neighbors |journal=IEEE Transactions on Computers |year=1975 |issue=7 |pages=750–753|doi=10.1109/t-c.1975.224297 |s2cid=5941649 }}</ref> (by [[Keinosuke Fukunaga]])
* [[Flow shop scheduling]]
* [[Flow shop scheduling]]
* [[Cutting stock problem]]
* [[Cutting stock problem]]
Line 111: Line 111:
* [[0/1 knapsack problem]]
* [[0/1 knapsack problem]]
* [[Set cover problem]]
* [[Set cover problem]]
* [[Feature selection]] in [[machine learning]]<ref>{{cite journal |title=A branch and bound algorithm for feature subset selection |last1=Narendra |first1=Patrenahalli M. |last2=Fukunaga |first2=K. |journal=IEEE Transactions on Computers |volume=C-26 |issue=9 |year=1977 |pages=917–922 |doi=10.1109/TC.1977.1674939 |url=http://www.computer.org/csdl/trans/tc/1977/09/01674939.pdf}}</ref><ref>{{cite arXiv |last=Hazimeh |first=Hussein| last2=Mazumder |first2=Rahul |last3=Saab |first3=Ali |eprint=2004.06152 |title=Sparse Regression at Scale: Branch-and-Bound rooted in First-Order Optimization |date=2020}}</ref>
* [[Feature selection]] in [[machine learning]]<ref>{{cite journal |title=A branch and bound algorithm for feature subset selection |last1=Narendra |first1=Patrenahalli M. |last2=Fukunaga |first2=K. |journal=IEEE Transactions on Computers |volume=C-26 |issue=9 |year=1977 |pages=917–922 |doi=10.1109/TC.1977.1674939 |s2cid=26204315 |url=http://www.computer.org/csdl/trans/tc/1977/09/01674939.pdf}}</ref><ref>{{cite arXiv |last1=Hazimeh |first1=Hussein| last2=Mazumder |first2=Rahul |last3=Saab |first3=Ali |eprint=2004.06152 |title=Sparse Regression at Scale: Branch-and-Bound rooted in First-Order Optimization |date=2020|class=stat.CO }}</ref>
* [[Structured prediction]] in [[computer vision]]<ref>{{Cite journal | first1 = Sebastian | last1 = Nowozin | first2 = Christoph H. | last2 = Lampert | title = Structured Learning and Prediction in Computer Vision | journal = Foundations and Trends in Computer Graphics and Vision | volume = 6 | issue = 3–4 | year = 2011 | pages = 185–365 | doi = 10.1561/0600000033 | isbn = 978-1-60198-457-9| citeseerx = 10.1.1.636.2651 }}</ref>{{rp|267–276}}
* [[Structured prediction]] in [[computer vision]]<ref>{{Cite journal | first1 = Sebastian | last1 = Nowozin | first2 = Christoph H. | last2 = Lampert | title = Structured Learning and Prediction in Computer Vision | journal = Foundations and Trends in Computer Graphics and Vision | volume = 6 | issue = 3–4 | year = 2011 | pages = 185–365 | doi = 10.1561/0600000033 | isbn = 978-1-60198-457-9| citeseerx = 10.1.1.636.2651 }}</ref>{{rp|267–276}}
* [[Arc routing problem]], including Chinese Postman problem
* [[Arc routing problem]], including Chinese Postman problem
Line 130: Line 130:
<math>4x_1+7x_2\leq280</math>
<math>4x_1+7x_2\leq280</math>


<math>x_1 x_2\geq0</math>
<math>x_1, x_2\geq0</math>


<math>x_1</math> and <math>x_2</math> are integers.
<math>x_1</math> and <math>x_2</math> are integers.
Line 138: Line 138:
The third point is <math>\begin{bmatrix}0\\0\end{bmatrix}</math>. This is a [[Convex hull|convex hull region]] so the solution lies on one of the vertices of the region. We can find the intersection using row reduction, which is <math>\begin{bmatrix}70/3\\80/3\end{bmatrix}</math>, or <math>\begin{bmatrix} 23.333\\26.667\end{bmatrix}</math> with a value of 276.667. We test the other endpoints by sweeping the line over the region and find this is the maximum over the reals.
The third point is <math>\begin{bmatrix}0\\0\end{bmatrix}</math>. This is a [[Convex hull|convex hull region]] so the solution lies on one of the vertices of the region. We can find the intersection using row reduction, which is <math>\begin{bmatrix}70/3\\80/3\end{bmatrix}</math>, or <math>\begin{bmatrix} 23.333\\26.667\end{bmatrix}</math> with a value of 276.667. We test the other endpoints by sweeping the line over the region and find this is the maximum over the reals.


We choose the variable with the maximum fractional part, in this case <math>x_2</math> becomes the parameter for the branch and bound method. We branch to <math>x_2\leq26</math> and obtain 276 @ <math>\langle 24,26\rangle</math>. We have reached an integer solution so we move to the other branch <math>x_2\geq27</math>. We obtain 275.75 @<math>\langle 22.75, 27\rangle</math>. We have a decimal so we branch <math>x_1</math> to <math>x_1\leq22</math> and we find 274.571 @<math>\langle 22,27.4286\rangle</math>. We try the other branch <math>x_1\geq23</math> and there are no feasible solutions. Therefore, the maximum is 276 with <math>x_1\longmapsto 24</math> and <math>x_2\longmapsto 26</math>.
We choose the variable with the maximum fractional part, in this case <math>x_2</math> becomes the parameter for the branch and bound method. We branch to <math>x_2\leq26</math> and obtain 276 @ <math>\langle 24,26\rangle</math>. We have reached an integer solution so we move to the other branch <math>x_2\geq27</math>. We obtain 275.75 @<math>\langle 22.75, 27\rangle</math>. We have a decimal so we branch <math>x_1</math> to <math>x_1\leq22</math> and we find 274.571 @<math>\langle 22,27.4286\rangle</math>. We try the other branch <math>x_1\geq23</math> and there are no feasible solutions. Therefore, the maximum is 276 with <math>x_1\longmapsto 24</math> and <math>x_2\longmapsto 26</math>.


==See also==
==See also==
* [[Backtracking]]
* [[Backtracking]]
* [[Branch and cut|Branch-and-cut]], a hybrid between branch-and-bound and the [[cutting plane]] methods that is used extensively for solving [[integer linear programs]].
* [[Branch and cut|Branch-and-cut]], a hybrid between branch-and-bound and the [[cutting plane]] methods that is used extensively for solving [[integer linear programs]].
* [[Alpha-beta pruning]]
* [[Evolutionary algorithm]]
* [[Alpha–beta pruning]]


==References==
==References==

Latest revision as of 15:24, 7 August 2024

Branch and bound (BB, B&B, or BnB) is a method for solving optimization problems by breaking them down into smaller sub-problems and using a bounding function to eliminate sub-problems that cannot contain the optimal solution. It is an algorithm design paradigm for discrete and combinatorial optimization problems, as well as mathematical optimization. A branch-and-bound algorithm consists of a systematic enumeration of candidate solutions by means of state space search: the set of candidate solutions is thought of as forming a rooted tree with the full set at the root. The algorithm explores branches of this tree, which represent subsets of the solution set. Before enumerating the candidate solutions of a branch, the branch is checked against upper and lower estimated bounds on the optimal solution, and is discarded if it cannot produce a better solution than the best one found so far by the algorithm.

The algorithm depends on efficient estimation of the lower and upper bounds of regions/branches of the search space. If no bounds are available, the algorithm degenerates to an exhaustive search.

The method was first proposed by Ailsa Land and Alison Doig whilst carrying out research at the London School of Economics sponsored by British Petroleum in 1960 for discrete programming,[1][2] and has become the most commonly used tool for solving NP-hard optimization problems.[3] The name "branch and bound" first occurred in the work of Little et al. on the traveling salesman problem.[4][5]

Overview

[edit]

The goal of a branch-and-bound algorithm is to find a value x that maximizes or minimizes the value of a real-valued function f(x), called an objective function, among some set S of admissible, or candidate solutions. The set S is called the search space, or feasible region. The rest of this section assumes that minimization of f(x) is desired; this assumption comes without loss of generality, since one can find the maximum value of f(x) by finding the minimum of g(x) = −f(x). A B&B algorithm operates according to two principles:

  • It recursively splits the search space into smaller spaces, then minimizing f(x) on these smaller spaces; the splitting is called branching.
  • Branching alone would amount to brute-force enumeration of candidate solutions and testing them all. To improve on the performance of brute-force search, a B&B algorithm keeps track of bounds on the minimum that it is trying to find, and uses these bounds to "prune" the search space, eliminating candidate solutions that it can prove will not contain an optimal solution.

Turning these principles into a concrete algorithm for a specific optimization problem requires some kind of data structure that represents sets of candidate solutions. Such a representation is called an instance of the problem. Denote the set of candidate solutions of an instance I by SI. The instance representation has to come with three operations:

  • branch(I) produces two or more instances that each represent a subset of SI. (Typically, the subsets are disjoint to prevent the algorithm from visiting the same candidate solution twice, but this is not required. However, an optimal solution among SI must be contained in at least one of the subsets.[6])
  • bound(I) computes a lower bound on the value of any candidate solution in the space represented by I, that is, bound(I) ≤ f(x) for all x in SI.
  • solution(I) determines whether I represents a single candidate solution. (Optionally, if it does not, the operation may choose to return some feasible solution from among SI.[6]) If solution(I) returns a solution then f(solution(I)) provides an upper bound for the optimal objective value over the whole space of feasible solutions.

Using these operations, a B&B algorithm performs a top-down recursive search through the tree of instances formed by the branch operation. Upon visiting an instance I, it checks whether bound(I) is equal or greater than the current upper bound; if so, I may be safely discarded from the search and the recursion stops. This pruning step is usually implemented by maintaining a global variable that records the minimum upper bound seen among all instances examined so far.

Generic version

[edit]

The following is the skeleton of a generic branch and bound algorithm for minimizing an arbitrary objective function f.[3] To obtain an actual algorithm from this, one requires a bounding function bound, that computes lower bounds of f on nodes of the search tree, as well as a problem-specific branching rule. As such, the generic algorithm presented here is a higher-order function.

  1. Using a heuristic, find a solution xh to the optimization problem. Store its value, B = f(xh). (If no heuristic is available, set B to infinity.) B will denote the best solution found so far, and will be used as an upper bound on candidate solutions.
  2. Initialize a queue to hold a partial solution with none of the variables of the problem assigned.
  3. Loop until the queue is empty:
    1. Take a node N off the queue.
    2. If N represents a single candidate solution x and f(x) < B, then x is the best solution so far. Record it and set Bf(x).
    3. Else, branch on N to produce new nodes Ni. For each of these:
      1. If bound(Ni) > B, do nothing; since the lower bound on this node is greater than the upper bound of the problem, it will never lead to the optimal solution, and can be discarded.
      2. Else, store Ni on the queue.

Several different queue data structures can be used. This FIFO queue-based implementation yields a breadth-first search. A stack (LIFO queue) will yield a depth-first algorithm. A best-first branch and bound algorithm can be obtained by using a priority queue that sorts nodes on their lower bound.[3] Examples of best-first search algorithms with this premise are Dijkstra's algorithm and its descendant A* search. The depth-first variant is recommended when no good heuristic is available for producing an initial solution, because it quickly produces full solutions, and therefore upper bounds.[7]

Pseudocode

[edit]

A C++-like pseudocode implementation of the above is:

// C++-like implementation of branch and bound, 
// assuming the objective function f is to be minimized
CombinatorialSolution branch_and_bound_solve(
    CombinatorialProblem problem, 
    ObjectiveFunction objective_function /*f*/,
    BoundingFunction lower_bound_function /*bound*/) 
{
    // Step 1 above.
    double problem_upper_bound = std::numeric_limits<double>::infinity; // = B
    CombinatorialSolution heuristic_solution = heuristic_solve(problem); // x_h
    problem_upper_bound = objective_function(heuristic_solution); // B = f(x_h)
    CombinatorialSolution current_optimum = heuristic_solution;
    // Step 2 above
    queue<CandidateSolutionTree> candidate_queue;
    // problem-specific queue initialization
    candidate_queue = populate_candidates(problem);
    while (!candidate_queue.empty()) { // Step 3 above
        // Step 3.1
        CandidateSolutionTree node = candidate_queue.pop();
        // "node" represents N above
        if (node.represents_single_candidate()) { // Step 3.2
            if (objective_function(node.candidate()) < problem_upper_bound) {
                current_optimum = node.candidate();
                problem_upper_bound = objective_function(current_optimum);
            }
            // else, node is a single candidate which is not optimum
        }
        else { // Step 3.3: node represents a branch of candidate solutions
            // "child_branch" represents N_i above
            for (auto&& child_branch : node.candidate_nodes) {
                if (lower_bound_function(child_branch) <= problem_upper_bound) {
                    candidate_queue.enqueue(child_branch); // Step 3.3.2
                }
                // otherwise, bound(N_i) > B so we prune the branch; step 3.3.1
            }
        }
    }
    return current_optimum;
}

In the above pseudocode, the functions heuristic_solve and populate_candidates called as subroutines must be provided as applicable to the problem. The functions f (objective_function) and bound (lower_bound_function) are treated as function objects as written, and could correspond to lambda expressions, function pointers and other types of callable objects in the C++ programming language.

Improvements

[edit]

When is a vector of , branch and bound algorithms can be combined with interval analysis[8] and contractor techniques in order to provide guaranteed enclosures of the global minimum.[9][10]

Applications

[edit]

This approach is used for a number of NP-hard problems:

Branch-and-bound may also be a base of various heuristics. For example, one may wish to stop branching when the gap between the upper and lower bounds becomes smaller than a certain threshold. This is used when the solution is "good enough for practical purposes" and can greatly reduce the computations required. This type of solution is particularly applicable when the cost function used is noisy or is the result of statistical estimates and so is not known precisely but rather only known to lie within a range of values with a specific probability.[citation needed]

Relation to other algorithms

[edit]

Nau et al. present a generalization of branch and bound that also subsumes the A*, B* and alpha-beta search algorithms.[16]

Optimization Example

[edit]

Branch and bound can be used to solve this problem

Maximize with these constraints

and are integers.

The first step is to relax the integer constraint. We have two extreme points for the first equation that form a line: and . We can form the second line with the vector points and .

the two lines.

The third point is . This is a convex hull region so the solution lies on one of the vertices of the region. We can find the intersection using row reduction, which is , or with a value of 276.667. We test the other endpoints by sweeping the line over the region and find this is the maximum over the reals.

We choose the variable with the maximum fractional part, in this case becomes the parameter for the branch and bound method. We branch to and obtain 276 @ . We have reached an integer solution so we move to the other branch . We obtain 275.75 @. We have a decimal so we branch to and we find 274.571 @. We try the other branch and there are no feasible solutions. Therefore, the maximum is 276 with and .

See also

[edit]

References

[edit]
  1. ^ A. H. Land and A. G. Doig (1960). "An automatic method of solving discrete programming problems". Econometrica. 28 (3): 497–520. doi:10.2307/1910129. JSTOR 1910129.
  2. ^ "Staff News". www.lse.ac.uk. Archived from the original on 2021-02-24. Retrieved 2018-10-08.
  3. ^ a b c Clausen, Jens (1999). Branch and Bound Algorithms—Principles and Examples (PDF) (Technical report). University of Copenhagen. Archived from the original (PDF) on 2015-09-23. Retrieved 2014-08-13.
  4. ^ a b Little, John D. C.; Murty, Katta G.; Sweeney, Dura W.; Karel, Caroline (1963). "An algorithm for the traveling salesman problem" (PDF). Operations Research. 11 (6): 972–989. doi:10.1287/opre.11.6.972. hdl:1721.1/46828.
  5. ^ Balas, Egon; Toth, Paolo (1983). Branch and bound methods for the traveling salesman problem (PDF) (Report). Carnegie Mellon University Graduate School of Industrial Administration. Archived (PDF) from the original on October 20, 2012.
  6. ^ a b Bader, David A.; Hart, William E.; Phillips, Cynthia A. (2004). "Parallel Algorithm Design for Branch and Bound" (PDF). In Greenberg, H. J. (ed.). Tutorials on Emerging Methodologies and Applications in Operations Research. Kluwer Academic Press. Archived from the original (PDF) on 2017-08-13. Retrieved 2015-09-16.
  7. ^ Mehlhorn, Kurt; Sanders, Peter (2008). Algorithms and Data Structures: The Basic Toolbox (PDF). Springer. p. 249.
  8. ^ Moore, R. E. (1966). Interval Analysis. Englewood Cliff, New Jersey: Prentice-Hall. ISBN 0-13-476853-1.
  9. ^ Jaulin, L.; Kieffer, M.; Didrit, O.; Walter, E. (2001). Applied Interval Analysis. Berlin: Springer. ISBN 1-85233-219-0.
  10. ^ Hansen, E.R. (1992). Global Optimization using Interval Analysis. New York: Marcel Dekker.
  11. ^ Conway, Richard Walter; Maxwell, William L.; Miller, Louis W. (2003). Theory of Scheduling. Courier Dover Publications. pp. 56–61.
  12. ^ Fukunaga, Keinosuke; Narendra, Patrenahalli M. (1975). "A branch and bound algorithm for computing k-nearest neighbors". IEEE Transactions on Computers (7): 750–753. doi:10.1109/t-c.1975.224297. S2CID 5941649.
  13. ^ Narendra, Patrenahalli M.; Fukunaga, K. (1977). "A branch and bound algorithm for feature subset selection" (PDF). IEEE Transactions on Computers. C-26 (9): 917–922. doi:10.1109/TC.1977.1674939. S2CID 26204315.
  14. ^ Hazimeh, Hussein; Mazumder, Rahul; Saab, Ali (2020). "Sparse Regression at Scale: Branch-and-Bound rooted in First-Order Optimization". arXiv:2004.06152 [stat.CO].
  15. ^ Nowozin, Sebastian; Lampert, Christoph H. (2011). "Structured Learning and Prediction in Computer Vision". Foundations and Trends in Computer Graphics and Vision. 6 (3–4): 185–365. CiteSeerX 10.1.1.636.2651. doi:10.1561/0600000033. ISBN 978-1-60198-457-9.
  16. ^ Nau, Dana S.; Kumar, Vipin; Kanal, Laveen (1984). "General branch and bound, and its relation to A∗ and AO∗" (PDF). Artificial Intelligence. 23 (1): 29–58. doi:10.1016/0004-3702(84)90004-3.
[edit]
  • LiPS – Free easy-to-use GUI program intended for solving linear, integer and goal programming problems.
  • Cbc – (Coin-or branch and cut) is an open-source mixed integer programming solver written in C++.