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

Bu senaryoda, basit maliyet parametreleriyle bir araca atanan durakların sırası optimize edilir. 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, depo adı verilen tek bir konumdan gelen bir araç ve üç gönderim içeren temel bir senaryo gösterilmektedir.

Örnek istek

      {
        "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ış bölümünde belirtildiği gibi, en önemli rota optimizasyonu istek özellikleri vehicles ve shipments'dır.

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

Çoklu çizgiler

populatePolylines ve populateTransitionPolylines, Rota Optimizasyonu'nun çoklu çizgiler döndürüp döndürmeyeceğini belirtir.

Hizmet, poli çizgileri kodlarken Maps JS poli çizgisi codec'ini kullanır. Bu codec, yazdırılabilir ASCII karakterlerini kullanarak ikili poli çizgisi verilerini temsil eder. 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 doğru olarak ayarlanmıştır ancak diğer kılavuzlarda yanıt boyutunu azaltmak için bu değerler yanlış olarak ayarlanmıştır.

Kodlama biçiminin açıklaması için Kodlanmış Poli Çizgi Algoritması Biçimi başlıklı makaleyi inceleyin.

Küresel zaman kısıtlamaları

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

Konumları ziyaret etme

Örnek istekte yalnızca model.shipments[].pickups[].arrivalLocation ve model.shipments[].deliveries[].arrivalLocation kullanılmaktadır. Aracın, geldiği yerden farklı bir noktadan ayrıldığı durumlar için de departureLocation mülkü vardır (ör. binanın bir tarafında girişi, diğer tarafında çıkışı olan bir otopark kompleksi). Bu ve sonraki kılavuzlarda, 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ılmasını destekler ve araç başlıklarını da belirtebilir. Daha fazla bilgi için referans dokümanlarını (REST, gRPC) inceleyin.

Örnekteki kısıtlamalar

Bu senaryo, optimizatör için çeşitli kısıtlamalar getirir:

  1. Tüm etkinlikler, genel başlangıç ve bitiş saatleri 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önderimler tamamlanmış olmalıdır. shipments'te ceza maliyetleri belirtilmediğinde varsayılan davranış budur.
  3. costPerKilometer ve costPerHour, araçta ayarlanır.

Maliyetler Maliyet Modeli Parametreleri bölümünde ele alınmıştır.

Rota Optimizasyonu yanıt özellikleri

Örnek isteğe verilen yanıtı görme

    {
      "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ı, önerilen rotaları temsil eden ve araç başına bir rota içeren üst düzey bir routes alanı içerir. 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, istek mesajındaki VisitRequestlardan birinde teslimat veya teslim alma işleminin tamamlandığını gösterir. Ziyaret, bir aracın belirli bir yerde ve zamanda tamamlaması için atanan bir iştir.

Her Transition, bir konumdan diğerine giden aracı temsil eder. Araç başlangıç noktası, ziyaret konumu ve araç bitiş noktası arasında geçişler olabilir.

Aracın tüm rotasını yeniden oluşturmak için ShipmentRoute'nin visits ve transitions değerleri birleştirilmelidir. Alanların araç etkinliği ilerleme durumuna göre kombinasyonu 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

Araç, başlangıç konumundan rotanın başındaki ilk ziyaretine ve son ziyaretinden rotanın sonundaki bitiş konumuna gitmesi gerektiğinden, ShipmentRoute her zaman visits'den bir transitions daha fazladır. Aracın başlangıç veya bitiş konumu yoksa ilk veya son ziyaretin konumu, aracın sırasıyla başlangıç veya bitiş konumu olarak kullanılacağından visits'ten bir fazla transitions olacaktır.

Bu örnekte, ilk üç teslim alma ziyareti arasında sıfır mesafe ve süreyle geçişler vardır. Bunun nedeni, üç teslim alma işleminin de istekte aynı konumu paylaşmasıdır.

Daha fazla bilgi için ShipmentRoute referans dokümanlarını (REST, gRPC) inceleyin.

Basit yol noktası 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 yol noktalarını, teslim alma veya teslimat olarak tam olarak bir VisitRequest içeren gönderimler olarak temsil etmek mümkündür. Optimize edici, en uygun rotayı (uygun bir rota bulmak yerine) bulmak için araca yine de bir costPerHour veya costPerKilometer atamalıdır.