Köpeklerle ilk Route Optimization isteğinizi gönderme

Avrupa Ekonomik Alanı'ndaki (AEA) geliştiriciler

Bu belgede, gerçek hayattan bir kullanım senaryosu kullanarak Route Optimization API'ye ilk isteğinizi nasıl göndereceğiniz gösterilmektedir.

Örnekte, basitlik açısından REST API'yi göstermek için HTTP ve JSON kullanılmıştır. Ancak üretim ortamınızda, performans avantajları nedeniyle genel olarak gRPC kullanmanız önerilir. Ancak gRPC'nin yüklenmesi gerekir. Daha fazla bilgi için Route Optimization API istemci kitaplıkları başlıklı makaleyi inceleyin.

Senaryo

Coit Kulesi, Mission Dolores Parkı ve South Sunset Oyun Alanı Parkı'nın işaretlendiği bir San Francisco haritası

İstanbul'da 07:00-19:00 saatleri arasında köpek bakım hizmeti veriyorsunuz. Bu sabah, şehrin farklı yerlerinden üç köpeği alıp kreşinize götürmek istiyorsunuz.

Bernese dağ köpeği ve Chihuahua, geçen hafta randevu alan düzenli müşterilerdir. Alman çoban köpeği, son dakikada gelen yeni bir istek. Mümkünse Alman çoban köpeğini kabul etmek istiyorsunuz ancak bunu düzenli müşterilerinizi kaybetme pahasına yapmak istemiyorsunuz.

İş için bir minibüsünüz var ve şoföre saatte 27 ABD doları ödüyorsunuz. Sürücü ve minibüs, güne sabah saat 07:00'de kreşinizde başlar ve öğle yemeği molası için öğlene kadar sabah servislerini tamamlayıp geri dönmeleri gerekir.

Bugün 13 Şubat 2024. Bu senaryodaki tüm saatler, San Francisco yerel saatine (Şubat ayında Pasifik Standart Saati (UTC-8)) göredir. Sürücünün aşağıdaki görevleri vardır:

  • Coit Kulesi'nin yakınındaki Bernese dağ köpeğini alın. Sahibi, 08:00 ile 08:20 arasında dar bir teslim alma aralığı talep etti.
  • South Sunset Playground Park'ta Chihuahua'yı teslim alın. Sahibi, 07:30 ile 09:30 arasında daha esnek bir teslim alma aralığı sunmuş.
  • Land's End'deki Alman çoban köpeğini al. Ayrıca, 08:00 ile 08:20 arasında dar bir teslim alma aralığı talep etti.
  • Köpekleri Mission Dolores Park'taki kreşe bırakın. Kreş, çocukların 09:30 ile 11:30 arasında bırakılmasını istiyor.

Köpeğin araca binmesi veya araçtan inmesi 5 dakika sürer.

Land's End, Coit Tower'dan uzak olduğu ve teslim alma zaman aralıkları çakıştığı için sürücü üç teslim alma işlemini de gerçekleştiremez. Optimizasyon aracı, toplam maliyeti (sürücü ücretleri ve atlama cezaları) en aza indirmek için hangi köpeğin atlanacağını seçmelidir.

Başlamadan önce

Bu örnek senaryodaki kodu çalıştırmak için önce Route Optimization API'yi ayarlama bölümündeki talimatları uygulamanız gerekir.

1. Rota optimizasyonu yaklaşımınızı seçme

Route Optimization API, optimizasyon sorununuzun karmaşıklığına bağlı olarak seçebileceğiniz birden fazla yöntem sunar.

Bu köpek kreşi senaryosu küçük ve basit bir istek olduğundan, küçük istekler için hızlı sonuç veren optimizeTours gibi bir engelleme yöntemi kullanın. Route Optimization API uç noktaları hakkında daha fazla bilgi için Uç nokta seçme başlıklı makaleyi inceleyin.

optimizeTours yöntemine HTTP POST isteği göndermek için aşağıdaki URL'yi kullanın:

https://routeoptimization.googleapis.com/v1/projects/PROJECT_OR_ID:optimizeTours

Ayrıca, gereksiz bekleme sürelerini azaltmak için zaman aşımı ve son tarih ayarlarını kısa tutmanız gerekir. Bu köpek bakım merkezi senaryosunda, optimize edicinin isteğinize yanıt vermek için çok fazla zamana ihtiyacı yoktur. Bu nedenle aşağıdaki ayarları kullanın:

  • timeout parametresini 2 saniye olarak ayarlayın.
  • Son tarih ayarlarını varsayılan değerde bırakın. Bu değer, REST istekleri için 60 saniyedir.

