2016-11-20 8 views
1

Проблемы следующего код:Google ortools - капаситированная машина РЬ маршрутизаций

даже если у меня есть только 10 мест для доставки и один склад, установленных на месте 0, в этом примере, транспортные средства 1, 2,3,4, похоже, они депо в местах 10,11,12,13. Эти места не существуют. 10, которые у меня пронумерованы от 0 до 9.

С другой стороны, бизнес-логика, кажется, OK:

как я изолировали стоимость покинуть склад и один из вернуться к нему (значение 10) я получаю ожидаемый результат : 104. Есть только 4 поездки между городами, которые не включают депо.

Это ошибка в Google или-инструментах?

public static void Main(string[] args) 
{ 
    new CVRP().Solve(10); 
} 

private class RandomManhattan : NodeEvaluator2 
{ 
    public override long Run(int first_index, int second_index) 
    { 
     if (first_index == 0 || second_index == 0) 
      return 10; 
     return 1; 
    } 
}; 

private class Demand : NodeEvaluator2 
{ 
    public override long Run(int first_index, int second_index) 
    { 
     return 1; 
    } 
}; 

private void Solve(int locations) 
{ 
    var nr_vehicle = 5; 
    var routing = new RoutingModel(locations, nr_vehicle, new[] {0, 0, 0, 0, 0}, new[] {0, 0, 0, 0, 0}); 
    Console.WriteLine("Depot : " + routing.GetDepot()); 

    NodeEvaluator2 demandCallback = new Demand(); 
    routing.AddDimension(demandCallback, 0, 3, true, "capacity"); 

    var distances = new RandomManhattan(); 
    routing.SetCost(distances); 

    var searchParameters = 
     RoutingModel.DefaultSearchParameters(); 
    searchParameters.FirstSolutionStrategy = 
     FirstSolutionStrategy.Types.Value.PathCheapestArc; 

    var solution = routing.SolveWithParameters(searchParameters); 


    if (solution != null) 
    { 
     var output = "Total cost: " + solution.ObjectiveValue() + "\n"; 
     // Dropped orders 
     var dropped = ""; 
     for (var order = 0; order < locations; ++order) 
     { 
      if (solution.Value(routing.NextVar(order)) == order) 
      { 
       dropped += " " + order; 
      } 
     } 
     if (dropped.Length > 0) 
     { 
      output += "Dropped orders:" + dropped + "\n"; 
     } 
     // Routes 
     for (var vehicle = 0; vehicle < nr_vehicle; ++vehicle) 
     { 
      var route = "Vehicle " + vehicle + ": "; 
      var order = routing.Start(vehicle); 
      if (routing.IsEnd(solution.Value(routing.NextVar(order)))) 
      { 
       route += "Empty"; 
      } 
      else 
      { 
       for (; !routing.IsEnd(order); order = solution.Value(routing.NextVar(order))) 
       { 
        var local_load = routing.CumulVar(order, "capacity"); 
        route += order + " Load(" + solution.Value(local_load) + ") -> "; 
       } 
       if (route.Length > 0) 
        route = route + "0"; 
      } 
      output += route + "\n"; 
     } 
     Console.WriteLine(output); 
    } 
} 

enter image description here

ответ

1

Вы должны обернуть заказ в

route += order + " Load(" + solution.Value(local_load) + ") -> "; 

внутри model.IndexToNode (порядка), как это

route += model.IndexToNode(order) + " Load(" + solution.Value(local_load) + ") -> ";