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

Bu senaryo, basit maliyet parametreleriyle bir araca atanan durakların sırasını 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
            }
          ]
        }
      }
    

Rota Optimizasyonu 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, Route Optimization'ın çoklu çizgiler döndürüp döndürmeyeceğini belirtir.

Hizmet, Polylines'ı Maps JS polyline codec'i kullanarak kodlar. Bu codec, yazdırılabilir ASCII karakterlerini kullanarak ikili çoklu çizgi verilerini temsil eder. 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 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ı daha kolay yorumlanır.

Konumları ziyaret etme

Örnek istekte yalnızca model.shipments[].pickups[].arrivalLocation ve model.shipments[].deliveries[].arrivalLocation kullanılmaktadır. Ayrıca, 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 da latLng yerine 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, optimizasyon aracını çeşitli şekillerde kısıtlar:

  1. Tüm etkinlikler, genel 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.

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 en ü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ının VisitRequest'lerinden 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

Aracın 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 varlık 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 (uygun herhangi bir rotayı bulmak yerine).