I hope you can help me. I'm trying out or-tools for a few days now. I get a simple tsp working, the only addition I need is to have some precedences for the locations.
int[,] costs = {{0, 2451, 713, 1018, 1631, 1374, 2408, 213, 2571, 875, 1420, 2145, 1972}, // New York
{2451, 0, 1745, 1524, 831, 1240, 959, 2596, 403, 1589, 1374, 357, 579}, // Los Angeles
{713, 1745, 0, 355, 920, 803, 1737, 851, 1858, 262, 940, 1453, 1260}, // Chicago
{1018, 1524, 355, 0, 700, 862, 1395, 1123, 1584, 466, 1056, 1280, 987}, // Minneapolis
{1631, 831, 920, 700, 0, 663, 1021, 1769, 949, 796, 879, 586, 371}, // Denver
{1374, 1240, 803, 862, 663, 0, 1681, 1551, 1765, 547, 225, 887, 999}, // Dallas
{2408, 959, 1737, 1395, 1021, 1681, 0, 2493, 678, 1724, 1891, 1114, 701}, // Seattle
{213, 2596, 851, 1123, 1769, 1551, 2493, 0, 2699, 1038, 1605, 2300, 2099}, // Boston
{2571, 403, 1858, 1584, 949, 1765, 678, 2699, 0, 1744, 1645, 653, 600}, // San Francisco
{875, 1589, 262, 466, 796, 547, 1724, 1038, 1744, 0, 679, 1272, 1162}, // St. Louis
{1420, 1374, 940, 1056, 879, 225, 1891, 1605, 1645, 679, 0, 1017, 1200}, // Houston
{2145, 357, 1453, 1280, 586, 887, 1114, 2300, 653, 1272, 1017, 0, 504}, // Phoenix
{1972, 579, 1260, 987, 371, 999, 701, 2099, 600, 1162, 1200, 504, 0}}; // Salt Lake City
string[] city_names = { "New York", "Los Angeles", "Chicago", "Minneapolis", "Denver", "Dallas", "Seattle", "Boston", "San Francisco", "St. Louis", "Houston", "Phoenix", "Salt Lake City" };
RoutingModel routingModel = new RoutingModel(city_names.Length, 1, 0);
RoutingSearchParameters search_parameters = RoutingModel.DefaultSearchParameters();
Solver solver = routingModel.solver();
//In this section I don't get any further...
//Minneapolis before New York
var highPriorityVarIndex = 4;//routingModel.NodeToIndex(highPriorityOrderIndex);
var lowPriorityVarIndex = 0;//routingModel.NodeToIndex(lowPriorityOrderIndex);
var priorityContraint = solver.MakeLessOrEqual(routingModel.CumulVar(highPriorityVarIndex, "precedence"), routingModel.CumulVar(lowPriorityVarIndex, "precedence"));
solver.Add(priorityContraint);
//optional: enables the solver to escape a local minimum
//search_parameters.LocalSearchMetaheuristic = LocalSearchMetaheuristic.Types.Value.GuidedLocalSearch;
//search_parameters.TimeLimitMs = 10000;
NodeEvaluator2 cost_between_nodes = new Cost(costs);
routingModel.SetArcCostEvaluatorOfAllVehicles(cost_between_nodes); //oder SetVehicleCost wenn Fahrzeuge unterschiedliche Kostenmatrix haben
Assignment assignment = routingModel.SolveWithParameters(search_parameters);
if (assignment != null)
{
Console.WriteLine("Total distance: " + assignment.ObjectiveValue().ToString() + "miles");
//Ergebnis ansehen:
long index = routingModel.Start(0); //vehicle 0
StringBuilder route = new StringBuilder();
route.Append("Route: ");
do
{
route.Append(city_names[routingModel.IndexToNode(index)] + " -> ");
index = assignment.Value(routingModel.NextVar(index));
} while (!routingModel.IsEnd(index));
route.Append(city_names[routingModel.IndexToNode(index)]);
Console.WriteLine(route.ToString());
}
else
{
Console.Write("No solution found");
}