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, tümü depot adı verilen tek bir konumdan kaynaklanan bir araç ve üç gönderim içeren temel bir senaryo gösterilmektedir.

Örnek 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 isteği alanları

Genel Bakış'ta belirtildiği gibi, en önemli Rota Optimizasyonu isteği özellikleri vehicles ve shipments'dir.

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

Çoklu çizgiler

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

Hizmet, Çoklu Çizgileri, yazdırılabilir ASCII karakterleri kullanan ikili çok çizgi verilerini temsil eden Maps JS çoklu çizgi codec'ini kullanarak kodlar. 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 true (doğru) olarak ayarlanmıştır ancak diğer kılavuzlar yanıt boyutunu küçültmek için bu değerleri false (yanlış) olarak ayarlanmıştır.

Kodlama biçiminin açıklaması için Kodlanmış Çoklu Çizgi Algoritma Biçimi bölümüne bakın.

Global zaman kısıtlamaları

model.globalStartTime ve model.globalEndTime rastgele 24 saatlik bir süreye 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 öğelerini kullanır. Binanın bir tarafında girişi ve diğer tarafında çıkışı olan bir otopark kompleksi gibi, aracın geldiği konumdan farklı bir noktadan ayrıldığı durumlar için de bir departureLocation özelliği vardır. Bu ve sonraki kılavuzlarda varış ve kalkış noktalarının aynı olduğu varsayılır.

latLng için alternatif olarak waypoint varış ve gidiş waypoint seçeneği de mevcut. Waypoint alanları, LatLng yerine Google Yer Kimliklerinin kullanılmasını destekler ve araç başlıklarını belirtebilir. Daha fazla bilgi için referans belgeleri (REST, gRPC) inceleyin.

Ö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, sevkiyatların yakın olması ve geniş küresel zaman aralığı göz önünde bulundurulduğunda başlangıç ve bitiş zamanları çok esnek bir kısıtlamadır.
  2. Tüm gönderimler tamamlanmalıdır. shipments öğesinde ceza maliyetleri belirtilmediğinde varsayılan davranış budur.
  3. costPerKilometer ve costPerHour aracın üzerinde ayarlandı.

Maliyetler, Maliyet Modeli Parametreleri'nde ele alınmaktadı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 bir routes alanı içerir. Bu kılavuzdaki örnek istek yalnızca bir aracı belirttiği için routes bir ShipmentRoute mesajı içerir.

ShipmentRoute tesis

ShipmentRoute mesaj türünün en önemli iki özelliği visits ve transitions şeklindedir.

Her Visit, istek mesajının VisitRequest'sinden bir teslim alma veya teslim alma işleminin tamamlandığını gösterir. Ziyaret, bir araç tarafından belirli bir yerde ve zamanda tamamlanacak bir iş olarak atanır.

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

Aracın tam rotasının yeniden oluşturulması için ShipmentRoute visits ve transitions değerlerinin birleştirilmesi gerekir. Araç etkinliğinin ilerlemesi için alan kombinasyonu şu şekilde 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, her zaman visits değerinden bir fazla transitions içerir. Çünkü aracın, rotanın başlangıcında başlangıç konumundan ilk ziyaretine ve son ziyaretinden rotanın sonundaki son konumuna kadar ilerlemesi gerekir. Aracın başlangıç veya bitiş konumu yoksa bile visits yerine bir daha fazla transitions olur. Bunun nedeni, sırasıyla ilk veya son ziyaretin konumu aracın başlangıç veya bitiş konumu olarak kullanıldığından.

Bu örnekte, üç teslim alma ziyareti arasında aynı konum aynı olduğundan, ilk üç teslim alma ziyareti aralarında sıfır mesafe ve süreyle geçişlere sahiptir.

Daha fazla bilgi için ShipmentRoute referans belgelerini (REST, gRPC) inceleyin.

Basit ara nokta sıralama optimizasyonu

Bu örnekte görüldüğü gibi, Rota Optimizasyonu modelleri, sevkiyatların özelliği olarak ziyaret edilir ve bağımsız bir varlık olarak referans noktaları veya durak algılaması içermez. Bununla birlikte, durakları veya ara noktaları teslim alma veya teslimat için tam olarak bir VisitRequest ile sevkiyat olarak temsil etmek mümkündür. Optimize Edici'nin (uygun bir rota bulmak yerine) en uygun rotayı bulması için araca yine de bir costPerHour veya costPerKilometer atanmalıdır.