/// The model is based on a graph G = (V,E). /// We have one binary variable x[e] for each edge e in E. That variable /// is set to 1 if edge e is selected in the optimal tour and 0 otherwise. ///
///
/// The model contains only one explicit constraint:
///
/// for each v in V: sum(u in V : u != v) x[uv] == 2
///
/// This states that from all the edges incident to a node u, exactly two
/// must be selected in the optimal tour.
///
/// The above constraints ensures that the selected edges form tours. However,
/// it allows multiple tours, also known as subtours. So we need a constraint
/// that requires that there is only one tour (which then necessarily hits
/// all the nodes). This constraint is known as subtour elimination constraint
/// and is
///
/// sum(e in S) x[e] <= |S|-1 for each subtour S
///
/// Since there are exponentially many subtours in a graph, this constraint
/// is not stated explicitly. Instead we check for any solution that the
/// optimizer finds, whether it satisfies the subtour elimination constraint.
/// If it does then we accept the solution. Otherwise we reject the solution
/// and augment the model by the violated subtour eliminiation constraint.
///
/// This lazy addition of constraints is implemented using a preintsol callback /// that rejects any solution that violates a subtour elimination constraint. /// In case the solution came from an integral node, the callback injects a /// subtour elimination constraint that cuts off that solution. ///
////// An important thing to note about this strategy is that dual reductions /// have to be disabled. Since the optimizer does not see the whole model /// (subtour elimination constraints are only generated on the fly), dual /// reductions may cut off the optimal solution. ///
///