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ığı içinde ziyaret edilmesini sağlar.

Aşağıdaki örnekte, tümü depot adı verilen tek bir konumdan kaynaklanan bir araç ve üç gönderim içeren temel bir senaryo gösterilmektedir.

Ö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ış bölümünde belirtildiği gibi, en önemli Rota Optimizasyonu isteği özellikleri vehicles ve shipments'dır.

Talep, araç ve gönderimlere ek olarak aşağıdaki alanları da içerir:

Çoklu çizgiler

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

Hizmet, Çoklu çizgileri Haritalar JS çoklu çizgi codec'ini kullanarak kodlar. Bu codec, yazdırılabilir ASCII karakterleri kullanan ikili çoklu çizgi verilerini temsil eder. Rota Optimizasyonu tarafından hesaplanan yolları görselleştirmek için Etkileşimli Çoklu Çizgi Kodlayıcı Yardımcı Programı'nı kullanabilirsiniz. Bu kılavuzdaki örnekte populatePolylines ve populateTransitionPolylines değerleri doğru olarak ayarlanır, diğer kılavuzlar ise yanıt boyutunu azaltmak için bunları "yanlış" olarak ayarlar.

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

Küresel saat kısıtlamaları

model.globalStartTime ve model.globalEndTime rastgele 24 saatlik bir süreye ayarlandı. Bu, çıkış zaman damgalarının yorumlanmasını kolaylaştırır.

Konumları ziyaret edin

Örnek istekte yalnızca model.shipments[].pickups[].arrivalLocation ve model.shipments[].deliveries[].arrivalLocation kullanılır. Ayrıca aracın geldiği yerden farklı bir noktadan ayrıldığı durumlarda (ör. binanın bir tarafında girişi ve diğerinde çıkışı olan bir otopark) departureLocation özelliği bulunur. Bu ve sonraki kılavuzlarda, varış ve kalkış noktalarının aynı olduğu varsayılır.

latLng yerine varış ve kalkış noktası waypoint 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 ayrıntı için referans belgelere (REST, gRPC) göz atı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 başlangıç ve bitiş zamanları, gönderimlere yakınlık ve geniş küresel zaman aralığı göz önünde bulundurulduğunda oldukça esnek bir kısıtlamadır.
  2. Tüm gönderimlerin tamamlanması gerekir. Bu, shipments üzerinde ceza maliyetleri belirtilmediğinde varsayılan davranıştır.
  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ı, araç başına bir rota olacak şekilde, önerilen rotaları temsil eden üst düzey routes alanını içerir. Bu kılavuzdaki örnek istek yalnızca bir araç belirttiğinden routes, bir ShipmentRoute mesajı içerir.

ShipmentRoute tesis

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

Her Visit, istek mesajındaki VisitRequest öğelerin birinden teslim alma veya teslimatın tamamlandığını temsil eder. Ziyaret, bir yerde ve zamanda bir araç tarafından tamamlanacak etkin bir şekilde atanır.

Her Transition bir konumdan diğerine seyahat eden aracı temsil eder. Aracın başlangıç noktası çifti, ziyaret konumu ve aracın uç noktası arasında geçişler meydana gelebilir.

Aracın tam rotasının yeniden oluşturulması için ShipmentRoute visits ve transitions birleştirilmelidir. Alanların araç etkinliği ilerlemesi şeklinde kombinasyonu şöyle 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 değerinden her zaman bir fazla transitions değerine sahiptir. Bunun nedeni, aracın başlangıç konumundan rotanın başındaki ilk ziyaretine ve son ziyaretinden rotanın sonundaki bitiş konumuna kadar gitmesi gerekir. Aracın başlangıç veya bitiş konumu eksikse ilk veya son ziyaretin konumu sırasıyla aracın başlangıç veya bitiş konumu olarak kullanıldığından visits ile kıyaslandığında bir transitions fazla transitions olacaktır.

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

Daha fazla bilgi için ShipmentRoute referans belgelerine (REST, gRPC) bakın.

Basit ara nokta sırası optimizasyonu

Bu örneğin de gösterdiği gibi, Rota Optimizasyonu, ziyaretleri gönderim özellikleri olarak modeller ve bağımsız bir varlık olarak ara noktaları veya duraklar kavramı yoktur. Bununla birlikte, durakları veya ara noktaları teslim alma veya teslimat kapsamında tam olarak bir VisitRequest ile gönderim olarak temsil etmek mümkündür. Optimize Edici'nin en uygun rotayı bulması (makul olan herhangi bir rotayı bulmak yerine) için araca yine de bir costPerHour veya costPerKilometer atanmalıdır.