routing in java + simple tsp example

This commit is contained in:
lperron@google.com
2012-05-02 20:00:03 +00:00
parent 0286b790fd
commit 3f311f40a1
5 changed files with 143 additions and 10 deletions

View File

@@ -0,0 +1,125 @@
//
// Copyright 2012 Google
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.ortools.constraintsolver.samples;
import java.io.*;
import java.util.*;
import java.text.*;
import com.google.ortools.constraintsolver.Assignment;
import com.google.ortools.constraintsolver.NodeEvaluator2;
import com.google.ortools.constraintsolver.RoutingModel;
class Tsp {
static {
System.loadLibrary("jniconstraintsolver");
}
static class RandomManhattan extends NodeEvaluator2 {
public RandomManhattan(int size, int seed) {
this.xs = new int[size];
this.ys = new int[size];
Random generator = new Random(seed);
for (int i = 0; i < size; ++i) {
xs[i] = generator.nextInt(1000);
ys[i] = generator.nextInt(1000);
}
}
@Override
public long run(int firstIndex, int secondIndex) {
return Math.abs(xs[firstIndex] - xs[secondIndex]) +
Math.abs(ys[firstIndex] - ys[secondIndex]);
}
private int[] xs;
private int[] ys;
}
static class ConstantCallback extends NodeEvaluator2 {
@Override
public long run(int firstIndex, int secondIndex) {
return 1;
}
}
static void solve(int size, int forbidden, int seed)
{
RoutingModel routing = new RoutingModel(size, 1);
// Setting first solution heuristic (cheapest addition).
routing.setFirstSolutionStrategy(RoutingModel.ROUTING_PATH_CHEAPEST_ARC);
// Setting the cost function.
// Put a permanent callback to the distance accessor here. The callback
// has the following signature: ResultCallback2<int64, int64, int64>.
// The two arguments are the from and to node inidices.
RandomManhattan distances = new RandomManhattan(size, seed);
routing.setCost(distances);
// Forbid node connections (randomly).
Random randomizer = new Random();
long forbidden_connections = 0;
while (forbidden_connections < forbidden) {
long from = randomizer.nextInt(size - 1);
long to = randomizer.nextInt(size - 1) + 1;
if (routing.nextVar(from).contains(to)) {
System.out.println("Forbidding connection " + from + " -> " + to);
routing.nextVar(from).removeValue(to);
++forbidden_connections;
}
}
// Add dummy dimension to test API.
routing.addDimension(new ConstantCallback(), size + 1, size + 1, "dummy");
// Solve, returns a solution if any (owned by RoutingModel).
Assignment solution = routing.solve();
if (solution != null) {
// Solution cost.
System.out.println("Cost = " + solution.objectiveValue());
// Inspect solution.
// Only one route here; otherwise iterate from 0 to routing.vehicles() - 1
int route_number = 0;
for (long node = routing.start(route_number);
!routing.isEnd(node);
node = solution.value(routing.nextVar(node))) {
System.out.print("" + node + " -> ");
}
System.out.println("0");
}
}
public static void main(String[] args) throws Exception {
int size = 10;
if (args.length > 0) {
size = Integer.parseInt(args[0]);
}
int forbidden = 0;
if (args.length > 1) {
forbidden = Integer.parseInt(args[1]);
}
int seed = 0;
if (args.length > 2) {
seed = Integer.parseInt(args[2]);
}
solve(size, forbidden, seed);
}
}

View File

