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, REST API'yi göstermek için HTTP ve JSON kullanılmıştır. Ancak üretim ortamınız için genel öneri, performans avantajları nedeniyle gRPC'yi kullanmaktır. Ancak gRPC'nin yüklenmesi gerekir. Daha fazla bilgi için Route Optimization API istemci kitaplıkları başlıklı makaleyi inceleyin.
Senaryo
İstanbul'da 07:00-19:00 saatleri arasında köpek bakım hizmeti veriyorsunuz. Bu sabah, şehrin farklı yerlerinden üç köpek alıp kreşinize götürmek istiyorsunuz.
Bernese dağ köpeği ve Chihuahua, randevularını geçen hafta 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üşterileriniz 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 öğlen saatine kadar sabahki toplama işini bitirip geri dönmelidir.
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. Sahibi, 08:00 ile 08:20 arasında dar bir teslim alma aralığı talep etti.
- South Sunset Playground Park'ta Chihuahua'yı alın. Sahibi, 07:30 ile 09:30 arasında daha esnek bir teslim alma aralığı sundu.
- Land's End'deki Alman çoban köpeğini al. Ayrıca, teslimatın sabah 08:00 ile 08:20 arasında yapılmasını istedi.
- 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ği almak veya bırakmak için yapılan her ziyaret, köpeğin araca binmesi veya araçtan inmesi için 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ı tamamlamanı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 olacak şekilde ayarlamanız gerekir. Bu köpek kreşi senaryosunda, optimize edicinin isteğinize yanıt vermek için çok fazla zamana ihtiyacı yoktur. Bu nedenle aşağıdaki ayarları kullanın:
timeoutparametresini 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:
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.
Gönderileri tanımlayın.
shipmentsalanına, sabah alınması ve bırakılması gereken her köpek için birShipmentmesajı 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.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
VisitRequestoluşturun.Teslim alma noktalarında
arrivalWaypointdeğerini köpeğin teslim alma konumu olarak 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).timeWindowsdeğerini, sahibin 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
arrivalWaypointdeğerini kreş olarak,timeWindowsdeğerini ise gerekli bırakma saati (09:30-11:30) olarak ayarlayın.Tüm teslim alma ve teslimat işlemleri için köpeklerin araca bindirilmesi ve indirilmesi için
durationdeğ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.
Düzenli müşterilere öncelik vermek için Bernese dağ köpeği ve Chihuahua için
penaltyCostdeğerini1000, Alman çoban köpeği için ise100olarak ayarlarsınız. Ceza maliyetleri ayarlandığında optimize edici, köpeklerden herhangi birini atlayabilir ancak kısıtlamalar tüm teslim alma işlemlerini gerçekleştirmeyi imkansız hale getirirse önce Alman çoban köpeğini (daha düşük bir cezaya sahip) atlamayı düşünür.Her gönderi için "Bernese dağ köpeği", "Chihuahua" ve "Alman çoban köpeği" gibi bir tanımlayıcı eklemek üzere
labelalanı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.
Araçları tanımlayın.
vehiclesalanına, başlangıç ve bitiş noktaları kreş olan bir minibüsünüz için birVehiclemesajı, sürücünün ücretini ve minibüsün çalışma saatlerini ekleyin.Minibüsün
startWaypointveendWaypointdeğerlerini, günün başlangıç ve bitiş konumları olan Mission Dolores Parkı'nın yakınındaki kreş olarak ayarlayın.İşletme maliyetlerinizi en aza indirmek için işletmenizin maliyet kısıtlamalarını tanımlamanız gerekir. Maliyet parametresini
costPerHour,27olarak 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.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:
startTimeWindowsiçindestartTimedeğerini 07:00 olarak ayarlamak, sürücünün vardiyasına en erken 07:00'de başlayabileceği anlamına gelir. Sabah erken saatlerde teslim alma işlemi yoksa daha geç de başlayabilir.endTimeWindowsiçindeendTimedeğerini öğle saatine ayarlamak, sürücünün vardiyasını öğle saatine kadar bitirmesi gerektiği anlamına gelir. Ayrıca son teslimatı tamamlar tamamlamaz vardiyalarını bitirebilirler.
Pencerelerin diğer yarısının atlanması, sürücünün bekleme ve sapma 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.
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
globalStartTimedeğerini 07:00,globalEndTimedeğ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, 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 bir 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 saat olan 13 Şubat 2024, 07:00'yi seçin. | |
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 senaryosunda, her bir köpek için her bir sahibin 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 sahibi tarafından sağlanan konumu, deliveries için ise bakım merkezinin adresini 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, hareket halinde veya durmuş olmasına bakılmaksızın bir aracın kullanıldığı her saat için ortaya çıkan 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, ilk teslim alma sabahın ilerleyen saatlerindeyse optimizasyon aracı vardiyanın başlangıcını erteleyebilir. 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 senaryosu için 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. |