Teslim alma ve teslimatlar için temel durak siparişi optimizasyonu

Bu senaryoda, basit bir dönüşüm ayarıyla bir araca atanan durakların sırasını maliyet parametreleridir. Bu, rota optimizasyonu işleminin en basit modudur ve tüm durakların belirtilen zaman aralığında ziyaret edilmesini sağlar.

Aşağıdaki örnekte bir araç ve üç araç içeren temel bir senaryo gösterilmektedir depot adı verilen tek bir konumdan gelen gönderilerdir.

Örnek isteği inceleyin

      {
        "populatePolylines": true,
        "populateTransitionPolylines": true,
        "model": {
          "globalStartTime": "2023-01-13T16:00:00-08:00",
          "globalEndTime": "2023-01-14T16:00:00-08:00",
          "shipments": [
            {
              "deliveries": [
                {
                  "arrivalLocation": {
                    "latitude": 37.789456,
                    "longitude": -122.390192
                  },
                  "duration": "250s"
                }
              ],
              "pickups": [
                {
                  "arrivalLocation": {
                    "latitude": 37.794465,
                    "longitude": -122.394839
                  },
                  "duration": "150s"
                }
              ]
            },
            {
              "deliveries": [
                {
                  "arrivalLocation": {
                    "latitude": 37.789116,
                    "longitude": -122.395080
                  },
                  "duration": "250s"
                }
              ],
              "pickups": [
                {
                  "arrivalLocation": {
                    "latitude": 37.794465,
                    "longitude": -122.394839
                  },
                  "duration": "150s"
                }
              ]
            },
            {
              "deliveries": [
                {
                  "arrivalLocation": {
                    "latitude": 37.795242,
                    "longitude": -122.399347
                  },
                  "duration": "250s"
                }
              ],
              "pickups": [
                {
                  "arrivalLocation": {
                    "latitude": 37.794465,
                    "longitude": -122.394839
                  },
                  "duration": "150s"
                }
              ]
            }
          ],
          "vehicles": [
            {
              "endLocation": {
                "latitude": 37.794465,
                "longitude": -122.394839
              },
              "startLocation": {
                "latitude": 37.794465,
                "longitude": -122.394839
              },
              "costPerKilometer": 10.0,
              "costPerHour": 40.0
            }
          ]
        }
      }
    

Rota Optimizasyonu istek alanları

Genel Bakış'ta belirtildiği gibi, en önemli Rota Optimizasyonu isteğidir. mülkleri vehicles ve shipments olarak ayarlanmıştır.

İstek, araca ve gönderimlere ek olarak aşağıdaki alanları içerir:

Çoklu çizgiler

populatePolylines ve populateTransitionPolylines, Rota olup olmadığını belirtir Optimizasyon, çoklu çizgiler döndürmelidir.

Hizmet, Çoklu çizgileri Haritalar JS çoklu çizgi codec'ini kullanarak kodlar. Bu codec bileşeni Yazdırılabilir ASCII karakterleri kullanan ikili çoklu çizgi verileri. Rota Optimizasyonu tarafından hesaplanan yolları görselleştirmek için Etkileşimli Poli Çizgi Kodlayıcı Yardımcı Programı'nı kullanabilirsiniz. Bu kılavuzdaki örnekte populatePolylines ve populateTransitionPolylines için doğru, diğer kılavuzlar tarafından "yanlış" olarak ayarlandı yanıt boyutunu küçültebilirsiniz.

Kodlamanın açıklaması için Kodlanmış Çoklu Çizgi Algoritma Biçimi'ne bakın. biçimindedir.

Küresel saat kısıtlamaları

model.globalStartTime ve model.globalEndTime, rastgele bir 24 saatlik döneme ayarlanmıştır. Bu, çıkış zaman damgalarının yorumlanmasını kolaylaştırır.

Konumları ziyaret edin

Örnek istek yalnızca model.shipments[].pickups[].arrivalLocation ve model.shipments[].deliveries[].arrivalLocation. Ayrıca bir de Aracın bir konumdan ayrıldığı durumlarda departureLocation özelliği Varış noktasından farklı bir nokta (ör. girişi olan bir otopark) diğerinde çıkışlar görebilirsiniz. Bu ve sonraki dönemde varış ve kalkış noktalarının aynı olduğu varsayılır.

waypoint, latLng'e alternatif olarak da kullanılabilir. Waypoint alanları, LatLng yerine Google Yer Kimliklerinin kullanımını destekliyor. araç başlıkları da belirtebilir. Daha fazla bilgi için referans dokümanlarına (REST, gRPC) bakın.

Örnekteki kısıtlamalar

