Using CPLEX in TspIpSolver
First, we need to set up the objective and the degree constraints. First, add the following fields to the class
private IloCplex cplex;
private TspInstance<V,E> tspInstance;
private final ImmutableBiMap<E,IloIntVar> edgeVariables;
|
and initialize them, as below.
public TspIpSolver(TspInstance<V,E> tspInstance, EnumSet<Option> options) throws IloException{
this.options = options;
this.tspInstance = tspInstance;
this.cplex = new IloCplex();
UndirectedGraph<V,E> graph = tspInstance.getGraph(); //for convenience, we will be using this a lot
this.edgeVariables = Util.makeBinaryVariables(cplex, graph.getEdges());
//the degree constraints
//the objective
}
|
The constraints and objective still need to be added to the cplex object. Try adding them yourself! The following methods (as defined in the previous 3 pages) should be useful for making the constraints:
- From
Util , the static method integerSum(IloCplex cplex, BiMap<T,IloIntVar> variables, Iterable<T> set)
- From
IloCplex , the method addEq(IloNumExpr e, double v)
- From
UndirectedGraph<V,E> , the method getIncidentEdges(V vertex)
If you are unfamiliar with Java, consider viewing the solution for the constraint, then trying the objective yourself.
Solution
//the degree constraints
for(V vertex: graph.getVertices()){
cplex.addEq(Util.integerSum(cplex, edgeVariables,
graph.getIncidentEdges(vertex)), 2);
}
|
|
For the objective, we need the functions:
- From
Util , the static method sum(IloCplex cplex, BiMap<T,IloIntVar> variables, Iterable<T> set, Function<? super T,? extends Number> coefficients)
- From
UndirectedGraph<V,E> , the method getEdges()
- From
TspInstance , the method getEdgeWeights
Solution
//the objective
cplex.addMinimize(Util.integerSum(
cplex, edgeVariables, graph.getEdges(),tspInstance.getEdgeWeights()));
|
|
|