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

Bu senaryo, bir araca atanan durakların sırasını basit maliyet parametreleriyle optimize eder. 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, tek bir araç ve üç gönderi içeren temel bir senaryo gösterilmektedir. Tüm gönderiler, depo adı verilen tek bir konumdan çıkmaktadır.

Örnek bir isteğe bakın

      {
        "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
            }
          ]
        }
      }
    

Route Optimization istek alanları

Genel Bakış bölümünde belirtildiği gibi, en önemli Rota Optimizasyonu isteği özellikleri vehicles ve shipments'dir.

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

Çoklu çizgiler

populatePolylines ve populateTransitionPolylines, RouteOptimization'ın çoklu çizgiler döndürüp döndürmeyeceğini belirtir.

Hizmet, yazdırılabilir ASCII karakterlerini kullanarak ikili çoklu çizgi verilerini temsil eden Maps JS çoklu çizgi codec'ini kullanarak çoklu çizgileri kodlar. Etkileşimli Çoklu Çizgi Kodlayıcı Yardımcı Programı'nı kullanarak Rota Optimizasyonu tarafından hesaplanan rotaları görselleştirebilirsiniz. Bu kılavuzdaki örnekte populatePolylines ve populateTransitionPolylines değerleri doğru olarak ayarlanmıştır ancak diğer kılavuzlarda yanıt boyutunu küçültmek için bu değerler yanlış olarak ayarlanır.

Kodlama biçiminin açıklaması için Encoded Polyline Algorithm Format'a (Kodlanmış Çoklu Çizgi Algoritması Biçimi) bakın.

Küresel zaman kısıtlamaları

model.globalStartTime ve model.globalEndTime için rastgele bir 24 saatlik süre ayarlanmıştır. Bu sayede çıkış zaman damgalarını yorumlamak 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 noktadan farklı bir noktadan ayrıldığı durumlar için de bir departureLocation özelliği vardır. Örneğin, binanın bir tarafında giriş, 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.

Varış ve ayrılış waypoint, latLng için 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 belgelerine (REST, gRPC) bakın.

Örnekteki kısıtlamalar

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

  1. Tüm etkinlikler, global başlangıç ve bitiş zamanları arasında tamamlanmalıdır. Bu senaryoda, gönderilerin birbirine yakınlığı ve küresel zaman aralığının genişliği göz önüne alındığında başlangıç ve bitiş zamanları çok esnek bir kısıtlamadır.
  2. Tüm gönderimler tamamlanmalıdır. Bu, shipments üzerinde ceza maliyetleri belirtilmediğinde varsayılan davranıştır.
  3. costPerKilometer ve costPerHour araçta ayarlanır.

Maliyetler Maliyet Modeli Parametreleri'nde ele alınır.

herhangi rotayı döndürür.

Route Optimization 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 üst düzey bir routes alanı içerir. Her araç için bir rota bulunur. Bu kılavuzdaki örnek istekte yalnızca bir araç belirtildiği için routes, bir ShipmentRoute mesajı içerir.

ShipmentRoute tesis

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

Her Visit, istek mesajındaki VisitRequest'lardan birinde teslim alma veya teslimat işleminin tamamlandığını gösterir. Ziyaret, bir aracın belirli bir yerde ve zamanda tamamlaması gereken bir iş olarak atanır.

Her Transition, bir konumdan diğerine giden aracı temsil eder. Geçişler, aracın başlangıç noktası, ziyaret yeri ve aracın bitiş noktası arasında gerçekleşebilir.

Aracın rotasını eksiksiz şekilde yeniden oluşturmak için ShipmentRoute'nın visits ve transitions birleştirilmelidir. Alanların araç etkinliği ilerlemesi şeklinde 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

Araç, rotanın başında başlangıç konumundan ilk ziyaretine, rotanın sonunda ise son ziyaretinden bitiş konumuna gitmesi gerektiğinden ShipmentRoute sayısı her zaman visits sayısından bir fazladır.transitions Araçta başlangıç veya bitiş konumu yoksa ilk ya da son ziyaretin konumu sırasıyla aracın başlangıç veya bitiş konumu olarak kullanıldığından transitions sayısı visits sayısından bir fazla olur.

Bu örnekte, ilk üç teslim alma ziyaretinin 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 ayrıntı için ShipmentRoute referans belgelerine (REST, gRPC) bakın.

Basit rota noktası sırası optimizasyonu

Bu örnekte gösterildiği gibi, Rota Optimizasyonu ziyaretleri gönderilerin özellikleri olarak modeller ve bağımsız bir öğe olarak ara noktalar veya duraklar kavramına sahip değildir. Ancak durakları veya ara noktaları, teslim alma ya da teslimat olarak tam olarak bir VisitRequest içeren gönderiler şeklinde temsil etmek mümkündür. Optimizasyon aracının uygun bir rota bulabilmesi için araca costPerHour veya costPerKilometer atanmış olması gerekir (herhangi bir uygun rotayı bulmak yerine).