Bu senaryo, optimize ediciyi çeşitli şekillerde kısıtlar:

  1. Tüm etkinlikler genel başlangıç ve bitiş zamanları arasında tamamlanmalıdır. Bu senaryoda, gönderimlerin yakınlığı ve geniş küresel zaman aralığı göz önüne alındığında başlangıç ve bitiş zamanları çok gevşek bir kısıtlamadır.
  2. Tüm gönderimlerin tamamlanması gerekir. shipments'te ceza maliyetleri belirtilmediğinde varsayılan davranış budur.
  3. costPerKilometer ve costPerHour araçta ayarlandı.

Maliyetler Maliyet Modeli Parametreleri bölümünde ele alınır.

Rota optimizasyonu yanıtı özellikleri

Örnek isteğe verilen yanıtı görüntüleyin

    {
      "routes": [
        {
          "vehicleStartTime": "2023-01-14T00:00:00Z",
          "vehicleEndTime": "2023-01-14T00:36:41Z",
          "visits": [
            {
              "shipmentIndex": 2,
              "isPickup": true,
              "startTime": "2023-01-14T00:00:00Z",
              "detour": "0s"
            },
            {
              "shipmentIndex": 1,
              "isPickup": true,
              "startTime": "2023-01-14T00:02:30Z",
              "detour": "150s"
            },
            {
              "isPickup": true,
              "startTime": "2023-01-14T00:05:00Z",
              "detour": "300s"
            },
            {
              "startTime": "2023-01-14T00:11:25Z",
              "detour": "0s"
            },
            {
              "shipmentIndex": 1,
              "startTime": "2023-01-14T00:19:29Z",
              "detour": "503s"
            },
            {
              "shipmentIndex": 2,
              "startTime": "2023-01-14T00:29:02Z",
              "detour": "1324s"
            }
          ],
          "transitions": [
            {
              "travelDuration": "0s",
              "waitDuration": "0s",
              "totalDuration": "0s",
              "startTime": "2023-01-14T00:00:00Z",
              "routePolyline": {}
            },
            {
              "travelDuration": "0s",
              "waitDuration": "0s",
              "totalDuration": "0s",
              "startTime": "2023-01-14T00:02:30Z",
              "routePolyline": {}
            },
            {
              "travelDuration": "0s",
              "waitDuration": "0s",
              "totalDuration": "0s",
              "startTime": "2023-01-14T00:05:00Z",
              "routePolyline": {}
            },
            {
              "travelDuration": "235s",
              "travelDistanceMeters": 795,
              "waitDuration": "0s",
              "totalDuration": "235s",
              "startTime": "2023-01-14T00:07:30Z",
              "routePolyline": {
                "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@"
              }
            },
            {
              "travelDuration": "234s",
              "travelDistanceMeters": 793,
              "waitDuration": "0s",
              "totalDuration": "234s",
              "startTime": "2023-01-14T00:15:35Z",
              "routePolyline": {
                "points": "cwseFti_jVRWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[`@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@"
              }
            },
            {
              "travelDuration": "323s",
              "travelDistanceMeters": 1204,
              "waitDuration": "0s",
              "totalDuration": "323s",
              "startTime": "2023-01-14T00:23:39Z",
              "routePolyline": {
                "points": "cuseFhjVSTY`@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@"
              }
            },
            {
              "travelDuration": "209s",
              "travelDistanceMeters": 665,
              "waitDuration": "0s",
              "totalDuration": "209s",
              "startTime": "2023-01-14T00:33:12Z",
              "routePolyline": {
                "points": "{zteFxbajV?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A"
              }
            }
          ],
          "routePolyline": {
            "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@RWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@STY@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A"
          },
          "metrics": {
            "performedShipmentCount": 3,
            "travelDuration": "1001s",
            "waitDuration": "0s",
            "delayDuration": "0s",
            "breakDuration": "0s",
            "visitDuration": "1200s",
            "totalDuration": "2201s",
            "travelDistanceMeters": 3457
          },
          "travelSteps": [
            {
              "duration": "0s",
              "routePolyline": {}
            },
            {
              "duration": "0s",
              "routePolyline": {}
            },
            {
              "duration": "0s",
              "routePolyline": {}
            },
            {
              "duration": "227s",
              "distanceMeters": 794,
              "routePolyline": {
                "points": "kvteFtfjVAA?C?C@C?A?C@AFMj@s@JKb@k@Zc@LSjA}ARWDGdAxAdAvAXa@@k@AsA\\c@FKp@_A\\c@Ze@fA{ALSFGd@o@rAgBB{BZc@"
              }
            },
            {
              "duration": "233s",
              "distanceMeters": 791,
              "routePolyline": {
                "points": "cwseFti_jVRWj@w@x@eAHLNRHJbApAHLX\\V^?@hA~AT\\PVFFDHDFJNp@~@NRLNNTFFUZIJY^Y^g@p@[`@KP{@fAEFSXe@l@c@h@WZY\\?BELk@v@MNa@l@"
              }
            },
            {
              "duration": "322s",
              "distanceMeters": 1205,
              "routePolyline": {
                "points": "cuseFhjVSTY`@Yb@GHEDIJEF]f@IJi@r@oAbBeCfDKLaApAKNQVIPKPCDQJIBIBM@iAJeALqBVC@C?A?QBYDI@C?_@Dc@FO@a@FDp@HfAHvABVDl@Dj@PpCQDiALsALAQASKwAOgBEe@COCYEa@Es@Eg@"
              }
            },
            {
              "duration": "208s",
              "distanceMeters": 666,
              "routePolyline": {
                "points": "{zteFxbajV?CAYEc@AMC_@AOAK?E?CCWAOAKCe@CY?WScDEm@d@EFA\\ENCB?XEVC^E`@EhBUVCNEB?@?\\Er@IMUe@k@k@w@AAMQa@i@SWQWMQi@u@AC?A"
              }
            }
          ],
          "vehicleDetour": "2201s",
          "routeCosts": {
            "model.vehicles.cost_per_hour": 24.455555555555556,
            "model.vehicles.cost_per_kilometer": 34.57
          },
          "routeTotalCost": 59.025555555555556
        }
      ],
      "totalCost": 59.025555555555556,
      "metrics": {
        "aggregatedRouteMetrics": {
          "performedShipmentCount": 3,
          "travelDuration": "1001s",
          "waitDuration": "0s",
          "delayDuration": "0s",
          "breakDuration": "0s",
          "visitDuration": "1200s",
          "totalDuration": "2201s",
          "travelDistanceMeters": 3457
        },
        "usedVehicleCount": 1,
        "earliestVehicleStartTime": "2023-01-14T00:00:00Z",
        "latestVehicleEndTime": "2023-01-14T00:36:41Z",
        "totalCost": 59.025555555555556,
        "costs": {
          "model.vehicles.cost_per_kilometer": 34.57,
          "model.vehicles.cost_per_hour": 24.455555555555556
        }
      }
    }
    