@@ -28,8 +28,9 @@ clean_java:
# javacp
javacp: $(LIB_DIR)/com.google.ortools.constraintsolver.jar $(LIB_DIR)/$(LIBPREFIX)jniconstraintsolver.$(JNILIBEXT)
$(GEN_DIR)/constraint_solver/constraint_solver_java_wrap.cc: $(SRC_DIR)/constraint_solver/constraint_solver.swig $(SRC_DIR)/base/base.swig $(SRC_DIR)/util/data.swig $(SRC_DIR)/constraint_solver/constraint_solver.h
$(SWIG_BINARY) -I$(INC_DIR) -c++ -java -o $(GEN_DIR)$Sconstraint_solver$Sconstraint_solver_java_wrap.cc -package com.google.ortools.constraintsolver -outdir $(GEN_DIR)$Scom$Sgoogle$Sortools$Sconstraintsolver $(SRC_DIR)/constraint_solver$Sconstraint_solver.swig
$(GEN_DIR)/constraint_solver/constraint_solver_java_wrap.cc: $(SRC_DIR)/constraint_solver/constraint_solver.swig $(SRC_DIR)/constraint_solver/routing.swig $(SRC_DIR)/base/base.swig $(SRC_DIR)/util/data.swig $(SRC_DIR)/constraint_solver/constraint_solver.h
$(SWIG_BINARY) -I$(INC_DIR) -c++ -java -o $(GEN_DIR)$Sconstraint_solver$Sconstraint_solver_java_wrap.cc -package com.google.ortools.constraintsolver -outdir $(GEN_DIR)$Scom$Sgoogle$Sortools$Sconstraintsolver $(SRC_DIR)$Sconstraint_solver$Srouting.swig
$(OBJ_DIR)/constraint_solver_java_wrap.$O: $(GEN_DIR)/constraint_solver/constraint_solver_java_wrap.cc
$(CCC) $(JNIFLAGS) $(JAVA_INC) -c $(GEN_DIR)$Sconstraint_solver$Sconstraint_solver_java_wrap.cc $(OBJ_OUT)constraint_solver_java_wrap.$O
@@ -38,8 +39,8 @@ $(LIB_DIR)/com.google.ortools.constraintsolver.jar: $(GEN_DIR)/constraint_solver
$(JAVAC_BIN) -d $(OBJ_DIR) $(SRC_DIR)/com$Sgoogle$Sortools$Sconstraintsolver$S*.java $(GEN_DIR)$Scom$Sgoogle$Sortools$Sconstraintsolver$S*.java
$(JAR_BIN) cf $(LIB_DIR)$Scom.google.ortools.constraintsolver.jar -C $(OBJ_DIR) $Scom$Sgoogle$Sortools$Sconstraintsolver
$(LIB_DIR)/$(LIBPREFIX)jniconstraintsolver.$(JNILIBEXT): $(OBJ_DIR)/constraint_solver_java_wrap.$O $(CP_DEPS)
$(LD) $(LDOUT)$(LIB_DIR)$S$(LIBPREFIX)jniconstraintsolver.$(JNILIBEXT) $(OBJ_DIR)$Sconstraint_solver_java_wrap.$O $(CP_LNK) $(LDFLAGS)
$(LIB_DIR)/$(LIBPREFIX)jniconstraintsolver.$(JNILIBEXT): $(OBJ_DIR)/constraint_solver_java_wrap.$O $(ROUTING_DEPS)
$(LD) $(LDOUT)$(LIB_DIR)$S$(LIBPREFIX)jniconstraintsolver.$(JNILIBEXT) $(OBJ_DIR)$Sconstraint_solver_java_wrap.$O $(ROUTING_LNK) $(LDFLAGS)
# Java CP Examples
@@ -196,6 +197,13 @@ $(OBJ_DIR)/com/google/ortools/constraintsolver/samples/Sudoku.class: javacp $(EX
run_Sudoku: compile_Sudoku
$(JAVA_BIN) -Djava.library.path=$(LIB_DIR) -cp $(OBJ_DIR)$(CPSEP)$(LIB_DIR)$Scom.google.ortools.constraintsolver.jar com.google.ortools.constraintsolver.samples.Sudoku
compile_Tsp: $(OBJ_DIR)/com/google/ortools/constraintsolver/samples/Tsp.class
$(OBJ_DIR)/com/google/ortools/constraintsolver/samples/Tsp.class: javacp $(EX_DIR)/com/google/ortools/constraintsolver/samples/Tsp.java
$(JAVAC_BIN) -d $(OBJ_DIR) -cp $(LIB_DIR)$Scom.google.ortools.constraintsolver.jar $(EX_DIR)$Scom$Sgoogle$Sortools$Sconstraintsolver$Ssamples$STsp.java
run_Tsp: compile_Tsp
$(JAVA_BIN) -Djava.library.path=$(LIB_DIR) -cp $(OBJ_DIR)$(CPSEP)$(LIB_DIR)$Scom.google.ortools.constraintsolver.jar com.google.ortools.constraintsolver.samples.Tsp $(ARGS)
compile_Xkcd: $(OBJ_DIR)/com/google/ortools/constraintsolver/samples/Xkcd.class

View File

@@ -17,7 +17,7 @@ test_python: python
PYTHONPATH=$(OR_ROOT_FULL)/src python$(PYTHONVERSION) $(EX_DIR)/python/linear_programming.py
PYTHONPATH=$(OR_ROOT_FULL)/src python$(PYTHONVERSION) $(EX_DIR)/python/integer_programming.py
test_java: java run_RabbitsPheasants run_FlowExample run_LinearProgramming run_IntegerProgramming run_Knapsack
test_java: java run_RabbitsPheasants run_FlowExample run_Tsp run_LinearProgramming run_IntegerProgramming run_Knapsack
# csharp test
test_csharp: $(CSHARPEXE) $(BIN_DIR)/testlp.exe $(BIN_DIR)/testcp.exe

View File

@@ -17,7 +17,7 @@ test_python: python
set PYTHONPATH=$(OR_ROOT_FULL)\\src && $(WINDOWS_PYTHON_PATH)\\python $(EX_DIR)\\python\\linear_programming.py
set PYTHONPATH=$(OR_ROOT_FULL)\\src && $(WINDOWS_PYTHON_PATH)\\python $(EX_DIR)\python\\integer_programming.py
test_java: java run_RabbitsPheasants run_FlowExample run_LinearProgramming run_IntegerProgramming run_Knapsack
test_java: java run_RabbitsPheasants run_FlowExample run_Tsp run_LinearProgramming run_IntegerProgramming run_Knapsack
# csharp test
test_csharp: $(CSHARPEXE) $(BIN_DIR)/testlp.exe $(BIN_DIR)/testcp.exe

View File

@@ -193,7 +193,7 @@ class NodeEvaluator2 {
return run(i.value(), j.value());
}
virtual int64 run(int i, int j) = 0;
RoutingModel::NodeEvaluator2* GetPermanentCallback() {
RoutingModel::NodeEvaluator2* getPermanentCallback() {
return NewPermanentCallback(this, &NodeEvaluator2::runAux);
}
virtual ~NodeEvaluator2() {}
@@ -205,11 +205,11 @@ class NodeEvaluator2 {
public:
virtual ~NodeEvaluator2();
virtual int64 run(int i, int j) = 0;
operations_research::RoutingModel::NodeEvaluator2* GetPermanentCallback();
operations_research::RoutingModel::NodeEvaluator2* getPermanentCallback();
};
%typemap(jstype) RoutingModel::NodeEvaluator2* "NodeEvaluator2";
%typemap(javain) RoutingModel::NodeEvaluator2* "SWIGTYPE_p_ResultCallback2T_long_long__RoutingModel_NodeIndex__RoutingModel_NodeIndex_t.getCPtr($javainput.GetPermanentCallback())";
%typemap(javain) RoutingModel::NodeEvaluator2* "SWIGTYPE_p_ResultCallback2T_long_long__RoutingModel_NodeIndex__RoutingModel_NodeIndex_t.getCPtr($javainput.getPermanentCallback())";
#endif // SWIGJAVA
#ifdef SWIGCSHARP
%module(directors="1") main
@@ -233,7 +233,7 @@ class NodeEvaluator2 {
class NodeEvaluator2 {
public:
virtual ~NodeEvaluator2();
virtual int64 Run(int i,int j) = 0;
virtual int64 Run(int i, int j) = 0;
operations_research::RoutingModel::NodeEvaluator2* GetPermanentCallback();
};