2. İstek e-posta mesajını oluşturma

Engelleme optimizeTours yöntemini seçip zaman aşımı ve son tarih ayarlarını tanımladıktan sonraki adımınız, istek mesajının gövdesini oluşturmaktır.

Bu senaryoda istek, REST API'de JSON olarak kodlanmış bir OptimizeToursRequest mesajıdır.

İstek mesajını oluşturmak için aşağıdaki adımları uygulayın:

  1. Temel istek yapısıyla başlayın:

    {
      "timeout": ...,
      "model": {
        "shipments": [...],
        "vehicles": [...],
        "globalStartTime": "...",
        "globalEndTime": "..."
      }
    }
    

    Yapı hakkında daha fazla bilgi için Temel yapı (ShipmentModel, Shipment ve Vehicle) ile ilgili temel kavramlar kılavuzuna bakın.

  2. Gönderileri tanımlayın. shipments alanına, sabah alınması ve bırakılması gereken her köpek için bir Shipment mesajı ekleyin. Köpek sahibinin tercih ettiği teslim alma konumunu ve saatlerini, ayrıca kreşin konumunu ve köpeklerin bırakılacağı saatleri burada tanımlarsınız.

    1. Her köpek için teslim alma ve teslim etme (bu senaryoda kreşe bırakma olarak adlandırılır) işlemlerine yönelik birer VisitRequest oluşturun.

      • Teslim alma noktalarında arrivalWaypoint değerini köpeğin teslim alma konumuna ayarlayın (Bernese dağ köpeği için Coit Tower, Chihuahua için South Sunset Playground Park veya Alman çoban köpeği için Land's End). timeWindows değerini, sahibinin talep ettiği teslim alma saatine ayarlayın (Bernese dağ köpeği ve Alman çoban köpeği için 08:00-08:20, Chihuahua için 07:30-09:30).

      • Teslimatlarda arrivalWaypoint değerini kreş, timeWindows değerini ise gerekli bırakma saati (09:30-11:30) olarak ayarlayın.

      • Tüm teslim alma ve teslim etme işlemleri için köpeklerin araca bindirilmesi ve indirilmesi için duration değerini 5 dakika (300s) olarak ayarlayın.

      Zaman aralıkları hakkında daha fazla bilgi için Zaman aralıkları başlıklı makaleyi inceleyin.

    2. Düzenli müşterilere öncelik vermek için Bernese dağ köpeği ve Chihuahua için penaltyCost değerini 1000, Alman çoban köpeği için ise 100 olarak ayarlarsınız. Ceza maliyetleri ayarlandığında optimize edici, köpeklerden herhangi birini atlayabilir ancak kısıtlamalar tüm teslim alımların yapılmasını imkansız hale getirirse önce Alman çoban köpeğini (daha düşük bir cezası vardır) atlamayı düşünür.

    3. Her gönderi için "Bernese dağ köpeği", "Chihuahua" ve "Alman çoban köpeği" gibi bir tanımlayıcı eklemek üzere label alanını kullanabilirsiniz. Bu, yanıttaki gönderileri tanımlamanıza yardımcı olabilir.

    Gönderileri tanımlama hakkında daha fazla bilgi için Gönderi bölümüne bakın.

  3. Araçları tanımlayın. vehicles alanına, başlangıç ve bitiş noktaları kreş olan bir minibüsünüz için bir Vehicle mesajı, sürücünün ücretini ve minibüsün çalışma saatlerini ekleyin.

    1. Minibüsün startWaypoint ve endWaypoint değerlerini, günün başlangıç ve bitiş konumları olan Mission Dolores Parkı'nın yakınındaki kreş olarak ayarlayın.

    2. İşletme maliyetlerinizi en aza indirmek için işletmenizin maliyet kısıtlamalarını tanımlamanız gerekir. Maliyet parametresini costPerHour, 27 olarak ayarlayın. Bu, köpek kreşi minibüsünü sürmesi için sürücüye ödediğiniz tutardır. Maliyet parametreleri hakkında daha fazla bilgi için Maliyet modeli başlıklı makaleyi inceleyin.

    3. Optimize edicinin, minibüsün çalışma saatleri içinde bir rota oluşturmasını sağlamak için araç için bir çalışma aralığı tanımlayın. Bu pencere, rota için başlangıç ve bitiş zamanı kısıtlamalarını ayarlar. Her zaman aralığının yalnızca bir yarısını tanımlayarak optimize ediciye rotayı daha geç başlatma veya daha erken bitirme esnekliği sağlarsınız:

      • startTimeWindows içinde startTime ayarını 07:00 olarak belirlediğinizde sürücü, vardiyasına en erken 07:00'de başlayabilir. Sabah erken saatlerde teslim alma işlemi yoksa daha geç de başlayabilir.

      • endTimeWindows içinde endTime değerini öğle saatine ayarlamak, sürücünün vardiyasını öğle saatine kadar bitirmesi gerektiği anlamına gelir. Son teslimatı tamamlar tamamlamaz vardiyalarını da bitirebilirler.

      Pencerelerin diğer yarısını atlamak, sürücünün bekleme ve dolambaçlı yoldan gitme sürelerini en aza indirir. Zaman aralıkları hakkında daha fazla bilgi için Zaman aralıkları başlıklı makaleyi inceleyin.

    Araçları tanımlama hakkında daha fazla bilgi için Araç bölümüne bakın.

  4. Genel bir zaman aralığı ayarlayın. Genel zaman aralığı, minibüsün gün boyunca kreşiniz için alma ve bırakma işlemlerini gerçekleştirebileceği zaman aralığını temsil eder. Bu senaryoda, 13 Şubat 2024 için globalStartTime değerini 07:00, globalEndTime değerini ise 19:00 olarak ayarlayın. Bu saatler, köpek bakım evinizin çalışma saatlerini temsil eder.

3. İsteği gönder

Aşağıda, köpek bakım merkezi senaryosuna dayalı basit bir curl isteği verilmiştir. Bu istekte, engelleyici optimizeTours yöntemi kullanılır.

İsteği göndermeden önce örnek koddaki PROJECT_NUMBER_OR_ID değerini Google Cloud proje kimliğinizle değiştirin.

curl -X POST 'https://routeoptimization.googleapis.com/v1/projects/PROJECT_NUMBER_OR_ID:optimizeTours' \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
--data @- << EOM
{
  "timeout": "2s",
  "model": {
    "shipments": [
      {
        "pickups": [
          {
            "arrivalWaypoint": {
              "location": {
                "latLng": {
                  "latitude": 37.802395,
                  "longitude": -122.405822
                }
              }
            },
            "timeWindows": [
              {
                "startTime": "2024-02-13T08:00:00-08:00",
                "endTime": "2024-02-13T08:20:00-08:00"
              }
            ],
            "duration": "300s"
          }
        ],
        "deliveries": [
          {
            "arrivalWaypoint": {
              "location": {
                "latLng": {
                  "latitude": 37.759719,
                  "longitude": -122.42798
                }
              }
            },
            "timeWindows": [
              {
                "startTime": "2024-02-13T09:30:00-08:00",
                "endTime": "2024-02-13T11:30:00-08:00"
              }
            ],
            "duration": "300s"
          }
        ],
        "label": "Bernese mountain dog",
        "penaltyCost": 1000
      },
      {
        "pickups": [
          {
            "arrivalWaypoint": {
              "location": {
                "latLng": {
                  "latitude": 37.738067,
                  "longitude": -122.498593
                }
              }
            },
            "timeWindows": [
              {
                "startTime": "2024-02-13T07:30:00-08:00",
                "endTime": "2024-02-13T09:30:00-08:00"
              }
            ],
            "duration": "300s"
          }
        ],
        "deliveries": [
          {
            "arrivalWaypoint": {
              "location": {
                "latLng": {
                  "latitude": 37.759719,
                  "longitude": -122.42798
                }
              }
            },
            "timeWindows": [
              {
                "startTime": "2024-02-13T09:30:00-08:00",
                "endTime": "2024-02-13T11:30:00-08:00"
              }
            ],
            "duration": "300s"
          }
        ],
        "label": "Chihuahua",
        "penaltyCost": 1000
      },
      {
        "pickups": [
          {
            "arrivalWaypoint": {
              "location": {
                "latLng": {
                  "latitude": 37.78018,
                  "longitude": -122.51194
                }
              }
            },
            "timeWindows": [
              {
                "startTime": "2024-02-13T08:00:00-08:00",
                "endTime": "2024-02-13T08:20:00-08:00"
              }
            ],
            "duration": "300s"
          }
        ],
        "deliveries": [
          {
            "arrivalWaypoint": {
              "location": {
                "latLng": {
                  "latitude": 37.759719,
                  "longitude": -122.42798
                }
              }
            },
            "timeWindows": [
              {
                "startTime": "2024-02-13T09:30:00-08:00",
                "endTime": "2024-02-13T11:30:00-08:00"
              }
            ],
            "duration": "300s"
          }
        ],
        "label": "German shepherd",
        "penaltyCost": 100
      }
    ],
    "vehicles": [
      {
        "startWaypoint": {
          "location": {
            "latLng": {
              "latitude": 37.759719,
              "longitude": -122.42798
            }
          }
        },
        "endWaypoint": {
          "location": {
            "latLng": {
              "latitude": 37.759719,
              "longitude": -122.42798
            }
          }
        },
        "costPerHour": 27,
        "startTimeWindows": [
          {
            "startTime": "2024-02-13T07:00:00-08:00"
          }
        ],
        "endTimeWindows": [
          {
            "endTime": "2024-02-13T12:00:00-08:00"
          }
        ]
      }
    ],
    "globalStartTime": "2024-02-13T07:00:00-08:00",
    "globalEndTime": "2024-02-13T19:00:00-08:00"
  }
}
EOM

İstekte kullanılan istek parametreleri

Aşağıdaki tabloda, örnek senaryonun istek gövdesinde kullanılan istek parametreleri açıklanmaktadır. İçerikleri üst öğeye veya metin aramasına göre filtreleyebilirsiniz.

Ebeveyn Parametre Mülk Türü Açıklama
OptimizeToursRequest model nesne (ShipmentModel) Bu, isteğinizin temelini oluşturur. Bu, teslim almanız ve bırakmanız gereken tüm köpekler (shipments) ve filonuzdaki minibüs (vehicles) dahil olmak üzere tüm sorununuzu tanımladığınız tek bir nesnedir. Bunu, optimize etmeniz gereken sorunun eksiksiz planı olarak düşünebilirsiniz.
timeout Süre Bu parametre, sunucunun yanıt döndürmeden önce bir istek üzerinde çalışacağı maksimum süreyi belirtir. Bekleme sürenizi kısaltmak için bu parametreyi kullanın. Bu köpek bakım merkezi senaryosu gibi küçük ve hızlı istekler için bu değeri 2 saniye olarak ayarlayın.
ShipmentModel shipments[] nesne dizisi (Shipment) Bu, her bir nesnenin alınması veya bırakılması gereken bir köpeği temsil ettiği bir nesne dizisidir.
vehicles[] nesne dizisi (Vehicle) Bu, her nesnenin filonuzdaki bir aracı tanımladığı bir nesne dizisidir. Bu bölümde, teslim alma ve bırakma işlemlerini gerçekleştiren kamyonet gibi kaynaklarınızı tanımlarsınız. Optimize edilmiş bir rota elde etmek için en az bir araç tanımlamanız gerekir.
globalStartTime Zaman damgası Bu, tüm modelinizdeki herhangi bir etkinliğin gerçekleşebileceği en erken zamandır. Bu parametre, optimizasyon sorununu zaman açısından daraltır. Bu, doğru trafik ve rota hesaplamaları için çok önemlidir. Bu köpek kreşi senaryosunda, sürücünün minibüsü gün içinde kullanabileceği en erken saati 13 Şubat 2024, 07:00 olarak ayarlayın.
globalEndTime Zaman damgası Bu, modelinizdeki herhangi bir etkinliğin gerçekleşebileceği en geç zamandır. Bu köpek kreşi senaryosunda, bu değeri minibüsün çalışmasının sona ermesinin beklendiği zamana (13 Şubat 2024, 19:00) ayarlayın.
Shipment pickups[] nesne dizisi (VisitRequest) Bu, gönderi için olası tüm teslim alma seçeneklerinin listesidir. Optimizasyon aracı, sorununuzu çözmek için en iyi yöntemi seçer. Bu köpek kreşi senaryosu için her bir köpeğin sahibinin belirttiği teslim alma konumlarını ve zaman aralıklarını listeleyin.
deliveries[] nesne dizisi (VisitRequest) Bu, gönderi için olası tüm bırakma seçeneklerinin listesidir. Optimizasyon aracı, sorununuzu çözmek için en iyi yöntemi seçer. Bu köpek kreşi senaryosunda, köpek kreşi tesisinin konumunu ve sürücünün her köpek için öğle yemeğine dönmesi gereken zaman aralığını listeleyin.
label dize Bu, isteğinizdeki belirli bir gönderinin tanımlayıcısıdır. Yanıtın daha kolay okunabilmesi için isteğinizde etiketler belirtebilirsiniz. Bu köpek bakım merkezi senaryosunda, API yanıtını aldığınızda çözümü girişinizle eşleştirmek için "Chihuahua", "Bernese dağ köpeği" veya köpeğin adı gibi açıklayıcı bir dize kullanın.
penaltyCost çift Bu, optimize edici bu gönderiyi atlarsa ortaya çıkan ceza maliyetidir. Varsayılan olarak, gönderiler zorunludur. Optimize edici, atlanan zorunlu gönderileri en aza indirmeye öncelik verir ve bunları yalnızca başka seçenek olmadığında atlar. Ceza maliyeti belirlemek, optimize edicinin gerçekleştirilmesi mümkün olmayan veya çok maliyetli olan gönderileri atlamasına ve gönderiler arasındaki öncelikleri değerlendirmenize olanak tanır. Bu senaryoda, düzenli müşterileriniz (Bernese dağ köpeği ve Chihuahua) için daha yüksek bir ceza maliyeti (1000) ve son dakika Alman çoban köpeği isteği için daha düşük bir ceza maliyeti (100) belirlersiniz. Bu, optimize ediciye normal müşterilere öncelik vermesini söyler. Böylece optimize edici, tüm teslim alma işlemlerini gerçekleştiremediğinde önce Alman çoban köpeğini atlamayı düşünür.
VisitRequest arrivalWaypoint nesne (Waypoint) Bu, rotadaki belirli bir ziyaretin konumudur. Bunu enlem ve boylam koordinatlarını, yer kimliğini veya başlığı kullanarak tanımlayabilirsiniz. Bu köpek bakım merkezi senaryosunda, pickups için bu değeri sahibin sağladığı konuma, deliveries için ise bakım merkezinin adresine ayarlayın.
timeWindows[] nesne dizisi (TimeWindow) Bu, teslim alma veya teslimat için zaman kısıtlamalarını tanımlayan bir nesne dizisidir. Bu senaryoda, her bir köpeğin alınacağı zaman aralığını ve köpeklerin kreşe bırakılabileceği kabul edilebilir zaman aralığını tanımlamak için bu kısıtlamayı kullanın.
duration Süre Bu parametre, ziyaretin süresini (ör. yükleme veya boşaltma süresi) belirtir. Bu senaryoda, sürücünün köpekleri araca bindirmesi ve araçtan indirmesi için tüm teslim alma ve teslimatlara 5 dakikalık bir tampon süre (300s) ayarlarsınız.
Vehicle startWaypoint nesne (Waypoint) Bu, aracın rotasının başlangıç konumudur. Enlem ve boylam koordinatları veya yer kimliği ile tanımlanır. Bu parametre, optimize ediciye aracın rotaya nereden başlaması gerektiğini bildirir. Bu ara noktayı tanımlamazsanız optimize edici, başlangıç konumu olarak teslim alma veya teslimat noktalarından birini seçer. Bu köpek bakım merkezi senaryosunda, sürücü güne bakım merkezinde başladığı için Mission Dolores Park'ın koordinatlarını kullanın.
endWaypoint nesne (Waypoint) Bu, aracın rotasının son varış noktasıdır. Enlem ve boylam koordinatları veya yer kimliği ile tanımlanır. Bu parametre, optimize ediciye aracın rotayı nerede bitirmesi gerektiğini bildirir. Bu ara noktayı tanımlamazsanız optimize edici, teslim alma veya teslimat noktalarından birini rotanın sonu olarak seçer. Bu köpek kreşi senaryosunda, sürücünün günü kreş tesisinde bitirmesi gerektiğinden Mission Dolores Park'ın koordinatlarını kullanın.
costPerHour sayı Bu, aracın hareket halinde veya durmuş olmasına bakılmaksızın kullanıldığı her saat için oluşan maliyettir. Bu köpek bakım merkezi senaryosunda, sürücünün saatlik ücretini modellemek için bu formülü kullanın.
startTimeWindows[] nesne dizisi (TimeWindow) Bu, sürücünün vardiyasına başlayabileceği kabul edilebilir zaman aralığıdır. Bu köpek bakım merkezi senaryosunda startTime değerini 07:00 olarak tanımlayın ancak endTime değerini atlayın. Bu sayede optimize edici, ilk teslim alma sabahın ilerleyen saatlerindeyse vardiyanın başlangıcını geciktirebilir. startTimeWindows için endTime sağlamasanız bile başlangıç zamanının endTimeWindows ile dolaylı olarak sınırlandırıldığını unutmayın. Araç, rota sona ermeden önce rotaya başlamalıdır.
endTimeWindows[] nesne dizisi (TimeWindow) Bu, sürücünün rotayı tamamlaması için kabul edilebilir zaman aralığıdır. Bu köpek bakım merkezi senaryosunda endTime öğesini öğle vakti olarak tanımlayın ancak startTime öğesini atlayın. Bu sayede sürücü, son çocuğu bıraktıktan hemen sonra kreşe dönebilir.

Sonraki

Yanıtı yorumlama