Rota optimizasyonu yanıtı, aşağıdaki gibi en üst düzey routes alanını içerir: önerilen rotaları, araç başına bir rota olacak şekilde gösterir. Bu kılavuzdaki örnek istekte yalnızca bir araç belirtildiğinden routes, bir ShipmentRoute mesajı içerir.

ShipmentRoute tesis

ShipmentRoute mesaj türü için en önemli iki özellik visits ve transitions'tir.

Her Visit, aşağıdakilerden birinden teslim alma veya teslimatın tamamlandığını gösterir. istek mesajının VisitRequest'leri. Bir ziyaret, etkin bir şekilde bir araç tarafından belirli bir yerde ve zamanda tamamlanmasıdır.

Her Transition, bir konumdan başka bir konuma giden aracı temsil eder tıklayın. Aracın başlangıç noktası çifti ile ziyaret arasında konumu ve aracın uç noktası.

Aracın tam rotasını yeniden oluşturmak için ShipmentRoute visits ve transitions birleştirilmelidir. Alanların araç etkinliği ilerleyişine göre birleştirilmesi aşağıdaki gibi görünür:

request.vehicles[0].startLocation -> transitions[0] -> visits[0] ->
transitions[1] -> visits[1] -> transitions[2] -> ... -> visits[3] ->
transitions[4] -> request.vehicles[0].endLocation

Bir ShipmentRoute, visits ile karşılaştırıldığında her zaman bir tane daha fazla transitions değerine sahiptir. araç, başlangıç konumundan ilk ziyaretine kadar seyahat etmelidir ve rotanın sonundaki son konumuna kadar yol gösterir. Aracın başlangıç veya bitiş konumu yoksa yine de bir başlangıç noktası bulunur. ilk veya son ziyaretin konumu şu olduğu için visits ile kıyaslandığında daha fazla transitions başlangıç veya varış konumu olarak kullanılır.

Bu örnekte, ilk üç teslim alma ziyaretinde geçişler vardır. Ayrıca mesafe ve süre sıfır çünkü üç teslim alma özelliği istekte aynı konumu paylaşması gerekir.

Daha fazla bilgi için ShipmentRoute referans belgelerini (REST, gRPC) inceleyin bolca fırsat sunuyor.

Basit ara nokta sırası optimizasyonu

Bu örnekte gösterildiği gibi, rota optimizasyonu, ziyaretleri gönderimlerin özellikleri olarak modeller ve bağımsız bir öğe olarak yol işaretleri veya durak kavramına sahip değildir. Ancak durakları veya ara noktaları kargo olarak göstermek mümkündür. teslim alma veya teslimat olarak tam olarak bir VisitRequest ile. Araç hâlâ optimize edicinin kendisine bir costPerHour veya costPerKilometer atanmasını (makul rota bulmaktan ziyade en uygun rota)