Bu darsda nima o‘rganasiz
Uber ilovasini ochasiz, manzilni yozasiz — va bir soniyadan kam vaqtda ekranda ikki raqam paydo bo‘ladi: “haydovchi 4 daqiqada keladi” va “manzilga 23 daqiqada yetasiz”. Bu raqamlarni hech kim alohida e’tiborga olmaydi. Lekin ular ortida butun bir tizim turadi: shahar yo‘l xaritasi graf sifatida, har bir haydovchi telefonidan har bir necha soniyada keladigan GPS nuqtalari, ulardan hisoblangan jonli tirbandlik, eng qisqa yo‘l algoritmlari va marshrut xatosini tuzatuvchi neyron tarmoq.
ETA (Estimated Time of Arrival — taxminiy yetib kelish vaqti) Uber’da faqat mijozga ko‘rsatiladigan raqam emas. U dispetcherlikning (qaysi haydovchini yuborish), narxning (safar narxi oldindan hisoblanadi), Uber Eats yetkazib berish vaqtining va hatto haydovchilar taqsimotining asosi. Shuning uchun ETA — Uber’ning eng ko‘p chaqiriladigan modeli: sekundiga yuz minglab so‘rov, har biri millisekundlarda.
Dars uchta savol atrofida quriladi.
Eng tez yo‘lni qanday topish mumkin — millisekundlarda? Dijkstra algoritmi to‘g‘ri, lekin katta grafda sekin. A*, ikki tomonlama qidiruv va Contraction Hierarchies bir necha ming barobar tezlashtiradi — bu darsning birinchi yarmi.
Yo‘lning “og‘irligi”ni qayerdan olamiz? Tezlik belgisi yolg‘on gapiradi: soat 18:00 da 60 km/soat yo‘lda mashinalar 12 km/soat bilan yuradi. Haqiqiy tezlik haydovchilarning GPS nuqtalaridan olinadi — lekin GPS shovqinli, nuqtalar siyrak va eskiradi.
Marshrut hisobi to‘g‘ri bo‘lsa ham, nega baribir xato? Svetoforlar, burilishlar, mijozni topish, to‘xtab turish joyi — grafda yo‘q narsalar. Bu yerda mashinaviy o‘rganish kiradi: u marshrut ETA’sini almashtirmaydi, balki uning xatosini bashorat qiladi.
Dars WhatsApp va Airbnb darslaridagi “real vaqt” va “hosila ko‘rinish” g‘oyalarining davomi, lekin yangi qatlam qo‘shadi: bu yerda javob hech qachon aniq emas — faqat qanchalik yaxshi taxmin ekani o‘lchanadi.
1. Muammo: “7 daqiqa” ortida nima bor
1.1 ETA qayerlarda ishlatiladi
| Qayerda | Qaysi ETA | Xato narxi |
|---|---|---|
| Ilova ochilganda | Har mahsulot uchun eng yaqin haydovchining kelish vaqti | Mijoz “uzoq” deb ketib qoladi |
| Narx oldindan | Safar vaqti va masofasi — narx formulasi kiritmasi | Narx noto‘g‘ri: yo mijoz, yo haydovchi zarar ko‘radi |
| Dispetcherlik | Har nomzod haydovchidan mijozgacha vaqt | Uzoqroq haydovchi yuboriladi, hammaning vaqti ketadi |
| Safar davomida | Manzilga qolgan vaqt, yo‘lda yangilanadi | Ishonch: “23 daqiqa” 40 ga aylansa |
| Uber Eats | Taom tayyorlash + kuryer kelishi + yetkazish | Taom sovuydi yoki kuryer restoranda kutadi |
| Rejalashtirish | Qaysi hududda haydovchi kam, qayerga yo‘naltirish | Bo‘sh yurish va uzoq kutishlar |
Bu jadval ETA’ni oddiy “ko‘rsatiladigan raqam”dan tizimning valyutasiga aylantiradi. Dispetcherlik haydovchilarni masofa bo‘yicha emas, ETA bo‘yicha tanlaydi: daryoning narigi qirg‘og‘idagi 500 metr uzoqlikdagi haydovchi ko‘prikdan aylanib 12 daqiqada keladi, 2 km uzoqdagisi esa to‘g‘ri yo‘l bilan 4 daqiqada. Narx esa ETA’ga bevosita bog‘liq: safar 25 daqiqa deb hisoblansa-yu, 40 daqiqa davom etsa, oldindan aytilgan narx bilan kimdir zarar ko‘radi.
1.2 Talablar
| Talab | O‘lchanadigan ko‘rsatkich |
|---|---|
| Aniqlik | O‘rtacha mutlaq xato (MAE) — daqiqalar; muhimi — tizimli siljish (bias) nolga yaqin |
| Kechikish | Bitta ETA: p99 bir necha o‘n ms; dispetcherlik bir so‘rovda yuzlab ETA so‘raydi |
| O‘tkazuvchanlik | Sekundiga yuz minglab so‘rov, cho‘qqida — bir necha barobar ko‘p |
| Yangilik | Tirbandlik o‘zgarishi ETA’ga 1–2 daqiqa ichida yetib kelishi |
| Izchillik | Bir ekrandagi ETA va narx bir xil hisobdan kelishi |
| Mavjudlik | ETA yo‘q — safar yo‘q: dispetcherlik va narx to‘xtaydi |
Oxirgi qator muhim: ETA — kritik yo‘l. Airbnb’da qidiruv eskirsa ham bronlash ishlardi; Uber’da ETA servisi yiqilsa, yangi safar boshlab bo‘lmaydi. Shuning uchun darsning 10-bo‘limida ko‘ramizki, ETA tizimi bir necha qavat zaxira bilan quriladi: aniq javob bo‘lmasa — taxminiyroq, lekin har doim javob.
1.3 Konvert orqasidagi hisob
Hisob darhol bitta xulosani beradi: ETA — o‘qish yuki va juda katta o‘qish yuki. Safarning o‘zi sekundiga bir necha yuz; ETA esa undan ~300 barobar ko‘p. Har bir ETA so‘rovi yo‘l grafida qidiruv va ML model chaqiruvidan iborat bo‘lsa, ikkalasi ham millisekund tartibida bo‘lishi kerak — aks holda serverlar soni yuz minglab bo‘lardi.
Ikkinchi hisob darsning ikkinchi yarmidagi asosiy qiyinchilikni oldindan ko‘rsatadi: nuqtalar ko‘p, lekin notekis tarqalgan. Katta ko‘chada tezlikni ishonchli bilamiz, kichik ko‘chada esa oxirgi 5 daqiqada birorta ham mashina o‘tmagan bo‘lishi mumkin. Tunda — hatto katta ko‘chalarda ham. Jonli ma’lumot yetmagan joyda nima qilish — 7-bo‘limning markaziy savoli.
Uchinchi hisob yaxshi yangilik: yo‘l grafi kichik. Ma’lumot hajmi muammo emas; muammo — hisob tezligi. Grafni bitta serverga yuklab, unda sekundiga minglab eng qisqa yo‘l qidiruvi bajarish kerak. Bu darsning 5 va 6-bo‘limlaridagi algoritmik qadamlarni oqlaydi: ma’lumotni bo‘lish emas, qidiruvni aqlli qilish.
Nazorat savoli · javobni ko‘rishNega Uber haydovchini masofa bo'yicha emas, ETA bo'yicha tanlaydi? Masofa hisoblash ancha arzon-ku.
Chunki masofa va vaqt o‘rtasidagi bog‘liqlik shaharda juda zaif.
Uch misol: (1) haydovchi 500 metrda, lekin daryoning narigi tomonida — eng yaqin ko‘prik 3 km aylanma; (2) haydovchi 300 metrda, lekin bir tomonlama ko‘chada teskari yo‘nalishda — kvartal atrofida aylanish kerak; (3) haydovchi 1 km da, lekin tirbandlikdagi magistralda — 1 km 8 daqiqa oladi, 2 km uzoqdagi bo‘sh ko‘chadagi haydovchi esa 4 daqiqada keladi.
Masofa bo‘yicha tanlash bu holatlarning har birida noto‘g‘ri haydovchini yuboradi. Natija — mijoz uzoq kutadi, haydovchi uzoq yuradi (bo‘sh kilometr — pul), va boshqa mijozga yaqin bo‘lgan haydovchi band bo‘ladi.
Arzonlik masalasi esa ikki bosqich bilan hal qilinadi: avval arzon filtr — masofa yoki geo-katak bo‘yicha eng yaqin ~20–30 nomzod; keyin qimmat hisob — faqat ular uchun haqiqiy ETA. Bu YouTube va Airbnb darslaridagi “arzon filtr ko‘p nomzodda, qimmat model oz nomzodda” naqshining yana bir ko‘rinishi.
2. Nol nuqta: yo‘l grafi
ETA tizimining eng ichki mexanizmi — graf. Uni tushunmasdan qolgan hamma narsa (tirbandlik, ML, geo-indeks) “qora quti” bo‘lib qoladi.
2.1 Tugun, qirra va yo‘nalish
Shahar xaritasini graf sifatida tasvirlash oddiy ko‘rinadi: chorrahalar — tugunlar, ular orasidagi yo‘l bo‘laklari — qirralar. Lekin detallarda bir nechta muhim tanlov bor.
Qirralar yo‘nalishli. Ikki tomonlama ko‘cha — ikkita qirra (A→B va B→A), bir tomonlamasi — bitta. Ikki yo‘nalishning tezligi ham har xil: ertalab shaharga kiruvchi tomon tirband, chiquvchi bo‘sh.
Og‘irlik — vaqt, masofa emas. Qirra og‘irligi = uzunlik ÷ tezlik. Shu sababli “eng qisqa yo‘l” aslida “eng tez yo‘l”. Masofa ham saqlanadi (narx uchun kerak), lekin qidiruv vaqt bo‘yicha.
Burilishlar ham narxga ega. Chapga burilish (o‘ng tomonlama harakatda) qarama-qarshi oqimni kesib o‘tadi va svetofor kutishini qo‘shadi; ba’zi chorrahalarda burilish taqiqlangan. Buni ifodalashning ikki usuli bor:
1) Tugunga asoslangan graf + burilish jadvali:
(kiruvchi qirra, chiquvchi qirra) -> jarima (soniya) yoki taqiq
Kichik xotira, lekin qidiruv algoritmi murakkablashadi
2) Qirraga asoslangan graf ("edge-expanded", "line graph"):
har bir yo'l bo'lagi — tugun; har bir ruxsat etilgan burilish — qirra
Burilish jarimasi — oddiy qirra og'irligi; algoritm o'zgarmaydi
Narxi: tugunlar ~2-3 barobar ko'p
Ko‘pchilik ishlab chiqarish dvigatellari ikkinchi usulni yoki uning ixcham variantini ishlatadi: algoritmlarni oddiy qoldirish xotiradan qimmatroq.
Bu hisob darsning keyingi qismi uchun muhim bir narsani ko‘rsatadi: yo‘l grafidagi og‘irliklar o‘rtacha qiymatlar va ularning xatosi tasodifiy emas, tizimli. Svetoforlarni har chorrahada modellashtirish mumkin emas (ularning ishlash rejimi ma’lum emas), lekin ularning o‘rtacha ta’sirini o‘tgan safarlardan o‘rganish mumkin. 5-bo‘limning 10–11-qadamlari aynan shu: marshrut hisobi “fizikani” beradi, ML esa qolgan tizimli xatoni.
2.2 Xarita qayerdan keladi
Graf o‘zi — xarita ma’lumotidan olingan hosila. Manbalar:
| Manba | Nima beradi | Muammo |
|---|---|---|
| OpenStreetMap | Ko‘chalar, yo‘nalish, tezlik chegaralari, burilish taqiqlari | Sifat shaharga qarab juda farq qiladi |
| Tijorat xaritalari | Tekshirilgan geometriya, manzillar | Qimmat; yangilanish sekin |
| Haydovchilar GPS izi | Haqiqiy harakat: yangi yo‘llar, yopilgan ko‘chalar | Shovqin; talqin qilish kerak |
| Foydalanuvchi xabarlari | “Bu yerda o‘tib bo‘lmaydi” | Kam, subyektiv |
Uber dastlab tashqi xarita provayderlariga tayangan, 2015-yildan esa o‘z xarita jamoasini qurgan (xarita va marshrutlash kompaniyasi deCarta’ni sotib olish shu yilga to‘g‘ri keladi). Sabab ETA bilan bevosita bog‘liq: tashqi xaritadagi xato (yopilgan ko‘cha, noto‘g‘ri bir tomonlama belgisi) to‘g‘ridan-to‘g‘ri noto‘g‘ri marshrut va noto‘g‘ri narxga aylanadi, va uni tuzatish uchun boshqa kompaniyaga murojaat qilish kerak edi.
▸Chuqurroq: GPS izlaridan xarita xatolarini topish
Har kuni millionlab safar — bu xaritani tekshirishning bepul manbai. Agar graf “bu ko‘chada chapga burilish taqiqlangan” desa-yu, izlarda kuniga 500 ta haydovchi aynan shu joyda chapga burilsa — xarita noto‘g‘ri. Agar grafdagi ko‘chada bir haftadan beri birorta ham iz bo‘lmasa, qo‘shni ko‘chalarda esa harakat odatdagidek bo‘lsa — ko‘cha, ehtimol, yopilgan (ta’mir).
Bunday tekshiruvlar oddiy statistik qoidalar:
Burilish taqig'i tekshiruvi (har chorraha, har hafta):
kutilgan: taqiqlangan burilishlar soni ~ 0 (xato GPS dan bir nechta)
kuzatilgan: N ta iz aynan shu burilishni qilgan
N > chegara (masalan, 50) va ulushi > 10% -> xarita jamoasiga navbat
Yopilgan yo'l tekshiruvi:
bo'lakdagi kunlik izlar: oldingi 4 hafta o'rtachasi 300
oxirgi 3 kun: 0, qo'shni bo'laklar odatdagidek
-> "ehtimol yopilgan": marshrutlashda og'irlikni vaqtincha oshirish
Muhim nozik jihat — kim qaror qiladi. Avtomatik tizim og‘irlikni vaqtincha o‘zgartirishi mumkin (xavfsiz, qaytariladigan), lekin xaritaning o‘zini o‘zgartirish odam tomonidan tekshiriladi. Sabab: bitta xato avtomatik o‘zgarish (masalan, GPS shovqini sabab “yangi yo‘l” qo‘shilishi) haydovchilarni hovli yoki piyodalar yo‘lagiga yuborishi mumkin. Bu Airbnb darsidagi “avtomatik tizim — ishqalanish, odam — qaror” tamoyilining xaritadagi ko‘rinishi.
2.3 Nuqtadan grafgacha: “qayerda turibman?”
Mijoz xaritada nuqta tanlaydi; haydovchi GPS koordinata yuboradi. Graf esa faqat tugun va qirralarni biladi. Shuning uchun har qidiruvdan oldin biriktirish (snapping) kerak: nuqtaga eng yaqin qirrani topish.
Bu oddiy ko‘rinadi, lekin ikkita tuzog‘i bor. Birinchisi — yo‘nalish: ko‘p qatorli yo‘lning qaysi tomonida turibsiz? Yo‘lning narigi tomonidagi mijozga yetish uchun haydovchi keyingi burilishgacha borib, qaytishi kerak — bu 2–5 daqiqa farq. Ikkinchisi — kirish joyi: katta bino yoki aeroportda mijoz turgan joy va mashina to‘xtay oladigan joy har xil.
Eng yaqin qirrani tez topish uchun geo-indeks kerak — bu yerda 5-bo‘limda batafsil ko‘radigan H3 kataklari yoki R-daraxt ishlatiladi: nuqta atrofidagi bir necha katakdagi qirralar olinadi va ular orasidan eng yaqini tanlanadi.
Bu tuzoq 5-bo‘limning 13-qadamida (“oxirgi 100 metr”) qayta uchraydi: ETA’ning katta qismi xatosi uzoq magistraldan emas, safarning boshi va oxiridan keladi.
Nazorat savoli · javobni ko‘rishNega qirra og'irligi masofa emas, balki vaqt? Masofa ham, tezlik ham grafda bor-ku.
Chunki algoritm bitta sonni minimallashtiradi, va biz minimallashtirmoqchi bo‘lgan narsa — vaqt.
Agar og‘irlik masofa bo‘lsa, Dijkstra eng qisqa masofali yo‘lni topadi: shahar markazi orqali, tor ko‘chalar va ko‘p svetoforlar bilan. Aylanma magistral 30% uzunroq, lekin ikki barobar tez bo‘lishi mumkin — masofa bo‘yicha qidiruv uni hech qachon tanlamaydi.
Og‘irlik vaqt bo‘lsa, ikkinchi savol paydo bo‘ladi: qaysi vaqt? Tezlik belgisi bo‘yichami, o‘rtacha tarixiy tezlik bo‘yichami yoki hozirgi jonli tezlik bo‘yichami? Bu savolga javob — 5-bo‘limning 7–9-qadamlari: og‘irlik doimiy son emas, vaqtga bog‘liq funksiya bo‘lib boradi.
Masofa esa yo‘qolmaydi: u topilgan yo‘l bo‘ylab yig‘iladi va narx formulasiga boradi. Qidiruv — vaqt bo‘yicha, hisob — ikkalasi bo‘yicha.
3. v0: to‘g‘ri chiziq va o‘rtacha tezlik
Eng sodda ishlaydigan ETA grafsiz ham quriladi. Ikki nuqta orasidagi to‘g‘ri chiziq masofasini (Yer sharida — haversine formulasi) hisoblaymiz, uni yo‘llar egriligi uchun koeffitsientga ko‘paytiramiz va shahar o‘rtacha tezligiga bo‘lamiz:
from math import radians, sin, cos, asin, sqrt
R_KM = 6371.0
DETOUR = 1.35 # yo'llar to'g'ri chiziqdan ~35% uzun (shahar o'rtachasi)
AVG_KMH = 25.0 # shahar bo'yicha o'rtacha tezlik
def haversine_km(lat1, lon1, lat2, lon2):
p1, p2 = radians(lat1), radians(lat2)
dp, dl = p2 - p1, radians(lon2 - lon1)
a = sin(dp / 2) ** 2 + cos(p1) * cos(p2) * sin(dl / 2) ** 2
return 2 * R_KM * asin(sqrt(a))
def eta_minutes(a, b):
km = haversine_km(*a, *b) * DETOUR
return km / AVG_KMH * 60
def nearest_driver(rider, drivers):
return min(drivers, key=lambda d: eta_minutes(d.pos, rider))
Bu kod ishlaydi. Kichik shaharda, tekis ko‘chalar to‘rida, tirbandliksiz paytda uning xatosi o‘rtacha 20–30% atrofida — ilk startap uchun yetarli. Bir millisekunddan kam vaqt oladi, xarita va server kerak emas, dispetcherlik ham shu funksiya bilan ishlaydi. Uber’ning ilk kunlari haqida ochiq ma’lumot kam, lekin ko‘plab taksi ilovalari aynan shunday boshlagan: “eng yaqin mashina” va “taxminan N daqiqa”.
Muammo shundaki, bu 20–30% o‘rtacha. Taqsimotning dumida xato 200–300% ga yetadi — va dispetcherlik aynan shu dumda noto‘g‘ri qaror qiladi.
4. Nima sindi
4.1 Daryo va ko‘prik
Koeffitsientni shahar bo‘yicha emas, hudud juftligi bo‘yicha o‘rganish mumkin (daryoning ikki qirg‘og‘i orasida — 2.5, bir qirg‘oq ichida — 1.3). Bu tuzatish, lekin u graf muammosini jadval bilan yashirish: jadval kattalashadi va baribir yangi ko‘prik yoki yopilgan ko‘chani bilmaydi. To‘g‘ri yechim — haqiqiy yo‘l grafi va unda eng tez yo‘l qidiruvi.
4.2 Tezlik belgisi yolg‘on gapiradi
Keyingi qadam tabiiy: 2-bo‘limdagi graf, og‘irlik = uzunlik ÷ tezlik chegarasi, va Dijkstra. Marshrut endi to‘g‘ri (ko‘prik orqali), lekin vaqt baribir xato.
Ikki xil xato bor. Birinchisi — muntazam: hech kim tezlik chegarasida yurmaydi, svetoforlar va burilishlar (2.1) vaqt qo‘shadi. Uni tarixiy o‘rtacha tezliklar bilan tuzatish mumkin. Ikkinchisi — vaqtga bog‘liq: bir xil yo‘l soat 11 da va 18 da uch barobar farq qiladi. Bu uchun bitta og‘irlik yetmaydi — og‘irlik kun va soatning funksiyasi bo‘lishi kerak. Uchinchisi esa hali ko‘rinmaydi: bugun soat 18:00 dagi tirbandlik o‘tgan seshanbadagidan boshqacha bo‘lishi mumkin (avariya, yomg‘ir, konsert). Bu jonli ma’lumot talab qiladi.
4.3 Dijkstra sekinlashadi
Dijkstra’ning muammosi — u yo‘nalishni bilmaydi. Manzil shimolda bo‘lsa ham, u janubga, g‘arbga va sharqqa teng tezlikda kengayadi, chunki faqat “manbadan qancha uzoq” ni biladi. Aylana ichidagi hamma tugunni ko‘rib chiqish — isrof: ularning ko‘pchiligi manzilga olib bormaydi. 5-bo‘lim 2–4-qadamlari bu isrofni bosqichma-bosqich yo‘q qiladi.
4.4 GPS shovqini: haydovchi qayerda?
Jonli tezlik va haydovchi joylashuvi GPS’dan keladi. GPS aniqligi ochiq joyda ~5 m, baland binolar orasida (“shahar kanyoni”) signal devorlardan qaytib, 30–50 m gacha xato qiladi. Tunnel va ko‘p qavatli yo‘l ayrilishlarida — signal umuman yo‘q.
Bu muammo alohida nuqtaga qarab hal qilinmaydi — nuqtalar ketma-ketligiga qarash kerak: mashina 4 soniyada 25 metr yon tomonga sakrab, keyin qaytib kela olmaydi. Bu 5-bo‘limning 6-qadamidagi map matching g‘oyasi.
4.5 Oxirgi yuz metr
Marshrut to‘g‘ri, tezliklar to‘g‘ri — lekin haydovchi baribir kechikdi. Nima uchun? U manzilga yetib keldi, lekin mijozni topa olmadi: bino ichki hovli orqali, kirish boshqa ko‘chadan, to‘xtash taqiqlangan. Yoki aeroportda — mashinalar uchun alohida chiqish yo‘li, piyodalar uchun boshqa.
Bu raqamlar faraz, lekin tuzilma ishlab chiqarish tizimlarida qayta-qayta tasdiqlangan: ETA’ning eng katta xatolari grafning “ichida” emas, grafning chegarasida — nuqta grafga qanday biriktirilgani va safar qanday boshlanib, qanday tugashida. Marshrutlash algoritmi bu haqda hech narsa bilmaydi. Buni o‘tgan safarlardan o‘rganish mumkin — ML qatlami (5-bo‘lim 10–11-qadamlar) shu uchun kerak.
Nazorat savoli · javobni ko‘rishv0 dagi aylanma koeffitsienti 1.35 o'rtacha to'g'ri. Nega o'rtacha to'g'ri model dispetcherlikda yomon ishlaydi?
Chunki dispetcherlik o‘rtacha bilan emas, taqqoslash bilan ishlaydi.
ETA mijozga ko‘rsatilganda o‘rtacha xato muhim: ko‘p mijozlar uchun “taxminan 5 daqiqa” yetarli. Dispetcherlik esa ikki haydovchini solishtiradi: “A 4 daqiqa, B 6 daqiqa — A ni yubor”. Agar xato tasodifiy va kichik bo‘lsa, taqqoslash baribir to‘g‘ri. Lekin v0 ning xatosi tizimli va joyga bog‘liq: daryo narigi tomonidagi haydovchi uchun doim kam, bu tomondagisi uchun doim to‘g‘ri. Natijada tanlov muntazam ravishda bir xil xato yo‘nalishda buziladi — daryo narigi tomonidagi haydovchilar doimiy “yaqin” ko‘rinadi.
Bu ML’dagi umumiy saboq: modelni qaror uchun ishlatsangiz, uning o‘rtacha xatosi emas, qarorga ta’sir qiladigan joylardagi nisbiy tartibi muhim. Shuning uchun ETA sifati faqat MAE bilan emas, 14-bo‘limda ko‘radigan qator ko‘rsatkichlar bilan o‘lchanadi.
5. Evolyutsiya: o‘n to‘rt qadam
Qadamlar uch guruhda. Qidiruv tezligi (1–5): Dijkstra’dan jonli og‘irliklarni ko‘taradigan ierarxik marshrutlashgacha. Og‘irliklar haqiqati (6–9): GPS nuqtalaridan jonli va tarixiy tezliklar, vaqtga bog‘liq marshrut. Grafdan tashqari (10–14): ML bilan xatoni tuzatish, geo-indeks va dispetcherlik, safarning boshi va oxiri, Uber Eats.
Dijkstra va tarixiy o'rtacha tezliklar
v0 dagi koeffitsient o‘rniga haqiqiy graf va eng tez yo‘l. Og‘irlik — bo‘lak uzunligi ÷ o‘tgan haftalardagi o‘rtacha haqiqiy tezlik (tezlik belgisi emas). Algoritm — klassik Dijkstra (1959) ustuvor navbat bilan:
import heapq
def dijkstra(adj, s, t):
"""adj[u] = [(v, soniya), ...]. Qaytaradi: (vaqt, yo'l)."""
dist, prev = {s: 0.0}, {}
pq = [(0.0, s)]
while pq:
d, u = heapq.heappop(pq)
if u == t:
break # t "o'rnatildi" — javob aniq
if d > dist[u]:
continue # eskirgan navbat yozuvi
for v, w in adj[u]:
nd = d + w
if nd < dist.get(v, float("inf")):
dist[v], prev[v] = nd, u
heapq.heappush(pq, (nd, v))
path, x = [t], t
while x != s:
x = prev[x]; path.append(x)
return dist[t], path[::-1]
Ikkita nozik joy bor. Birinchisi — to‘xtash sharti: javob t navbatdan
chiqarilganda aniq, unga birinchi marta yetilganda emas (birinchi
topilgan yo‘l eng qisqasi bo‘lmasligi mumkin). Ikkinchisi — eskirgan
yozuvlar: Python’ning heapq kalitni kamaytirishni bilmaydi, shuning
uchun bir tugun navbatda bir necha marta bo‘ladi va eskilarini tashlab
yuborish kerak.
Yutuq: To'g'ri marshrut: ko'priklar, bir tomonlama ko'chalar, taqiqlar hisobga olinadi
Narxi: Har so'rov ~10-50 ms; og'irliklar hali 'o'rtacha kun'
A*: manzil tomonga qarab qidirish
A* (1968) Dijkstra’ga bitta narsa qo‘shadi: navbatdagi tartib d(u) bo‘yicha
emas, d(u) + h(u) bo‘yicha, bu yerda h(u) — u dan manzilgacha
vaqtning pastki bahosi. Yo‘l vaqti uchun eng tabiiy baho: to‘g‘ri chiziq
masofasi ÷ grafdagi eng yuqori tezlik.
def h(u): # optimistik: hech qaysi yo'l bundan tez bo'lolmaydi
return haversine_km(pos[u], pos[t]) / V_MAX_KMH * 3600
Nega eng yuqori tezlik? Chunki h hech qachon haqiqiy qolgan vaqtdan
katta bo‘lmasligi kerak (“optimistik”, admissible). Agar h ni o‘rtacha
tezlik bilan hisoblasak, u ba’zan haqiqatdan katta bo‘ladi — va A*
eng tez yo‘lni “o‘tkazib yuborib”, noto‘g‘ri javob qaytaradi. Bu xato
ko‘pincha testlarda sezilmaydi: javob deyarli to‘g‘ri, bir-ikki foiz
uzunroq yo‘l.
A* ning shaharda cheklangan foydasi muhim saboq: evristika qanchalik aniq bo‘lsa, qidiruv shunchalik tor. To‘g‘ri chiziq va eng yuqori tezlik juda qo‘pol baho, chunki shaharda haqiqiy tezlik eng yuqoridan 3–4 barobar past. Landmark’lar oldindan hisoblangan ma’lumot hisobiga bahoni yaxshilaydi — bu 4-qadamdagi katta g‘oyaning kichik ko‘rinishi: oldindan hisoblash evaziga qidiruvni tezlashtirish.
Yutuq: Qidiruv manzil tomonga cho'ziladi; ko'riladigan tugunlar 2-4 barobar kam
Narxi: Evristika optimistik bo'lishi shart — aks holda javob noto'g'ri; shahar ichida foyda cheklangan
Ikki tomonlama qidiruv
Qidiruvni bir vaqtda ikki uchdan boshlaymiz: manbadan oldinga (odatdagi graf bo‘yicha) va manzildan orqaga (teskari qirralar bo‘yicha). Ikki “to‘lqin” o‘rtada uchrashadi.
Eng ko‘p uchraydigan xato — to‘xtash sharti. Ikki to‘lqin birinchi marta bitta tugunda uchrashganda to‘xtash noto‘g‘ri: o‘sha tugun orqali o‘tgan yo‘l eng qisqasi bo‘lmasligi mumkin, chunki boshqa, hali “o‘rnatilmagan” tugunlar orqali qisqaroq yo‘l bo‘lishi mumkin. To‘g‘ri qoida:
mu = eng yaxshi topilgan yo'l (ikki to'lqin kesishgan har bir qirrada yangilanadi)
To'xtash: oldinga navbat boshi + orqaga navbat boshi >= mu
Ya’ni ikkala navbatning eng kichik elementlari yig‘indisi topilgan eng yaxshi yo‘ldan katta bo‘lsa, undan yaxshi yo‘l yo‘q. Amaliyotda (18-bo‘lim) bu shartni “birinchi uchrashuvda to‘xtash” bilan almashtirgan yechim tasodifiy testlarning bir qismida noto‘g‘ri javob beradi — va testlar buni ushlaydi.
Yutuq: Ikki kichik doira bitta katta doiradan ~2 barobar kam tugun
Narxi: To'xtash sharti nozik: birinchi uchrashuv — eng qisqa yo'l emas
Contraction Hierarchies
Bu qadam — tartibni o‘zgartiradigan yagona qadam. G‘oya (Geisberger va boshq., 2008) inson xaritadan yo‘l topishiga o‘xshaydi: avval kichik ko‘chadan katta yo‘lga chiqiladi, keyin magistral, oxirida yana kichik ko‘cha. Hech kim shaharlararo yo‘lda har bir hovlini ko‘rib chiqmaydi.
Oldindan hisoblash. Tugunlar “muhimlik” bo‘yicha tartiblanadi (hovli
ichidagi burilish — kam muhim, magistral chorrahasi — muhim). So‘ng
eng kam muhim tugundan boshlab ular birma-bir qisqartiriladi
(contraction): tugun v olib tashlanadi, va agar u → v → w yo‘li
u dan w gacha eng qisqa yo‘l bo‘lsa, uning o‘rniga yorliq
(shortcut) qirra u → w qo‘shiladi, og‘irligi ikki qirra yig‘indisi.
Qidiruv. Ikki tomonlama Dijkstra, lekin har ikki tomon faqat yuqoriga — o‘zidan muhimroq tugunlarga — yuradi. Manbadan yuqoriga, manzildan yuqoriga; ular “cho‘qqida” uchrashadi. Chunki har qanday eng qisqa yo‘l “yuqoriga — cho‘qqi — pastga” shakliga yorliqlar orqali keltiriladi.
- Oldindan hisoblash yo'q
- Og'irlik o'zgarsa — darhol hisobga olinadi
- Shahar ichida ~10-50 ms, uzoqda soniyalar
- Kod ~30 satr, xato qilish qiyin
- Ish hajmi ~ qidiruv doirasi maydoni
- Oldindan hisoblash daqiqalar
- Og'irlik o'zgarsa — ierarxiya eskiradi
- Har qanday masofada ~0.1-1 ms
- Kod murakkab: tartiblash, yorliqlar, guvohlar qidiruvi
- Ish hajmi ~ ierarxiya balandligi (yuzlab tugun)
CH ning narxi o‘ng ustunning ikkinchi qatorida. Yorliqlar og‘irliklardan
hisoblangan: agar magistral tirband bo‘lsa, u → w yorlig‘i endi eng
qisqa yo‘l emas, va ierarxiyani qayta qurish kerak — daqiqalar. Jonli
tirbandlik esa har daqiqada o‘zgaradi. Bu ziddiyat keyingi qadamni
talab qiladi.
Yutuq: Qidiruv mikrosekundlar-millisekundlarda; bir necha yuz tugun ko'riladi
Narxi: Oldindan hisoblash daqiqalar; og'irlik o'zgarsa — qaytadan; xotira ~2 barobar
Moslashtiriladigan marshrutlash: tuzilma va og'irlikni ajratish
Yechim — oldindan hisoblashni ikkiga bo‘lish. Tuzilma (qaysi tugunlar qaysi qismda, qaysi chegaralar) faqat xarita o‘zgarganda hisoblanadi — haftasiga bir marta. Og‘irliklar (qirralar vaqti) esa alohida, tez bosqichda “sozlanadi” (customization). Bu g‘oya ikki mashhur variantda uchraydi: CRP (Customizable Route Planning, Delling va boshq., 2011) — graf bo‘laklarga (cell) bo‘linadi va har bo‘lak chegaralari orasidagi masofalar jadvali saqlanadi; va CCH (Customizable Contraction Hierarchies, Dibbelt va boshq., 2014) — tugunlar tartibi og‘irliksiz tanlanadi, yorliqlar og‘irligi keyin to‘ldiriladi.
Bu qadamning muhandislik mohiyati — o‘zgaradigan va o‘zgarmaydigan narsani ajratish. Xarita tuzilmasi sekin o‘zgaradi (haftalar), og‘irliklar tez (daqiqalar), so‘rovlar juda tez (millisekundlar). Uch tezlik — uch bosqich. Bu Google Docs darsidagi “surat va jurnal” va Spotify’dagi “oflayn o‘qitish va onlayn xizmat” bilan bir xil tuzilma. Uber’ning o‘z marshrutlash dvigatelining ichki tafsilotlari to‘liq ochiq emas, lekin jonli tirbandlik bilan millisekund qidiruvini birlashtiradigan har qanday tizim shu uch bosqichli tuzilmaga keladi.
Yutuq: Jonli tirbandlik soniyalarda qidiruvga yetadi, qidiruv tezligi saqlanadi
Narxi: Uch bosqichli tizim; qidiruv CH dan ~2-5 barobar sekinroq
Map matching: nuqtalardan yo'lga
4.4-dagi muammo: har nuqtani alohida “eng yaqin yo‘lga” biriktirish noto‘g‘ri. To‘g‘ri yondashuv — izni butunligicha ko‘rib, eng ehtimolli yo‘l bo‘laklari ketma-ketligini topish. Klassik usul — yashirin Markov modeli (HMM, Newson va Krumm, 2009).
▸Chuqurroq: Yashirin Markov modeli bilan map matching
Model ikki ehtimollikdan iborat.
Emissiya ehtimoli — “agar mashina aslida r yo‘lda bo‘lsa, GPS bu
nuqtani ko‘rsatishi qanchalik ehtimol?” GPS xatosi taxminan normal
taqsimlangan, shuning uchun:
P(nuqta | yo'l r) ~ exp( -0.5 x (masofa(nuqta, r) / sigma)^2 )
sigma ~ 5-10 m (ochiq joyda), 20-30 m (baland binolar orasida)
O‘tish ehtimoli — “mashina r1 dan r2 ga 4 soniyada o‘tishi
qanchalik ehtimol?” Asosiy kuzatuv: haqiqiy harakatda ikki nuqta
orasidagi yo‘l bo‘yicha masofa va to‘g‘ri chiziq masofasi deyarli
teng. Agar r1 dan r2 ga yo‘l bo‘yicha 800 m bo‘lsa-yu, nuqtalar
orasi 60 m bo‘lsa — bu o‘tish deyarli imkonsiz:
d = | yo'l_masofasi(r1 -> r2) - to'g'ri_chiziq(p1, p2) |
P(r2 | r1) ~ exp( -d / beta ), beta ~ bir necha metr
Keyin Viterbi algoritmi: har nuqta uchun 3–5 ta nomzod yo‘l, va dinamik dasturlash bilan eng ehtimolli ketma-ketlik tanlanadi.
nuqtalar: p1 p2 p3 p4 p5
nomzodlar: M,X M,X M,X M,X M,X (M — magistral, X — xizmat yo'li)
p3 xizmat yo'liga 5 m yaqinroq (GPS xatosi), lekin:
M -> X -> M o'tishi: yo'l bo'yicha ~400 m (burilish va qaytish),
to'g'ri chiziq ~67 m -> ehtimol ~0
M -> M -> M: yo'l bo'yicha 67 m -> ehtimol yuqori
Viterbi: M M M M M (p3 ham magistralga)
Narxi — ikki narsa. Hisob: har o‘tish ehtimoli uchun nomzodlar orasida yo‘l masofasi kerak — bu kichik Dijkstra’lar (qisqa masofada, arzon, lekin sekundiga yuz minglab nuqtada — sezilarli). Kechikish: Viterbi keyingi nuqtalarni ko‘rib, oldingi qarorni o‘zgartirishi mumkin, shuning uchun oxirgi 1–2 nuqta “aniqlanmagan” bo‘lib turadi. Jonli tezlik uchun bu 10–20 soniya kechikish — qabul qilinadi.
Yutuq: GPS izi yo'l bo'laklari ketma-ketligiga aylanadi; tezliklar to'g'ri bo'lakka yoziladi
Narxi: Hisob og'ir: har iz uchun Viterbi; kechikish — oxirgi nuqtalar keyinroq aniqlashadi
Jonli tezliklar: oqimli hisob
Map matching natijasi — “haydovchi X, 17:42:08 dan 17:42:31 gacha Y bo‘lakni 23 soniyada o‘tdi”. Bunday o‘tish kuzatuvlari bo‘lak bo‘yicha yig‘iladi va har daqiqada bo‘lakning jonli tezligi hisoblanadi.
Uchta muhim tanlov:
Mediana, o‘rtacha emas. Bitta haydovchi bo‘lak o‘rtasida to‘xtab, yo‘lovchi kutsa, u bo‘lakni 3 daqiqada “o‘tadi” — o‘rtacha qiymatni buzadi. Mediana (yoki kesilgan o‘rtacha) bunday chiqib ketishlarga chidamli.
Yo‘lovchi bilan va bo‘sh haydovchi farqi. Bo‘sh haydovchi ko‘pincha sekin yuradi (keyingi buyurtmani kutib) — uning tezligi yo‘l holatini kam ko‘rsatadi. Shuning uchun kuzatuvlarga holat belgisi qo‘shiladi va ularning og‘irligi har xil.
Oynaning uzunligi. Qisqa oyna (2 daqiqa) — tez reaksiya, lekin shovqinli. Uzun oyna (15 daqiqa) — barqaror, lekin avariyani kech ko‘radi.
Hisob ko‘rsatadiki, bitta oyna uzunligi hamma bo‘lak uchun to‘g‘ri kelmaydi. Katta ko‘chalarda qisqa oyna, kichik ko‘chalarda — tarixiy qiymat. Bu ikkisini birlashtirish — keyingi qadam.
Yutuq: Bugungi avariya, yomg'ir, konsert 1-2 daqiqada ETA ga yetadi
Narxi: Oqim quvuri, holatli hisob; siyrak bo'laklarda ma'lumot yo'q
Tarixiy profillar va jonli ma'lumot bilan aralashtirish
Har bo‘lak uchun haftalik profil: haftaning har 15 daqiqalik oralig‘i uchun (7 × 96 = 672 oraliq) o‘tgan haftalardagi mediana tezlik. Seshanba 08:15 dagi magistral tezligi — o‘tgan 8 ta seshanba 08:15 laridagi qiymatlar medianasi.
Jonli va tarixiy qiymatni birlashtirishning oddiy va kuchli usuli —
psevdo-kuzatuvlar bilan o‘rtacha. Tarixiy qiymat k ta “xayoliy”
kuzatuv kabi hisoblanadi:
v = (n x v_jonli + k x v_tarixiy) / (n + k)
Formula Bayes nuqtai nazaridan tabiiy: tarixiy qiymat — oldindan ishonch (prior), jonli kuzatuvlar — dalil. Kuzatuvlar qancha ko‘p bo‘lsa, prior shuncha kam ta’sir qiladi. Bu Reddit darsidagi “kam ovozli postni qanday baholash” (Wilson oralig‘i) g‘oyasining boshqa ko‘rinishi: kam ma’lumotda ishonchli bahoga tortilish.
Bayram kunlari alohida: 31-dekabr kechasi seshanba bo‘lsa ham, oddiy seshanba profili yaramaydi. Bunday kunlar uchun alohida profillar (o‘tgan yilgi shu kun) yoki ML modelidagi “bayram” belgisi ishlatiladi.
Yutuq: Har bo'lak, har soat uchun ishonchli og'irlik — hatto jonli kuzatuv bo'lmasa ham
Narxi: Profillar ombori; aralashtirish koeffitsientini sozlash; bayram va g'ayrioddiy kunlar
Vaqtga bog'liq marshrut
40 daqiqalik safar soat 17:00 da boshlanadi. Oxirgi bo‘laklarga mashina 17:35 da yetadi — tirbandlik o‘sha paytgacha kuchayadi. Hozirgi paytdagi tezliklarning “surati” bilan hisoblash uzun safarlarni muntazam kam ko‘rsatadi.
Vaqtga bog‘liq Dijkstra: har bo‘lakning og‘irligi — unga kirish
vaqtining funksiyasi w(e, t). Qidiruvda tugun masofasi o‘rniga
“yetib kelish vaqti” saqlanadi, va har qirrada t + w(e, t)
hisoblanadi. Algoritm deyarli o‘zgarmaydi, bitta shart bilan — FIFO:
kechroq kirgan mashina ertaroq chiqmasligi kerak (bo‘lakka 17:00 da
kirgan 17:05 da chiqsa, 17:01 da kirgan 17:04 da chiqa olmaydi). Real
tezlik profillari buni odatda qanoatlantiradi; profil sakrashlari silliqlanadi.
Oxirgi qator muhim tamoyil: jonli ma’lumotning ta’siri ufq bilan
so‘nadi. Hozirgi paytdan 5 daqiqa keyin yetib boriladigan bo‘lak uchun
jonli tezlik deyarli to‘liq ishonchli; 30 daqiqa keyingisi uchun —
asosan tarixiy profil. Amalda 8-qadamdagi k koeffitsienti ufqqa
qarab oshiriladi.
Yutuq: Uzun safarlarda: yo'lga chiqqan paytdagi emas, bo'lakka yetib borgan paytdagi tezlik
Narxi: Qidiruv murakkabroq; jonli ma'lumot uzoq kelajak uchun ishonchsiz
ML: marshrut xatosini bashorat qilish
6–9-qadamlardan keyin marshrut ETA’si ancha yaxshi, lekin 4.5-dagi xatolar qoladi: ular grafda yo‘q. Ularni qo‘lda modellashtirish imkonsiz — har shahar, har aeroport, har savdo markazi o‘zgacha. Lekin har kuni millionlab safarning haqiqiy davomiyligi ma’lum. Bu — ML uchun ideal masala.
Muhim tanlov: model ETA’ni noldan bashorat qilmaydi. U marshrut ETA’sining xatosini (qoldiq, residual) bashorat qiladi:
yakuniy_ETA = marshrut_ETA + model(belgilar)
nishon (o'qitishda) = haqiqiy_vaqt - marshrut_ETA
| Belgi guruhi | Misollar |
|---|---|
| Marshrut | Marshrut ETA, masofa, burilishlar soni, magistral ulushi |
| Vaqt | Soat, hafta kuni, bayram, oy |
| Joy | Boshlanish va manzil kataklari (H3), shahar, aeroport belgisi |
| So‘rov turi | Kelish yoki safar ETA, mahsulot (oddiy, katta mashina), yetkazib berish |
| Jonli holat | Hududdagi joriy tezliklar, talab va taklif nisbati |
| Tashqi | Ob-havo (yomg‘ir), yirik tadbirlar |
Uber ko‘p yillar davomida bu qoldiqni gradient boosting daraxtlari (XGBoost) ansambli bilan bashorat qilgan. Daraxtlar jadval ko‘rinishidagi belgilarda kuchli, tez o‘qitiladi va talqin qilish oson.
Nega noldan emas, qoldiq? Uchta sabab. Fizika bepul keladi: marshrut ETA’si masofa, tezlik va yo‘l tuzilmasini allaqachon hisobga olgan — model buni qaytadan o‘rganishi shart emas. Kam ma’lumotli joylarda xavfsiz: yangi shaharda model hali yomon bo‘lsa, qoldiq kichik, va yakuniy ETA marshrut ETA’siga yaqin qoladi. Zaxira: model ishlamasa, marshrut ETA’si o‘zi ham mantiqli javob (10-bo‘lim).
Yutuq: Grafda yo'q narsalar — svetoforlar, burilishlar, mijozni topish, shahar odatlari — o'tgan safarlardan o'rganiladi
Narxi: Belgilar quvuri, qayta o'qitish, o'qitish va xizmat orasidagi nomuvofiqlik xavfi
DeepETA: neyron tarmoq qoldiqni bashorat qiladi
Daraxtlar ansambli yillar davomida o‘sdi: ko‘proq shahar, ko‘proq belgi, ko‘proq so‘rov turi — va ko‘proq daraxt. Bir nuqtada kattaroq ansambl aniqlikni deyarli oshirmay qo‘ydi. 2022-yilda Uber muhandislik blogida DeepETA tasvirlandi: xuddi shu vazifa (marshrut ETA’sining qoldig‘i), lekin neyron tarmoq bilan.
▸Chuqurroq: DeepETA ichida: belgilar — tokenlar
Blogdagi tavsifga ko‘ra, jamoa bir nechta arxitekturani solishtirgan (oddiy MLP, jadval ma’lumotlari uchun maxsus tarmoqlar, mutaxassislar aralashmasi, transformer) va o‘z-o‘ziga e’tibor (self-attention) asosidagi kodlovchi-dekodlovchi tuzilmani tanlagan. Asosiy g‘oyalar:
1. Har belgi — token. ChatGPT darsida so‘zlar token bo‘lgan edi; bu yerda har bir belgi (soat, masofa, boshlanish katagi, mahsulot turi) alohida vektor. Self-attention belgilar orasidagi o‘zaro ta’sirni o‘rganadi: “aeroport” × “soat 7:00” × “yomg‘ir” — bu uchlikni qo‘lda yozish shart emas.
2. Uzluksiz belgilar diskretlanadi. Masofa yoki soat kabi sonlar kvantillar bo‘yicha oraliqlarga bo‘linadi va har oraliq o‘z embeddingiga ega bo‘ladi. Bu model uchun chiziqsiz bog‘liqliklarni o‘rganishni osonlashtiradi.
3. Geo belgilar — bir necha o‘lchamdagi to‘r. Boshlanish va manzil koordinatalari bir nechta o‘lchamdagi geo-kataklarga aylanadi (yirik — shahar qismi, mayda — ko‘cha), va har katak xeshlanib embedding jadvalidan vektor oladi. Mayda katak aniq joyni, yirik katak kam ma’lumotli joyda umumlashtirishni beradi.
4. Chiziqli e’tibor. Oddiy self-attention tokenlar soniga nisbatan kvadratik. Kechikish byudjetini ushlab turish uchun chiziqli (linear) transformer varianti ishlatilgan.
5. Dekodlovchida so‘rov turi bo‘yicha tuzatish. Kelish ETA’si, safar ETA’si, yetkazib berish — xatolar taqsimoti har xil. Dekodlovchi har tur uchun alohida siljish va masshtab tuzatishini qo‘llaydi — bitta model, lekin har turga moslangan chiqish.
6. Asimmetrik yo‘qotish funksiyasi. Huber yo‘qotishi (kichik xatoda kvadratik, katta xatoda chiziqli — chiqib ketishlarga chidamli) ning asimmetrik varianti: kechikishni bashorat qilmaslik va ertaroq kelishni bashorat qilmaslik turlicha jazolanadi. Bu biznes qarori — 16-bo‘limda batafsil.
Bu tafsilotlar ETA’dan tashqarida ham qimmatli: jadval ma’lumotlarida transformer ishlatishning amaliy retsepti — tokenlashtirish, diskretlash, xeshlangan embeddinglar va qat’iy kechikish byudjeti.
Yutuq: Bitta global model, ko'proq belgilar, yuqori aniqlik; yangi so'rov turlari oson qo'shiladi
Narxi: Kechikish byudjeti qat'iy: sekundiga yuz minglab so'rov, har biri millisekundlarda
H3 kataklari va dispetcherlik
Dispetcherlikning birinchi savoli: “mijoz atrofida qaysi haydovchilar bor?” Buning uchun Uber 2018-yilda ochiq kodga chiqargan H3 — olti burchakli ierarxik geo-indeks ishlatiladi. Yer shari 16 darajada olti burchaklarga bo‘linadi (0-daraja — 122 ta katta katak, har keyingi daraja taxminan 7 barobar mayda).
Nega olti burchak? Kvadrat to‘rda qo‘shnilar ikki xil: tomon bo‘yicha (masofa 1) va burchak bo‘yicha (masofa 1.41). Olti burchakda hamma 6 qo‘shni markazdan bir xil masofada — “atrofdagi halqa” haqiqatan doiraga yaqin. Bu harakat, talab va narx kabi hodisalarni modellashtirishda buzilishlarni kamaytiradi.
Ikkinchi savol: “qaysi haydovchini qaysi mijozga?” Eng oddiy — ochko‘z (greedy): har yangi so‘rovga hozirgi eng yaqin haydovchi. Muammo: ikki mijoz bir vaqtda kelsa, birinchisiga ikkinchisi uchun ideal bo‘lgan haydovchi ketishi mumkin. Uber o‘z chiqishlarida tasvirlagan yondashuv — to‘plamli moslash: bir necha soniya ichidagi so‘rovlar yig‘iladi va “umumiy kutish vaqti minimal” bo‘ladigan tayinlash global hal qilinadi.
Bu qadam ETA’ning dispetcherlikdagi rolini to‘liq ochadi: ETA — bitta raqam emas, matritsa, va uni tez hisoblash algoritmik muammo. Xuddi shu matritsa Uber Pool (umumiy safar) kabi murakkab mahsulotlarda — kimni qaysi tartibda olib ketish — yanada katta bo‘ladi.
Yutuq: Yaqin haydovchilar mikrosekundlarda; talab va taklif kataklarda; ETA'lar to'plamda
Narxi: Katak o'lchamini tanlash; kataklar chegarasidagi effektlar
Oxirgi yuz metr: olib ketish joylari
4.5-bo‘limdagi hisob: kelish ETA’si xatosining katta qismi oxirgi 200 metrda. Yechim — mijoz xaritada bosgan nuqtani emas, haqiqatan to‘xtash mumkin bo‘lgan joyni manzil qilish.
O‘tgan safarlar bu joylarni ko‘rsatadi: katta bino atrofida minglab safar qayerda haqiqatan boshlangan? Bu nuqtalar klasterlanadi va “tavsiya etilgan olib ketish joylari” paydo bo‘ladi: “A kirish, Navoiy ko‘chasi tomondan”. Mijozga shu nuqtagacha piyoda yo‘l ko‘rsatiladi, haydovchiga esa marshrut to‘g‘ridan-to‘g‘ri shu nuqtaga, ko‘chaning to‘g‘ri tomoniga.
Bu qadam texnik jihatdan oddiy (klasterlash), lekin ta’siri 4-qadamdagi murakkab algoritmdan kam emas. Bu ETA tizimlarining umumiy saboqi: xatoni qayerdan kelishiga qarab yo‘q qiling, eng qiziqarli algoritmga qarab emas.
Yutuq: Safar boshi va oxiridagi eng katta xato manbai kamayadi; haydovchi va mijoz bir joyga keladi
Narxi: Har joy uchun ma'lumot; yangi binolarda yana xato
Uber Eats: tarkibiy ETA
Ovqat yetkazib berishda ETA bitta marshrut emas, zanjir:
ETA = max( tayyorlash_vaqti, kuryer -> restoran )
+ restoranda kutish va topshirish
+ restoran -> mijoz (safar ETA si)
+ binoga kirish va eshikkacha
Yangi noaniqlik — tayyorlash vaqti. Uni hech qaysi graf bermaydi: restoran, taom, buyurtma hajmi, soat va hozirgi bandlik (bir vaqtda nechta buyurtma) bo‘yicha ML modeli bashorat qiladi. Va bu bashorat ikki joyda ishlatiladi: mijozga ko‘rsatiladigan vaqt va kuryerni qachon yuborish.
Bu qadam ETA’ni qaror parametri sifatida ko‘rsatadi: kuryerni yuborish paytini tanlash — bashorat xatosi taqsimotidan kelib chiqadigan optimallashtirish. 16-bo‘limdagi asimmetrik xato narxi g‘oyasi shu yerda eng aniq ko‘rinadi: taom sovishi va kuryer kutishi turli narxga ega.
Yutuq: Yetkazib berish vaqti — bir nechta bashoratning to'g'ri birikmasi; kuryer ovqat tayyor bo'lganda keladi
Narxi: Restoran tayyorlash vaqti — eng noaniq qism va Uber nazoratida emas
Nazorat savoli · javobni ko‘rishNega ML modeli ETA ni noldan emas, marshrut ETA sining xatosini bashorat qiladi? Neyron tarmoq hamma narsani o'zi o'rganishi mumkin-ku.
Mumkin, lekin uchta sababga ko‘ra yomonroq.
Ma’lumot samaradorligi. Marshrut ETA’si masofa, yo‘l turi, tezlik va tirbandlikning “fizikasini” allaqachon hisoblagan. Noldan o‘rgatilgan model shu fizikani millionlab misoldan qaytadan o‘rganishi kerak — va kam ma’lumotli joylarda (yangi shahar, kam uchraydigan marshrut) buni yomon qiladi. Qoldiq modeli esa faqat “marshrut qayerda xato qiladi” ni o‘rganadi — bu ancha kichik va oddiy vazifa.
Tashqi o‘zgarishlarga reaksiya. Bugun ko‘prik yopildi. Marshrutlash buni darhol biladi (jonli og‘irliklar, 7-qadam) va aylanma yo‘lni hisoblaydi. Noldan o‘rgatilgan model esa “bu ikki nuqta orasi odatda 15 daqiqa” degan xotirasiga tayanadi va yopilishni faqat qayta o‘qitilgandan keyin biladi.
Zaxira va xavfsizlik. Model ishlamasa yoki g‘alati javob bersa, marshrut ETA’si yaxshi zaxira. Qoldiq kichik bo‘lgani uchun modelning chiqishini cheklash ham oson (“tuzatish ±50% dan oshmasin”).
Umumiy tamoyil: ma’lum fizikani ML ga qayta o‘rgatmang — ML ga faqat noma’lum qismni bering. Bu gibrid yondashuv ETA’dan tashqarida ham keng tarqalgan.
6. Marshrutlash: ierarxiya ichida
5-bo‘limda Contraction Hierarchies natijasi berildi. Bu bo‘limda uning ichiga kiramiz: tugunlar qanday tartiblanadi, yorliqlar qachon kerak va nega qidiruv faqat “yuqoriga” yurib, baribir to‘g‘ri javob topadi.
6.1 Qisqartirish: bitta tugunni olib tashlash
Tugun v ni qisqartirishda uning har bir kiruvchi qo‘shnisi u va har
bir chiquvchi qo‘shnisi w juftligini ko‘ramiz. Agar u → v → w yo‘li
u dan w ga yagona eng qisqa yo‘l bo‘lsa, v ni olib tashlaganda
bu yo‘l yo‘qoladi — shuning uchun yorliq u → w qo‘shiladi. Agar v
siz ham shunday yoki qisqaroq yo‘l bo‘lsa (“guvoh yo‘l”, witness path),
yorliq kerak emas.
Oldin: u --3--> v --4--> w u --9--> w (to'g'ridan)
v qisqartirildi: u --7--> w (yorliq, chunki 7 < 9 va boshqa yo'l yo'q)
Oldin: u --3--> v --4--> w u --5--> x --1--> w
v qisqartirildi: yorliq yo'q — guvoh yo'l u-x-w = 6 < 7
Guvoh yo‘lni izlash — u dan kichik, cheklangan Dijkstra (v ni
chetlab). Cheklov muhim: agar izlashni erta to‘xtatsak, guvoh topilmay,
ortiqcha yorliq qo‘shiladi — bu xato emas (javob baribir to‘g‘ri),
faqat graf kattalashadi.
6.2 Tartib: kimni birinchi qisqartirish
Tartib sifati hamma narsani belgilaydi. Asosiy evristika — qirralar farqi (edge difference): tugunni qisqartirish qancha yorliq qo‘shadi, minus qancha qirra olib tashlaydi. Kam “zarar” beradigan tugunlar birinchi.
Qiziq kuzatuv: ierarxiya yo‘l turlarini bilmasdan ularni qayta kashf qiladi. Magistral tepada, chunki uni olib tashlash ko‘p yorliq talab qiladi — ko‘p eng qisqa yo‘llar undan o‘tadi. Bu “muhimlik”ning eng aniq ta’rifi: qancha eng qisqa yo‘l shu tugundan o‘tadi.
▸Chuqurroq: Nega faqat yuqoriga qidirish to'g'ri javob beradi
Tasdiq: har qanday s dan t ga eng qisqa yo‘l, yorliqlar qo‘shilgan
grafda, avval yuqoriga, keyin pastga ko‘tariladigan yo‘lga ega (daraja
bo‘yicha “tog‘” shakli).
Nega? Eng qisqa yo‘ldagi eng past darajali ichki tugunni olaylik —
aytaylik v, qo‘shnilari u va w. v qisqartirilganda u va w hali
grafda edi (ular darajasi yuqoriroq). u → v → w eng qisqa yo‘l bo‘lgani
uchun, yoki yorliq u → w qo‘shilgan, yoki teng uzunlikdagi guvoh yo‘l
bor. Ikkala holda ham v ni yo‘ldan olib tashlab, uzunligi o‘zgarmagan
yo‘l olamiz. Bu jarayonni takrorlasak, yo‘lda “pastki cho‘qqi” qolmaydi —
ya’ni yo‘l avval ko‘tariladi, bitta eng yuqori nuqtaga yetadi va tushadi.
Qidiruv shuni ishlatadi:
Oldinga qidiruv s dan: faqat daraja(v) > daraja(u) bo'lgan qirralar
Orqaga qidiruv t dan (teskari qirralar): xuddi shunday, faqat yuqoriga
Javob: min over v ( d_oldinga(v) + d_orqaga(v) )
Ikki qidiruv ham kichik, chunki “yuqoriga” yo‘llar tez tugaydi — tepada tugunlar kam. Shu sababli kontinental grafda ham bir necha yuz tugun ko‘riladi.
Yo‘lni tiklash uchun esa yorliqlarni “ochish” kerak: har yorliq qaysi ikki qirradan tuzilganini eslab qoladi, va rekursiv ochish haqiqiy bo‘laklar ketma-ketligini beradi — bu xaritada chiziladigan va narx uchun masofa yig‘iladigan yo‘l.
6.3 Muqobil marshrutlar
Haydovchi ilovasi ko‘pincha bitta emas, 2–3 marshrut ko‘rsatadi: “eng tez”, “pullik yo‘lsiz”, “biroz uzoq, lekin barqaror”. Eng tez yo‘lni topish oson; yaxshi muqobil topish qiyinroq. Oddiy yondashuv (“eng tez yo‘lni taqiqlab, qayta qidirish”) deyarli bir xil yo‘lni beradi — bitta bo‘lak farq bilan.
Yaxshi muqobil uchta mezonga javob beradi: asosiy yo‘l bilan kam umumiy qism (masalan, 50% dan kam), vaqti ko‘p farq qilmaydi (masalan, 20% dan uzun emas), va mahalliy mantiqiy — kichik aylanmalar yo‘q (“magistraldan chiqib, 200 m yurib, qaytib kirish” kabi). Ikki tomonlama qidiruvdagi “uchrashuv nuqtalari” (via-node) nomzodlari orasidan shu mezonlarga mos keladiganlar tanlanadi.
Nazorat savoli · javobni ko‘rishCH qidiruvi mikrosekundlarda ishlaydi. Nega unda jonli tirbandlik uchun uni to'g'ridan-to'g'ri ishlatib bo'lmaydi?
Chunki yorliqlar og‘irliklardan qurilgan va og‘irlik o‘zgarsa, ular noto‘g‘ri bo‘ladi.
Yorliq u → w (og‘irligi 7) “u dan w ga eng qisqa yo‘l v orqali
va u 7 soniya” degan faktni saqlaydi. Agar v atrofida tirbandlik
boshlansa, haqiqiy vaqt 20 bo‘ladi va, ehtimol, endi boshqa yo‘l eng
qisqasi. Yorliqni yangilash yetmaydi: tartib ham (qaysi tugun
muhimroq) va guvoh yo‘llar ham o‘zgaradi. To‘liq qayta qurish —
daqiqalar, tirbandlik esa har daqiqada o‘zgaradi.
Bundan chiqish yo‘li 5-qadamda: tugunlar tartibini og‘irlikka bog‘liqmas qilib (grafning geometrik tuzilmasidan, masalan, bo‘laklarga bo‘lish orqali) tanlash va yorliqlar to‘plamini oldindan belgilash. Shunda og‘irlik o‘zgarganda faqat sonlarni qayta hisoblash kerak — tuzilma o‘zgarmaydi. Bu CCH va CRP ning asosiy g‘oyasi: qidiruv biroz sekinroq (tartib optimal emas), lekin yangilanish soniyalarda.
Umumiy saboq: oldindan hisoblangan narsa qaysi ma’lumotga bog‘liq ekanini aniq biling. Agar u tez o‘zgaradigan ma’lumotga bog‘liq bo‘lsa, uni sekin va tez qismlarga bo‘ling.
7. Tirbandlik: GPS nuqtasidan tezlikkacha
7.1 Nimani o‘lchaymiz
GPS nuqtasida “tezlik” maydoni ham bor (telefon o‘zi hisoblaydi). Uni to‘g‘ridan-to‘g‘ri ishlatish jozibali, lekin bu lahzalik tezlik: svetoforda 0, keyin 50. Marshrutlash uchun kerak bo‘lgan narsa boshqa — bo‘lakni o‘tish vaqti, svetofor kutishini ham o‘z ichiga olgan.
Shu sababli 5-bo‘lim 6–7-qadamlaridagi quvur nuqtalarni emas, bo‘lak o‘tishlarini yig‘adi. Map matching bu yerda faqat “qaysi yo‘l” emas, “qaysi paytda kirdi va chiqdi” savoliga ham javob beradi (ikki nuqta orasidagi vaqt yo‘l uzunligi bo‘yicha taqsimlanadi).
7.2 Avariyani aniqlash
Jonli tezlik sekin o‘zgarsa — oddiy tirbandlik. Keskin tushsa — ehtimol avariya yoki yo‘l yopilishi. Ularni farqlash muhim: avariya bo‘lakni deyarli yopadi va marshrutlash undan butunlay qochishi kerak.
▸Chuqurroq: Tirbandlik orqaga tarqaladi: to'lqin modeli
Avariya bo‘lagi yopilganda, tirbandlik uning oldidagi bo‘laklarga orqaga tarqaladi — mashinalar navbati uzayadi. Bu tarqalish tezligi transport oqimi nazariyasida (Lighthill–Whitham–Richards modeli, 1955) hisoblanadi:
Navbat chegarasining orqaga harakat tezligi:
w = (q_kelish - q_ketish) / (k_navbat - k_kelish)
q — oqim (mashina/soat), k — zichlik (mashina/km)
Magistral: kelish oqimi 3 000 mash/soat, zichlik 30 mash/km
avariyadan keyin o'tkazuvchanlik 1 000 mash/soat, navbat zichligi 150 mash/km
w = (3 000 - 1 000) / (150 - 30) = ~17 km/soat
-> 10 daqiqada navbat ~2.8 km orqaga cho'ziladi
Bu ETA uchun nimani anglatadi? Haydovchi avariyadan 3 km orqada, hozir bemalol ketmoqda. Jonli ma’lumot uning bo‘lagini “bo‘sh” deydi. Lekin 10 daqiqadan keyin u yerga yetganda, navbat allaqachon uning oldida bo‘ladi. 9-qadamdagi vaqtga bog‘liq marshrut buni hisobga olishi uchun “kelajakdagi tezlik” kerak — va uni oddiy profil bermaydi.
Ishlab chiqarish tizimlari bunday fizik modellarni kamdan-kam aniq hisoblaydi (parametrlar noma’lum), lekin g‘oya ML belgilariga kiradi: “N km oldinda g‘ayrioddiy sekinlashuv bor” — model tarixiy o‘xshash holatlardan navbat qancha o‘sishini o‘rganadi.
7.3 Kam ma’lumot va tunda
Tun soat 3 da shaharda haydovchilar kam — jonli kuzatuvlar deyarli yo‘q. 8-qadamdagi aralashtirish avtomatik ravishda tarixiy profilga o‘tadi. Lekin tarixiy profil ham tunda kam kuzatuvdan qurilgan — ishonchsiz. Bu yerda yana bir qatlam yordam beradi: ierarxik zaxira.
Bo'lak, shu 15 daqiqalik oraliq (kuzatuvlar yetarli bo'lsa)
-> bo'lak, shu soat (4 ta oraliq birlashtirilgan)
-> bo'lak, "tun" guruhi
-> yo'l turi + shahar bo'yicha o'rtacha (masalan, "tunda magistral")
-> tezlik chegarasi x koeffitsient
Har bosqichda kuzatuvlar soni tekshiriladi. Bu Airbnb darsidagi narx tavsiyasi va Reddit’dagi yangi post reytingi bilan bir xil g‘oya: kam ma’lumotda umumiyroq guruhga tayanish.
Nazorat savoli · javobni ko‘rishNega jonli tezlik uchun bo'lak o'tish vaqti ishlatiladi, telefon GPS'i bergan lahzalik tezlik emas?
Chunki marshrut ETA’siga kerak bo‘lgan narsa — bo‘lakni butunlay o‘tish vaqti, svetofor va chorrahada kutish bilan birga.
Lahzalik tezlik svetoforda 0, ko‘k chiroqda 50 — ularning o‘rtachasi qaysi paytlarda nuqta olinganiga bog‘liq, ya’ni tasodifiy. Nuqtalar siyrak bo‘lsa (batareya tejash uchun har 15 soniya), kutish paytlari “tushib qolishi” mumkin va bo‘lak ancha tez ko‘rinadi (7.1-dagi hisob: +55%). Bu xato tizimli: kutishni o‘tkazib yuborish ehtimoli har doim tezlikni oshiradi, kamaytirmaydi.
O‘tish vaqti esa map matching orqali bo‘lakka kirish va chiqish lahzalaridan olinadi va kutishni avtomatik o‘z ichiga oladi — nuqtalar qanchalik siyrak bo‘lmasin. Nuqtalar siyrak bo‘lganda kirish va chiqish vaqtlari interpolyatsiya qilinadi; bu xato tasodifiy (ikki tomonga), shuning uchun ko‘p kuzatuvda o‘rtachalanib ketadi.
Qoida: o‘lchov marshrutlash nimani qo‘shayotganiga mos bo‘lsin. Marshrutlash bo‘lak vaqtlarini qo‘shadi — demak, bo‘lak vaqtlarini o‘lchang.
8. ML qatlami: ma’lumot, baholash va xizmat
8.1 “Haqiqiy vaqt” nima?
ML modeli haqiqiy vaqtdan o‘rganadi. Lekin safarning “haqiqiy” davomiyligi qaysi lahzadan qaysi lahzagacha? Bu savol ko‘rinishidan oddiy, lekin nishon (label) ta’rifi modelning nimani o‘rganishini to‘liq belgilaydi.
| ETA turi | Boshlanish | Tugash | Tuzoq |
|---|---|---|---|
| Kelish (pickup) | Haydovchi buyurtmani qabul qildi | Haydovchi “yetib keldim” bosdi | Ba’zi haydovchilar “keldim” ni erta bosadi |
| Safar | Haydovchi “safarni boshlash” bosdi | “Safarni tugatish” bosdi | Tugatish ba’zan yo‘lovchi tushgandan keyin kechikadi |
| Yetkazib berish | Buyurtma berildi | Kuryer “topshirildi” bosdi | Eshikkacha piyoda qism turlicha |
Birinchi qatordagi tuzoq qiziq: agar haydovchilar “yetib keldim” tugmasini 100 metr oldin bossa (mijoz tezroq chiqishi uchun), haqiqiy nishonlar muntazam qisqa bo‘ladi va model ETA’ni kam ko‘rsatishni o‘rganadi. Yechim — nishonni tugmadan emas, GPS izidan olish: mashina olib ketish joyiga 30 metr yaqinlashib, to‘xtagan lahza.
8.2 O‘qitish va xizmat bir xil ko‘rishi kerak
Eng xavfli xato — o‘qitish va xizmat nomuvofiqligi (training-serving skew). Misol: o‘qitishda “hududdagi joriy o‘rtacha tezlik” belgisi kun oxirida, to‘liq ma’lumot bilan hisoblangan; xizmatda esa u real vaqtda, 2 daqiqa kechikish bilan keladi. Model o‘qitishda “kelajakni ko‘rgan” belgiga o‘rgangan, xizmatda esa u yo‘q.
8.3 Baholash: bitta raqam yetmaydi
Oxirgi qatorda MAPE (foizli xato) — lekin faqat qisqa safarlarda ehtiyotkorlik bilan: 1 daqiqalik ETA da 1 daqiqa xato — 100%, 60 daqiqalik ETA da — 1.7%. Foizli ko‘rsatkich qisqa safarlarni haddan ortiq jazolaydi, mutlaq ko‘rsatkich esa uzun safarlarni. Shuning uchun baholash segmentlar bo‘yicha: kelish va safar alohida, shahar bo‘yicha, masofa guruhlari bo‘yicha, aeroport va oddiy joylar alohida.
- Jadval belgilarida kuchli, tez o'qitiladi
- Talqin qilish oson (belgi muhimligi)
- Kategoriyalar ko'p bo'lsa (kataklar) — qiyin
- Ansambl o'sgan sari foyda kamayadi
- CPU da tez, kechikish barqaror
- Embedding'lar: millionlab katakni o'rganadi
- Belgilar o'zaro ta'sirini attention o'zi topadi
- Bitta global model — shaharlar ma'lumoti bo'lishiladi
- Kechikishni ushlab turish uchun arxitektura cheklovi
- Talqin qilish qiyinroq, o'qitish qimmatroq
8.4 Onlayn tajriba: ETA hamma narsaga ta’sir qiladi
Yangi ETA modelini qanday sinash kerak? Oddiy A/B test: foydalanuvchilarning yarmi yangi model, yarmi eski. Lekin ETA oddiy xususiyat emas.
▸Chuqurroq: Nega ETA uchun A/B test qiyin: tarmoq ta'siri
ETA dispetcherlikka kiradi. Agar A guruhdagi mijozlar uchun yangi model ETA’ni aniqroq hisoblasa, dispetcherlik A guruhga yaxshiroq haydovchilarni tayinlaydi — va B guruhga qolgan haydovchilar yomonroq bo‘ladi. B guruh natijalari eski model tufayli emas, A guruh tufayli yomonlashadi. Tajriba ikki guruh orasidagi farqni oshirib ko‘rsatadi — bu “ifloslanish” (interference), chunki guruhlar umumiy resursni (haydovchilar) bo‘lishadi.
Bunday tizimlarda ishlatiladigan usullar:
1. Vaqt bo'yicha almashtirish (switchback):
butun shahar 30 daqiqa yangi model, 30 daqiqa eski, tasodifiy tartibda
+ ifloslanish yo'q (bir vaqtda faqat bitta model)
- soatlar orasidagi farqlar shovqin qo'shadi -> ko'p hafta kerak
2. Geografik bo'lish:
bir tuman — yangi, boshqasi — eski
- tumanlar har xil; chegarada ifloslanish
3. Soya rejimi (shadow):
yangi model hisoblaydi, lekin natijasi ishlatilmaydi — faqat yoziladi
+ xavfsiz: bashorat aniqligini haqiqat bilan solishtirish mumkin
- dispetcherlikka ta'sirini ko'rsatmaydi
Amaliy ketma-ketlik: avval oflayn baholash, keyin soya rejimi (bashorat aniqligi — ishlab chiqarish ma’lumotida), keyin switchback tajriba (biznes ko‘rsatkichlari: kutish, bekor qilishlar, haydovchi bo‘sh yurishi). Faqat shundan keyin to‘liq ishga tushirish.
Bu saboq Uber’dan tashqarida ham muhim: ikki tomonlama bozorlarda (Airbnb, yetkazib berish, reklama auksionlari) foydalanuvchilarni tasodifiy bo‘lish har doim ham mustaqil guruhlar bermaydi.
Nazorat savoli · javobni ko‘rishOflayn baholashda yangi model MAE ni 15% kamaytirdi. Nega bu hali ishga tushirish uchun yetarli emas?
Chunki oflayn MAE uchta narsani ko‘rsatmaydi.
Sizib kirish va nomuvofiqlik. Oflayn to‘plamdagi belgilar xizmatdagi belgilardan boshqacha hisoblangan bo‘lishi mumkin (8.2). Soya rejimi — yangi model ishlab chiqarishdagi haqiqiy belgilar bilan ishlab, bashoratlari haqiqat bilan solishtirilganda — buni birinchi bo‘lib ko‘rsatadi.
Segmentlar. O‘rtacha 15% yaxshilanish ba’zi segmentlarda yomonlashishni yashirishi mumkin: masalan, aeroportlarda 10% yomonroq, lekin ular safarlarning atigi 3% i. Aeroport safarlari esa eng qimmat va eng ko‘p shikoyat keladigan segment. Baholash segmentlar bo‘yicha bo‘lishi kerak (8.3).
Qarorlarga ta’sir. ETA dispetcherlik va narxga kiradi. Aniqroq ETA dispetcherlikni boshqa haydovchilarni tanlashga majbur qiladi — va bu kutish vaqti, bo‘sh yurish, bekor qilishlarni o‘zgartiradi. Bu ta’sir faqat onlayn tajribada (switchback, 8.4 Deep) ko‘rinadi. Ba’zan aniqroq model biznes ko‘rsatkichlarini yomonlashtiradi: masalan, u uzoq ETA’larni to‘g‘riroq (ya’ni uzunroq) ko‘rsatadi va mijozlar ko‘proq bekor qiladi — garchi bu halolroq bo‘lsa ham.
Qoida: model sifati — zarur, lekin yetarli shart emas. Qaror tizimining bir qismi bo‘lgan model qaror natijalari bilan baholanadi.
9. Bugungi arxitektura
Haydovchi ilovasi — ham iste'molchi, ham ma'lumot manbai: har ~4 s da GPS.
ETA'ni to'plamda so'raydi: bitta qarorda o'nlab-yuzlab juftlik.
Yakuniy ETA = marshrut + qoldiq; har qadamda vaqt byudjeti.
Tuzilma haftada bir, og'irliklar har daqiqada, so'rov — millisekundlar.
GPS nuqtasidan marshrut og'irligigacha ~1-2 daqiqa.
Kunlik va haftalik; natijalar yuqori qatlamlarga 'surat' sifatida yuklanadi.
Diagrammada ikki oqim bor. So‘rov oqimi yuqoridan pastga: dispetcherlik ETA servisidan so‘raydi, u marshrutlashdan va modeldan. Ma’lumot oqimi pastdan yuqoriga: haydovchi GPS’i → quvurlar → og‘irliklar → marshrut. Bir xil haydovchi ilovasi ikkala oqimning ikki uchida: u ETA so‘raydi va shu bilan birga ETA uchun ma’lumot beradi. Bu o‘z-o‘zini ta’minlovchi halqa: qancha ko‘p safar — shuncha aniq tezlik — shuncha yaxshi ETA — shuncha samarali dispetcherlik — shuncha ko‘p safar.
Tarixdagi eng muhim burilish — 2015-yil. Undan oldin xarita va marshrut tashqi provayderdan olingan “kommunal xizmat” edi. Undan keyin — asosiy mahsulotning bir qismi. Sabab 1-bo‘limdagi jadvalda: ETA dispetcherlik, narx va Eats’ning kiritmasi. Kompaniyaning asosiy iqtisodiy qarorlari boshqa birovning xaritasiga bog‘liq bo‘lishi mumkin emas edi.
10. Ishonchlilik: har doim javob bor
10.1 Zaxira zinapoyasi
1.2-bo‘limda aytilgandek, ETA yo‘q — safar yo‘q. Shuning uchun ETA servisi “yiqilmaydi”, balki sifat pasayadi: har pog‘onada kamroq aniq, lekin tezroq va ishonchliroq javob.
| Pog‘ona | Nima ishlatiladi | Qachon | Aniqlik |
|---|---|---|---|
| 1 | Marshrut + ML qoldiq | Odatiy holat | Eng yuqori |
| 2 | Faqat marshrut ETA | Model servisi sekin yoki xato | ~25–35% yomonroq (10-qadam) |
| 3 | Kataklar matritsasi (H3, tarixiy) | Marshrutlash ishlamaydi | Qo‘pol, lekin mikrosekundlar |
| 4 | To‘g‘ri chiziq × koeffitsient (v0) | Hamma narsa ishlamaydi | Qo‘pol, lekin har doim bor |
Zinapoyaning har pog‘onasi alohida sinovdan o‘tkaziladi. Zaxira yo‘lining eng katta xavfi — u yillar davomida ishlatilmaydi va kerak bo‘lganda buzilgan bo‘lib chiqadi (jadval yangilanmagan, format o‘zgargan). Himoya: har kuni kichik ulush so‘rovlar ataylab pastki pog‘onalar orqali o‘tkaziladi va ularning aniqligi kuzatiladi.
10.2 Yomg‘irli juma kechqurun
Bu kun tizimning barcha qismlarini birga sinaydi: jonli quvurning tezligi, tarixiy va jonli ma’lumotni aralashtirish, ML’dagi tashqi belgilar, avariyani aniqlash va servislarning kengayishi. Eng muhim kuzatuv — 18:10 qatori: bunday kunda ETA katta bo‘ladi, va tizimning vazifasi uni kichik ko‘rsatish emas, to‘g‘ri ko‘rsatish. Kam ko‘rsatilgan ETA mijozni kutishga undaydi va keyin bekor qilishga — bu ham mijozni, ham haydovchini yo‘qotadi.
▸Chuqurroq: Narx va ETA izchilligi: bitta hisob, bitta javob
Mijoz ekranda “23 daqiqa, 45 000 so‘m” ko‘radi. Narx formulasi safar vaqti va masofasidan hisoblangan. Agar narx servisi va ekrandagi ETA alohida hisoblansa (bir necha ms farq bilan, turli servis nusxalarida, turli og‘irliklar bilan), ekranda “23 daqiqa” turadi, narx esa 27 daqiqaga hisoblangan bo‘ladi. Bu kichik farq ham shikoyat va ishonchsizlik manbai.
Yechim — taklif (quote) ob’ekti:
1. Mijoz manzilni kiritdi -> bitta hisob: marshrut, ETA, masofa, narx
2. Natija taklif sifatida saqlanadi: quote_id, muddati (masalan, 5 daqiqa)
3. Ekran ham, buyurtma ham shu quote_id ga ishora qiladi
4. "Buyurtma berish" bosilganda narx qayta hisoblanmaydi —
taklifdagi qiymat ishlatiladi (muddati o'tmagan bo'lsa)
Bu Airbnb darsidagi “kurs bron paytida qotiriladi” g‘oyasining aynan o‘zi: qaror qabul qilingan paytdagi hisob saqlanadi va keyingi qadamlar uni qayta hisoblamaydi. Qayta hisoblash har doim boshqa natija beradi — chunki tirbandlik har daqiqada o‘zgaradi.
Ikkinchi nozik jihat: safar davomida ETA yangilanadi (yo‘l holati o‘zgaradi), narx esa — yo‘q (oldindan kelishilgan). Ya’ni ETA ikki xil rolda: narx uchun — qotirilgan kiritma, ekran uchun — tirik bashorat. Ularni bir ob’ektda aralashtirmaslik kerak.
Nazorat savoli · javobni ko‘rishNega ETA servisi uchun 'xato qaytarish' yomon, 'taxminiyroq javob qaytarish' yaxshi? Noaniq ETA foydalanuvchini aldaydi-ku.
Chunki ETA’ning asosiy iste’molchisi foydalanuvchi emas, boshqa tizimlar — va ular javobsiz ishlay olmaydi.
Dispetcherlik ETA’siz haydovchini tanlay olmaydi; narx ETA’siz taklif bera olmaydi. Agar ETA servisi xato qaytarsa, bu xatolar zanjir bo‘ylab tarqaladi: dispetcherlik to‘xtaydi, narx to‘xtaydi — hech kim safar buyurtma qila olmaydi. Noaniq ETA bilan esa dispetcherlik biroz yomonroq tanlov qiladi, narx biroz noaniqroq bo‘ladi — lekin xizmat ishlaydi.
Foydalanuvchini aldash masalasi alohida hal qilinadi: zaxira pog‘onasidagi ETA ekranda oraliq sifatida ko‘rsatilishi mumkin (“5–10 daqiqa”) yoki qo‘shimcha zaxira bilan (yuqoriroq). Narx uchun esa zaxira rejimida xavfsizroq formula (masofaga ko‘proq tayanadigan) ishlatiladi.
Muhimi — zaxira holati kuzatiladi: qancha ulush so‘rov qaysi pog‘onadan javob oldi. Agar 2-pog‘ona ulushi 1% dan 20% ga sakrasa — bu hodisa, navbatchiga signal, garchi foydalanuvchilar hech narsani sezmagan bo‘lsa ham.
11. Xavfsizlik va maxfiylik
11.1 GPS’ni aldash
Haydovchi telefoni — ma’lumot manbai. Va har qanday tashqi ma’lumot manbai kabi, u qasddan buzilishi mumkin. GPS joylashuvini soxtalashtiruvchi ilovalar keng tarqalgan. Nima uchun haydovchi buni qiladi?
| Maqsad | Qanday | ETA tizimiga ta’siri |
|---|---|---|
| Aeroport navbatiga erta tushish | O‘zini aeroport hududida ko‘rsatish | Soxta haydovchi “yaqin” — dispetcherlik xato |
| Uzoq safar qilib narxni oshirish | Aylanma yo‘l, yoki soxta iz | Safar vaqti ma’lumotlari ifloslanadi |
| Yuqori talab hududiga “kirish” | Joyni surish | Talab va taklif xaritasi buziladi |
| Tezlik ma’lumotini buzish (nazariy) | Ko‘plab soxta sekin izlar | Bo‘lak “tirband” ko‘rinadi |
Tezlik agregatsiyasi uchun mediana (7-qadam) va “turli haydovchilar” sharti (7.2) tabiiy himoya beradi: bitta soxta haydovchi bo‘lak tezligini o‘zgartira olmaydi. Buning uchun ko‘plab muvofiqlashtirilgan soxta hisoblar kerak — bu firibgarlikka qarshi tizimning (Airbnb darsi, 11-bo‘lim) vazifasi.
11.2 Joylashuv — eng sezgir ma’lumot
GPS izlari — odamning qayerda yashashi, ishlashi, kim bilan uchrashishi haqidagi ma’lumot. Mijozning safarlar tarixi uning uy manzilini, ish joyini va odatlarini ochib beradi. 2014-yilda Uber ichki vositasi orqali xodimlarning mijozlar joylashuvini ko‘rishi (“God View” deb atalgan) haqidagi xabarlar katta janjalga sabab bo‘ldi va keyinchalik kirish nazoratini kuchaytirishga olib keldi.
▸Chuqurroq: ETA uchun kerak bo'lgan ma'lumot va maxfiylik chegarasi
Jonli tirbandlik uchun kim o‘tgani emas, qancha vaqtda o‘tgani kerak. Bu maxfiylik uchun kalit: ma’lumot yo‘lning boshida anonimlashtirilishi mumkin.
Xom GPS nuqtasi: haydovchi_id, safar_id, vaqt, lat, lon, ...
-> faqat map matching bosqichida, qisqa muddat
Bo'lak o'tishi: bo'lak_id, kirish_vaqti, o'tish_vaqti, holat
-> haydovchi_id yo'q; faqat "turli haydovchi" sanog'i
uchun qisqa muddatli xesh (soatlik tuz bilan)
Agregat tezlik: bo'lak_id, oraliq, mediana, n
-> hech qanday shaxsiy ma'lumot yo'q
Uch qoida:
Minimal muddat. Xom nuqtalar faqat quvur uchun kerak bo‘lgan vaqt saqlanadi; tarixiy tahlil uchun agregatlar yetarli.
Kichik guruhlarni yashirish. Agar bo‘lakdan bir soatda bitta mashina
o‘tgan bo‘lsa, “bo‘lak tezligi” aslida bitta odamning harakati. Tashqi
ma’lumot almashinuvida (masalan, shaharlar bilan ochiq tezlik ma’lumotlari)
kam kuzatuvli qiymatlar chiqarilmaydi — minimal n chegarasi.
Kirish nazorati va audit. Xom izlarga kirish — faqat aniq sabab bilan, jurnalga yoziladi. Bu texnik emas, tashkiliy himoya — lekin 2014-yilgi voqea ko‘rsatganidek, eng muhimi aynan shu.
Nazorat savoli · javobni ko‘rishMediana bitta soxta haydovchidan himoya qiladi. Qanday hujum baribir bo'lak tezligini buzishi mumkin va qanday himoya bor?
Muvofiqlashtirilgan hujum: ko‘plab soxta hisoblar (yoki ko‘plab real haydovchilar kelishib) bitta bo‘lakdan sekin o‘tganini ko‘rsatadi. Agar ular kuzatuvlarning yarmidan ko‘pini tashkil etsa, mediana ham buziladi. Motiv bo‘lishi mumkin: raqib xizmat yoki haydovchilar guruhi ma’lum yo‘lni “tirband” qilib ko‘rsatib, safarlarni boshqa yo‘lga yo‘naltirmoqchi.
Himoya qatlamlari:
Mustaqil manbalar. Bo‘lak tezligi faqat bitta turdagi kuzatuvga tayanmasin: haydovchilar yo‘lovchi bilan va bo‘sh, kuryerlar, tarixiy profil. Hujumchi hammasini birdaniga buzishi qiyin.
Tarixdan keskin og‘ish — alohida tekshiruv. 8-qadamdagi aralashtirish jonli qiymatni ko‘p kuzatuvda to‘liq qabul qiladi. Lekin agar og‘ish g‘ayrioddiy katta bo‘lsa va qo‘shni bo‘laklar odatdagidek bo‘lsa (haqiqiy avariya qo‘shnilarga tarqaladi — 7.2 Deep), bu shubhali.
Hisob ishonchi. Kuzatuvlar haydovchi hisobining yoshi va tarixiga qarab og‘irlik oladi: yangi, tekshirilmagan hisoblar kam ta’sir qiladi.
Umumiy saboq: olomondan olingan ma’lumot — ochiq kirish nuqtasi. U qanchalik ko‘p bo‘lmasin, qarshilik ko‘rsatuvchi foydalanuvchilar uchun statistik himoya kerak.
12. Iqtisod: bitta daqiqaning narxi
ETA hisoblashning o‘zi arzon. Qimmat narsa — ETA xatosi. Bu bo‘limda ikkalasini hisoblaymiz va nima uchun Uber ETA aniqligiga katta sarmoya kiritishini ko‘ramiz.
Ikki hisob nisbati — ETA iqtisodining mohiyati: hisob narxi va aniqlik qiymati o‘rtasida uch-to‘rt tartib farq bor. Model 10 barobar qimmat bo‘lib, xatoni 1% kamaytirsa ham, bu foydali. Shuning uchun DeepETA kabi og‘irroq model — kechikish byudjetiga sig‘sa — iqtisodiy jihatdan aniq qaror.
▸Chuqurroq: Oldindan narx: ETA xatosining moliyaviy xavfi
Ko‘p bozorlarda mijoz safar narxini oldindan ko‘radi va to‘laydi, haydovchi esa (ko‘p hollarda) haqiqiy vaqt va masofa bo‘yicha oladi. Ular orasidagi farq — platformaning xavfi.
Narx formulasi (soddalashtirilgan):
narx = asosiy + a x masofa + b x vaqt, b = 0.2 $/daqiqa
Bashorat: 25 daqiqa -> vaqt qismi 5.0 $
Haqiqat: 32 daqiqa -> haydovchiga vaqt qismi 6.4 $
Farq: 1.4 $ platforma zarari (bitta safarda)
Agar ETA muntazam 10% kam bo'lsa (bias -10%):
o'rtacha safar 20 daq -> 2 daq x 0.2 $ = 0.4 $ har safarda
31 M safar/kun x (faraz: 50% oldindan narxli) x 0.4 $ = ~6 M $/kun
Shuning uchun bias (8.3) — faqat mijoz tajribasi masalasi emas, bevosita moliyaviy ko‘rsatkich. Muntazam kam ko‘rsatuvchi ETA har kuni millionlab dollar yo‘qotadi; muntazam ko‘p ko‘rsatuvchi esa narxni oshirib, mijozlarni raqobatchilarga yuboradi.
Bu yerdan 16-bo‘limdagi asimmetrik yo‘qotish g‘oyasi kelib chiqadi: xato narxi yo‘nalishga bog‘liq bo‘lsa, model ham yo‘nalishga qarab turlicha jazolanishi kerak. Va turli iste’molchilar uchun (narx, mijoz ekrani, dispetcherlik) “eng yaxshi” bashorat turlicha bo‘lishi mumkin: narx uchun — mediana yoki biroz yuqori kvantil, dispetcherlik uchun — o‘rtacha.
13. Sig‘im rejalashtirish
13.1 Marshrut serverlari: hudud bo‘yicha bo‘lish
Graf kichik (1.3), lekin dunyo grafi va unga bog‘liq ma’lumotlar (bo‘laklar, profillar, sozlangan og‘irliklar) bitta serverga sig‘ishi qiyin, va sig‘sa ham — samarasiz: Toshkentdagi so‘rov uchun Braziliya yo‘llari kerak emas. Tabiiy bo‘lish — hudud (shahar yoki metropoliya).
13.2 GPS quvuri
Ikki xil bo‘limlash kaliti — haydovchi va bo‘lak — oqimli tizimlarning klassik naqshi. Map matching haydovchi izining ketma-ketligini talab qiladi (holat — izning oxiri), agregatsiya esa bo‘lak bo‘yicha yig‘ishni. Ular orasida qayta bo‘limlash (Kafka mavzusidan boshqa mavzuga) turadi. Bu WhatsApp darsidagi “foydalanuvchi bo‘yicha va guruh bo‘yicha” ikki xil kalitga o‘xshaydi.
▸Chuqurroq: Hudud serverlarida og'irliklar versiyasi
Har daqiqada yangi jonli og‘irliklar keladi va har hudud serveri ularni sozlaydi (5-qadam). Savol: bir hududning 8 ta serveri bir vaqtda yangi versiyaga o‘tishi kerakmi?
Agar yo‘q bo‘lsa: bitta mijozning ikki ketma-ket so‘rovi (bir soniya farq bilan) turli serverlarga tushib, turli ETA oladi: “6 daqiqa”, keyin “8 daqiqa”, keyin yana “6”. Ekranda raqam “sakraydi” — ishonchsiz ko‘rinadi.
Yechimlar:
1. Versiyali og'irliklar:
har yangilanish — versiya raqami (masalan, daqiqa belgisi)
so'rov "v=17:42" bilan keladi, server shu versiyani ishlatadi
serverlar oxirgi 2-3 versiyani saqlaydi
-> bir mijozning so'rovlari izchil
2. Yopishqoq marshrutlash:
bitta seans so'rovlari bitta serverga (seans ID bo'yicha xesh)
-> oddiy, lekin server yiqilsa — sakrash
3. Ekranda silliqlash:
ilova yangi ETA ni darhol emas, sekin o'zgartiradi
(6 -> 7 -> 8, keskin sakrashsiz), katta farqni esa darhol
Uchinchisi texnik izchillik emas, idrok izchilligi — va ko‘pincha eng arzon va eng samarali. Birinchisi esa narx va dispetcherlik uchun muhim: bitta qarorning barcha ETA’lari (20 nomzod) bitta versiyadan bo‘lishi kerak, aks holda taqqoslash noto‘g‘ri.
Nazorat savoli · javobni ko‘rishNega ETA uchun marshrut serverlari hudud bo'yicha bo'linadi, lekin DeepETA modeli global (bitta model hamma shahar uchun)?
Chunki ular turli resursga tayanadi.
Marshrutlash — ma’lumotga bog‘liq. Har so‘rov o‘sha hudud grafini, og‘irliklarini va indekslarini talab qiladi. Hamma hududni har serverga yuklash xotira va yangilanish (har daqiqa hamma hudud og‘irliklari) jihatidan isrof. Hudud bo‘yicha bo‘lish so‘rovlarning 99%+ ini bitta server ichida hal qiladi.
Model — parametrga bog‘liq. DeepETA’ning parametrlari (embeddinglar, transformer og‘irliklari) hamma shahar uchun umumiy, va shahar faqat kiritma belgisi (hamda geo-katak embeddinglari). Global model kichik shaharlarga katta shaharlardan o‘rganilgan umumiy qonuniyatlarni o‘tkazadi — yangi shaharda ham darhol ishlaydi. Model hajmi har serverga sig‘adi, va u daqiqalarda emas, kunlarda yangilanadi.
Kichik nozik jihat: global modelning geo embedding jadvallari katta bo‘lishi mumkin (millionlab katak). Ular ham xeshlanadi (11-qadam Deep) va hajm cheklangan bo‘ladi.
Umumiy qoida: tez o‘zgaradigan va joyga bog‘liq ma’lumotni bo‘ling, sekin o‘zgaradigan va umumiy bilimni nusxalang.
14. Kuzatuv: haqiqat kech keladi
14.1 Metrikalar
| Qatlam | Metrika | Nima uchun |
|---|---|---|
| Aniqlik | MAE, bias, p90, kam ko‘rsatish ulushi — shahar, tur, masofa bo‘yicha | Asosiy sifat; segmentlarda yashiringan yomonlashuv |
| Zaxira | Har pog‘ona ulushi (10.1) | Model yoki marshrutlash muammosining erta belgisi |
| Kechikish | ETA servisi p50/p99, dispetcherlik to‘plamlari | Byudjet (11-qadam) buzilsa — zaxiraga o‘tish ko‘payadi |
| Yangilik | GPS nuqtasidan og‘irlikkacha kechikish | Jonli ma’lumot eskirishi — avariyalar kech ko‘rinadi |
| Qamrov | Jonli kuzatuvli bo‘laklar ulushi | Tunda va kichik shaharlarda tarixga tayanish darajasi |
| Kiritmalar | Model belgilarining taqsimoti (kun va kechagi bilan) | Belgi quvuri buzilsa — model “ko‘r” bo‘ladi |
| Biznes | Kutish vaqti, bekor qilishlar, bo‘sh yurish | ETA o‘zgarishining haqiqiy ta’siri |
Jadvaldagi asosiy muammo — aniqlik metrikalari kech keladi. Safar ETA’sining xatosi faqat safar tugagandan keyin (20–40 daqiqa) ma’lum. Agar model bugun soat 14:00 da buzilgan bo‘lsa, aniqlik grafigi buni 14:30 da ko‘rsatadi.
14.2 Kiritmalar va chiqishlar monitoringi
Erta signallarning ikki turi bor. Kiritma monitoringi: har belgi uchun taqsimot (o‘rtacha, nollar ulushi, bo‘sh qiymatlar) hozirgi soat va o‘tgan haftaning shu soati bilan solishtiriladi. Chiqish monitoringi: bashorat qilingan ETA’larning taqsimoti — masalan, marshrut ETA’si va yakuniy ETA nisbati. Agar model birdaniga katta tuzatishlar bera boshlasa, bu ham signal.
▸Chuqurroq: Model tuzatishini cheklash — xavfsizlik to'ri
Kiritma buzilganda model ishonch bilan noto‘g‘ri javob berishi mumkin: “hudud tezligi 0” belgisi uni “ekstremal tirbandlik” deb o‘ylashga majbur qiladi va 10 daqiqalik safarga +40 daqiqa tuzatish qo‘shadi.
Oddiy himoya — qoldiqni cheklash:
q = model(belgilar) # bashorat qilingan qoldiq
chegara = max(2 daq, 0.5 x marshrut_ETA) # masalan
q = min(max(q, -chegara), +chegara)
yakuniy = marshrut_ETA + q
Qo‘shimcha — cheklash hisoblagichi: qancha ulush so‘rovda qoldiq chegaraga urildi. Odatda bu 0.1% atrofida (haqiqatan g‘ayrioddiy holatlar). Agar 10% ga chiqsa — belgilar buzilgan, avtomatik ravishda 2-pog‘onaga (faqat marshrut) o‘tish mumkin.
Bu 10-qadamdagi “nega qoldiq” tanlovining yana bir foydasi: qoldiq modelini cheklash tabiiy — “marshrutdan ko‘p farq qilma”. Noldan bashorat qiluvchi modelni esa nima bilan cheklash kerakligi aniq emas.
Nazorat savoli · javobni ko‘rishAniqlik metrikasi safar tugagandan keyin keladi. Model yangilanishini qanday qilib xavfsiz chiqarish mumkin?
Bosqichma-bosqich va har bosqichda erta signallar bilan.
Soya rejimi: yangi model har so‘rovda hisoblaydi, natijasi yoziladi, lekin ishlatilmaydi. Bir necha kun davomida uning bashoratlari haqiqat bilan solishtiriladi — segmentlar bo‘yicha (8.3). Bu bosqichda xavf nol.
Kichik ulush va erta signallar: model so‘rovlarning 1% ida ishlatiladi. Aniqlikni kutmasdan, darhol ko‘rinadigan narsalar kuzatiladi: kechikish, qoldiq taqsimoti, cheklash hisoblagichi (14.2 Deep), zaxira ulushi. Ular muammoni daqiqalarda ko‘rsatadi.
Aniqlik va biznes ko‘rsatkichlari: bir necha soat yoki kun ichida MAE va bias (kelish ETA’si birinchi, chunki tez keladi), keyin switchback tajribasida (8.4) kutish va bekor qilishlar.
Tez qaytarish: har bosqichda bitta tugma bilan eski modelga qaytish. Model versiyasi har bir ETA javobiga yoziladi — shunda keyinroq aniqlangan muammo qaysi versiyadan kelgani ma’lum.
Qoida: natija kech keladigan tizimda, sabab erta ko‘rinadigan signallarni kuzating. Aniqlikni kutish — muammoni 30 daqiqa yoki bir kun kech ko‘rish.
15. Antinaqshlar
| Qaror | Nima yutamiz | Nimani yo'qotamiz |
|---|---|---|
| Haydovchini masofa bo'yicha tanlash | Arzon, grafsiz, tushunarli | Daryo, bir tomonlama ko'cha, tirbandlik — muntazam noto'g'ri tanlov (1.3 Check, 4.1) |
| Og'irlik = tezlik chegarasi | Xaritada tayyor, ma'lumot yig'ish shart emas | Cho'qqi soatda ETA 2-3 barobar kam (4.2) |
| Har GPS nuqtasini alohida eng yaqin yo'lga biriktirish | Oddiy va tez | Parallel yo'llar aralashadi, bo'lak tezliklari 5-10 barobar buziladi (4.4) |
| Evristikani o'rtacha tezlik bilan hisoblash (A*) | Qidiruv tezroq tugaydi | Evristika optimistik emas — javob ba'zan eng tez yo'l emas, testlarda sezilmaydi (2-qadam) |
| ML modeli ETA ni noldan bashorat qiladi | Bitta model, 'hamma narsani o'zi o'rganadi' | Yopilgan ko'prikni bilmaydi, kam ma'lumotli joylarda yomon, zaxirasi yo'q (14-qadam Check) |
Birinchi qator — v0 ning merosi va eng uzoq yashaydigan antinaqsh, chunki u o‘rtacha to‘g‘ri. Muammo o‘rtachada emas, qarorda: dispetcherlik taqqoslaydi, va taqqoslash tizimli xatolarga sezgir (4-bo‘lim Check). Bu antinaqshning chuqur sababi — arzon proksi o‘lchovni (masofa) haqiqiy maqsad (vaqt) o‘rniga optimallashtirish.
Ikkinchi qator — ma’lumot yig‘ishdan qochish. Tezlik belgisi tayyor turibdi, haqiqiy tezlik esa GPS quvuri, map matching va agregatsiyani talab qiladi. Lekin ETA tizimining butun qiymati aynan shu quvurda: algoritm hamma uchun bir xil (Dijkstra ochiq), ma’lumot esa — faqat sizda.
Uchinchi qator qiziq, chunki xato faqat ma’lumotda ko‘rinadi, kodda emas. Biriktirish funksiyasi to‘g‘ri ishlaydi — nuqtaga eng yaqin yo‘lni topadi. Lekin savol noto‘g‘ri qo‘yilgan: “bu nuqta qaysi yo‘lga eng yaqin” emas, “bu iz qaysi yo‘ldan o‘tgan”. Ketma-ketlikka qarash (HMM) — alohida nuqtalarga qarashdan farqli savol.
To‘rtinchi qator — eng nozik va eng xavfli, chunki natija deyarli to‘g‘ri. Optimistik bo‘lmagan evristika bilan A* 98% hollarda eng tez yo‘lni topadi, 2% da 3–5% uzunroq yo‘lni. Hech bir aniq test buni ushlamaydi; faqat tasodifiy juftliklarda Dijkstra bilan solishtirish (amaliyotdagi kabi) ko‘rsatadi.
Beshinchi qator — “ML hamma narsani hal qiladi” tuzog‘i. 14-qadamdagi Check uning uch zaif tomonini ko‘rsatdi. Gibrid yondashuv kamroq “chiroyli”, lekin fizikani (graf, jonli og‘irliklar) va o‘rganishni (qoldiq) to‘g‘ri ajratadi.
▸Chuqurroq: Vaqtga bog'liq og'irliklar va FIFO buzilishi
9-qadamda vaqtga bog‘liq Dijkstra FIFO shartini talab qilgan edi: bo‘lakka kechroq kirgan kechroq chiqadi. Bu shart buzilsa nima bo‘ladi?
Bo'lak e: w(e, t)
17:00 da kirilsa: 10 daqiqa (tirbandlik) -> chiqish 17:10
17:02 da kirilsa: 3 daqiqa (tirbandlik tarqaldi) -> chiqish 17:05
Bu yerda kutish foydali: 17:00 da kirish o‘rniga 2 daqiqa kutib, 17:05 da chiqish mumkin. Oddiy vaqtga bog‘liq Dijkstra buni bilmaydi — u har tugunga eng erta yetish vaqtini saqlaydi va “kutish” variantini ko‘rmaydi, shuning uchun noto‘g‘ri (kechroq) javob beradi.
Haqiqiy yo‘llarda FIFO deyarli har doim bajariladi (bir-birini quvib o‘tish cheklangan), lekin profillar buni buzishi mumkin: 15 daqiqalik oraliqlar orasida keskin sakrash (17:00 — 10 daqiqa, 17:15 — 3 daqiqa) yuqoridagi vaziyatni sun’iy yaratadi. Shuning uchun profillar oraliqlar chegarasida chiziqli interpolyatsiya qilinadi va “o‘tish vaqti qiyaligi -1 dan kichik bo‘lmasin” sharti bilan silliqlanadi.
Bu klassik holat: to‘g‘ri algoritm ma’lumotga qo‘yilgan shartga tayanadi, va shart ma’lumot quvurining bir joyida jim buziladi. Himoya — shartni ma’lumot yuklanganda tekshirish (validatsiya), algoritmdan oldin.
16. Trade-off‘lar
| Qaror | Nima yutamiz | Nimani yo'qotamiz |
|---|---|---|
| Contraction Hierarchies (statik) | Eng tez qidiruv, oddiy qidiruv kodi | Og'irlik o'zgarsa — daqiqalik qayta qurish; jonli tirbandlik yo'q |
| CRP / CCH (moslashtiriladigan) | Jonli og'irliklar soniyalarda; qidiruv baribir ms | Uch bosqichli tizim; qidiruv CH dan 2-5x sekinroq |
| Qisqa jonli oyna (2 daq) | Avariya tez ko'rinadi | Shovqinli; kam kuzatuvli bo'laklarda sakraydi |
| Uzun jonli oyna (15 daq) | Barqaror, ishonchli | Avariya 7-8 daqiqa kech; tirbandlik tarqalgandan keyin ham 'tirband' |
| Daraxtlar ansambli | Tez o'qitiladi, talqin qilinadi, arzon xizmat | Kategoriyalar va o'zaro ta'sirlarda cheklangan; o'sgan sari foyda kamayadi |
| Neyron tarmoq (DeepETA) | Aniqroq, global model, embedding'lar | Kechikish byudjeti uchun arxitektura cheklovlari; o'qitish qimmat |
Jadvaldagi har juftlik bitta o‘qda yotadi: yangilik va barqarorlik. Statik CH va uzun oyna — barqaror, lekin eskirgan. Moslashtiriladigan marshrutlash va qisqa oyna — yangi, lekin murakkab yoki shovqinli. Yaxshi tizim bitta nuqtani tanlamaydi: katta ko‘chalarda qisqa oyna, kichiklarida uzun (8-qadamdagi aralashtirish buni avtomatik qiladi); yaqin kelajak uchun jonli, uzoq kelajak uchun tarixiy (9-qadam).
▸Chuqurroq: Asimmetrik yo'qotish: kech kelish va erta kelish bir xil emas
Oddiy regressiya o‘rtacha kvadratik xatoni (MSE) yoki o‘rtacha mutlaq xatoni (MAE) minimallashtiradi. Ikkalasi ham simmetrik: 2 daqiqa kam ko‘rsatish va 2 daqiqa ko‘p ko‘rsatish bir xil jazolanadi.
Lekin 12-bo‘lim va 14-qadam ko‘rsatganidek, xato narxi yo‘nalishga bog‘liq. Huber yo‘qotishi kichik xatolarda kvadratik (silliq o‘qitish), katta xatolarda chiziqli (chiqib ketishlarga chidamli). Uning asimmetrik varianti ikki tomonga turli og‘irlik beradi:
xato r = haqiqat - bashorat
Huber(r) = 0.5 x r^2 agar |r| <= delta
delta x (|r| - 0.5 x delta) aks holda
Asimmetrik: L(r) = w x Huber(r) agar r > 0 (kam ko'rsatdik, kech keldi)
(1 - w) x Huber(r) agar r <= 0 (ko'p ko'rsatdik)
w = 0.5 -> simmetrik (o'rtachaga yaqin)
w = 0.7 -> kam ko'rsatish 2.3 barobar qimmat -> bashorat yuqori kvantilga siljiydi
w ni tanlash — biznes qarori: mijoz ekrani uchun biroz yuqoriroq
(“va’dadan erta kelish” — yoqimli), dispetcherlik uchun simmetrik (taqqoslash
to‘g‘ri bo‘lsin), narx uchun — moliyaviy xavfga qarab. DeepETA’dagi
so‘rov turi bo‘yicha dekodlovchi (11-qadam) bitta modelda turli
iste’molchilar uchun turli moslashuvga yo‘l ochadi.
Bu tanlovning oqibati — bias ataylab noldan farq qiladi. 8.3-dagi “bias nolga yaqin bo‘lsin” talabi simmetrik holat uchun; asimmetrik yo‘qotish bilan kutilgan bias — tanlangan kvantilga mos. Monitoring (14.1) shu kutilgan qiymatdan og‘ishni kuzatadi, noldan emas.
17. Intervyu savollari
17.1 Algoritmlar
▸Dijkstra algoritmi qanday ishlaydi va nega u yo'l grafida to'g'ri javob beradi?
Manbadan boshlab tugunlarni masofa tartibida “o‘rnatadi”: har qadamda
navbatdagi eng kichik masofali tugun olinadi, uning qo‘shnilari
yangilanadi. To‘g‘rilik manfiy bo‘lmagan og‘irliklarga tayanadi: agar
u navbatdan eng kichik masofa bilan chiqqan bo‘lsa, unga boshqa yo‘l
qisqaroq bo‘lishi mumkin emas, chunki har qanday boshqa yo‘l hozir
navbatdagi kattaroq masofali tugundan o‘tadi va og‘irliklar faqat qo‘shadi.
Yo‘l grafida og‘irlik — vaqt, u har doim musbat. Murakkablik — ustuvor
navbat bilan O((V + E) log V). Javob manzil navbatdan chiqqanda aniq,
unga birinchi yetilganda emas.
▸A* qanday ishlaydi va evristika qanday shartni qanoatlantirishi kerak?
Navbat tartibi d(u) + h(u) bo‘yicha, bu yerda h(u) — u dan manzilgacha
qolgan masofaning bahosi. Qidiruv manzil tomonga cho‘ziladi. Shart —
evristika optimistik (admissible) bo‘lishi: hech qachon haqiqiy qolgan
masofadan katta emas. Yo‘l vaqti uchun: to‘g‘ri chiziq masofasi ÷ grafdagi
eng yuqori tezlik. Agar o‘rtacha tezlik ishlatilsa, baho ba’zan haqiqatdan
katta bo‘ladi va A* eng tez yo‘lni o‘tkazib yuborishi mumkin. Shaharda
foyda cheklangan (~2 barobar), chunki eng yuqori tezlik haqiqiydan ancha
yuqori va baho zaif; landmark’lar (ALT) bahoni ancha yaxshilaydi.
▸Ikki tomonlama Dijkstra'da qachon to'xtash kerak?
Ikki to‘lqin birinchi uchrashganda emas. Topilgan eng yaxshi yo‘l mu
ikki qidiruv kesishgan har bir qirrada yangilanadi, va to‘xtash sharti:
oldinga navbat boshi + orqaga navbat boshi ≥ mu. Birinchi uchrashuv
nuqtasi orqali o‘tgan yo‘l eng qisqasi bo‘lmasligi mumkin — boshqa,
hali o‘rnatilmagan tugunlar orqali qisqaroq yo‘l bo‘lishi mumkin. Bu xato
kichik testlarda sezilmaydi, tasodifiy grafdagi taqqoslashda chiqadi.
Foyda: ikki r/2 radiusli doira bitta r radiusli doiraning yarmi —
~2 barobar kam tugun.
▸Contraction Hierarchies'ni tushuntiring. Nega u tez?
Oldindan hisoblash: tugunlar muhimlik tartibida birma-bir qisqartiriladi va eng qisqa yo‘llarni saqlash uchun yorliqlar qo‘shiladi. Natijada har qanday eng qisqa yo‘l “yuqoriga — cho‘qqi — pastga” shaklida ifodalanadi. Qidiruv — ikki tomonlama, lekin har ikki tomon faqat yuqoriga yuradi; tepada tugunlar kam, shuning uchun bir necha yuz tugun ko‘riladi. Kontinental grafda Dijkstra soniyalar, CH — 0.1–1 ms. Narxi: oldindan hisoblash daqiqalar, qirralar ~2 barobar, va og‘irliklar o‘zgarsa ierarxiya eskiradi.
▸Jonli tirbandlikni tez qidiruv bilan qanday birlashtirasiz?
Oldindan hisoblashni ikkiga bo‘laman: og‘irlikka bog‘liqmas tuzilma (grafni bo‘laklarga bo‘lish, tugunlar tartibi — xarita o‘zgarganda) va tez sozlash (og‘irliklardan bo‘lak chegaralari orasidagi masofalarni hisoblash — har daqiqada, soniyalarda). Bu CRP va CCH g‘oyasi. Jonli tezliklar faqat o‘zgargan bo‘laklarni qayta sozlaydi. Qidiruv CH dan biroz sekin, lekin millisekundlarda qoladi. Uch tezlik — xarita (haftalar), og‘irliklar (daqiqalar), so‘rovlar (millisekundlar) — uch bosqich.
▸Map matching nima va nega har nuqtani eng yaqin yo'lga biriktirish yetmaydi?
GPS nuqtalari ketma-ketligini yo‘l bo‘laklari ketma-ketligiga aylantirish. Nuqtalarni alohida biriktirsak, parallel yo‘llar (magistral va xizmat yo‘li) aralashadi, nuqta “sakraydi” va tezliklar buziladi. To‘g‘ri yondashuv — yashirin Markov modeli: emissiya ehtimoli (nuqta yo‘ldan qancha uzoq, GPS xatosi normal taqsimlangan), o‘tish ehtimoli (yo‘l bo‘yicha masofa to‘g‘ri chiziq masofasiga qanchalik yaqin). Viterbi eng ehtimolli ketma-ketlikni tanlaydi. Narxi — hisob va oxirgi nuqtalarning kechikkan aniqlanishi.
▸H3 nima va nega olti burchak?
Uber’ning ierarxik geo-indeksi: Yer 16 darajada olti burchakli kataklarga bo‘linadi, har daraja taxminan 7 barobar mayda. Katak — 64-bitli son, shuning uchun indeks oddiy xesh jadval. Olti burchakning afzalligi — hamma 6 qo‘shni markazdan bir xil masofada; kvadrat to‘rda burchak qo‘shnilari 1.41 barobar uzoq. Natijada “k halqa” doiraga yaqin, va harakat, talab, narx kabi hodisalar yo‘nalishga bog‘liq buzilishsiz modellashtiriladi. Ishlatilishi: yaqin haydovchilar, talab va taklif xaritasi, narx hududlari, tarixiy ETA matritsasi.
▸Dispetcherlik uchun 30 mijoz va 100 haydovchi orasidagi ETA'larni qanday tez hisoblaysiz?
3 000 ta alohida qidiruv emas. Ko‘p-ga-ko‘p usul: CH ustida har haydovchidan bitta yuqoriga qidiruv, har mijozdan bitta orqaga qidiruv, va uchrashuv tugunlarida “chelaklar” — natijada ~130 qidiruv narxi. Keyin ML qoldig‘i butun matritsa uchun bitta to‘plamda. Tayinlash — Venger algoritmi yoki min-cost flow, umumiy kutishni minimallashtirish. Butun oyna bir necha yuz millisekundga sig‘adi, shuning uchun so‘rovlar bir necha soniya yig‘iladi.
▸Vaqtga bog'liq marshrut nima va qachon kerak?
Qirra og‘irligi — unga kirish vaqtining funksiyasi. Qidiruvda har tugunga yetish vaqti saqlanadi va keyingi qirra shu vaqt uchun hisoblanadi. Uzun safarlarda muhim: 40 daqiqalik safarning oxirgi bo‘laklariga cho‘qqi soatda yetiladi, va hozirgi “surat” ularni kam ko‘rsatadi (~15%). Shart — FIFO: kechroq kirgan kechroq chiqadi; aks holda oddiy algoritm noto‘g‘ri. Jonli ma’lumot yaqin kelajak uchun, tarixiy profil uzoq kelajak uchun — ufq bo‘yicha aralashtiriladi.
17.2 Ma’lumot va ML
▸Bo'lak tezligini GPS nuqtalaridan qanday hisoblaysiz?
Map matching izni bo‘laklarga ajratadi va har bo‘lak uchun kirish va
chiqish vaqtini beradi — o‘tish vaqti svetofor kutishini ham o‘z ichiga
oladi. O‘tishlar bo‘lak bo‘yicha oynada (masalan, 5 daqiqa) yig‘iladi,
mediana olinadi (to‘xtab turgan haydovchi o‘rtachani buzmasin), “turli
haydovchilar” soni tekshiriladi. Kam kuzatuvda tarixiy profil bilan
aralashtiriladi: (n × jonli + k × tarixiy) / (n + k). Lahzalik GPS
tezligi ishlatilmaydi — u kutishni tasodifan ko‘radi yoki ko‘rmaydi.
▸Kichik ko'chada oxirgi soatda hech kim o'tmagan. Uning og'irligi qanday aniqlanadi?
Ierarxik zaxira: bo‘lak va shu 15 daqiqalik oraliq profili; kam kuzatuvli bo‘lsa — shu soat; keyin kun qismi; keyin yo‘l turi va shahar bo‘yicha o‘rtacha; oxirida tezlik chegarasi × koeffitsient. Muhim nozik jihat: gavjum bo‘lak birdaniga jim qolsa — bu “bo‘sh” emas, “ehtimol yopiq” signali. Uni alohida tekshirish kerak, aks holda tizim yopiq ko‘chaga haydovchi yuboradi va buni hech qachon bilmaydi.
▸Nega ML modeli marshrut ETA'sining qoldig'ini bashorat qiladi?
Marshrut ETA’si fizikani (masofa, yo‘l, jonli tezlik) allaqachon hisoblagan; model faqat grafda yo‘q narsalarni o‘rganadi: svetoforlar, burilishlar, olib ketish joylari, mahalliy odatlar. Bu kam ma’lumot bilan yaxshi ishlaydi, tashqi o‘zgarishlarga (yopilgan ko‘prik) marshrut orqali darhol reaksiya qiladi, va model ishlamasa marshrut ETA’si tayyor zaxira. Qoldiqni cheklash ham oson — kiritma buzilganda model katta xato qila olmaydi.
▸ETA modeli uchun qanday belgilar ishlatasiz?
Marshrut: marshrut ETA’si, masofa, burilishlar soni, yo‘l turlari ulushi. Vaqt: soat, hafta kuni, bayram. Joy: boshlanish va manzil kataklari bir necha o‘lchamda (H3 yoki geohash, xeshlangan embedding), aeroport belgisi. So‘rov turi: kelish yoki safar, mahsulot, yetkazib berish. Jonli holat: hududdagi tezliklar, talab va taklif. Tashqi: ob-havo, tadbirlar. Har belgi bashorat lahzasida mavjud bo‘lishi va o‘qitishda “o‘sha lahzadagi” qiymat bilan olinishi shart — aks holda sizib kirish.
▸DeepETA arxitekturasining asosiy g'oyalari qanday?
Har belgi — token; uzluksiz belgilar kvantillar bo‘yicha diskretlanib embedding oladi; geo koordinatalar bir necha o‘lchamdagi kataklarga aylanib, xeshlangan embedding jadvallaridan vektor oladi. Self-attention belgilar orasidagi o‘zaro ta’sirni o‘rganadi; kechikish uchun chiziqli attention. Dekodlovchida so‘rov turi bo‘yicha siljish va masshtab tuzatishi. Yo‘qotish — asimmetrik Huber: chiqib ketishlarga chidamli va xato yo‘nalishiga qarab turlicha jazolaydi. Hammasi marshrut ETA’sining qoldig‘i uchun.
▸ETA modelining sifatini qanday o'lchaysiz?
Bitta raqam emas. MAE (o‘rtacha), bias (tizimli siljish — mijoz ishonchi va narx uchun muhim), p90 mutlaq xato (dum), kam ko‘rsatish ulushi (masalan, 2 daqiqadan ko‘p kech kelish). Hammasi segmentlar bo‘yicha: kelish va safar, shahar, masofa guruhi, aeroport. MAPE ehtiyotkorlik bilan — qisqa safarlarni haddan ortiq jazolaydi. Va oxirida — biznes ko‘rsatkichlari (kutish, bekor qilishlar, bo‘sh yurish) onlayn tajribada.
▸ETA modeli uchun A/B test nega qiyin va nima qilasiz?
ETA dispetcherlikka kiradi, va guruhlar umumiy haydovchilarni bo‘lishadi. Yangi model bilan A guruh yaxshiroq haydovchilarni oladi, B guruhga qolganlari yomonroq — farq sun’iy oshadi (interference). Yechim — vaqt bo‘yicha almashtirish (switchback): butun shahar navbat bilan yangi va eski modelda, tasodifiy oraliqlarda. Undan oldin — oflayn baholash va soya rejimi. Geografik bo‘lish ham mumkin, lekin tumanlar har xil va chegarada ifloslanish bor.
▸Nishon (label) — haqiqiy vaqt — qanday xatolarga ega va ularni qanday tuzatasiz?
Haydovchi tugmalari (“yetib keldim”, “safarni tugatish”) inson harakati: ba’zilar erta bosadi, ba’zilar kech. Agar erta bosish muntazam bo‘lsa, nishonlar qisqa, va model ETA’ni kam ko‘rsatishni o‘rganadi. Tuzatish — nishonni GPS izidan olish: mashina olib ketish joyiga yaqinlashib to‘xtagan lahza. Shuningdek, g‘ayrioddiy safarlarni (yo‘lda uzoq to‘xtash, manzil o‘zgarishi) o‘qitishdan chiqarish yoki alohida belgilash.
17.3 Tizim va miqyos
▸ETA tizimining sig'imini baholang.
~31 M safar/kun, har safarga ~300 ETA (ilova seanslari, dispetcherlik nomzodlari, safar davomidagi yangilanishlar) — ~100 ming ETA/s o‘rtacha, cho‘qqida ~300 ming. Har ETA ~3–5 ms CPU (marshrut + model to‘plamda) — bir necha ming yadro zaxira bilan. GPS: ~1.5 M onlayn haydovchi × har 4 s — ~375 ming nuqta/s; map matching ~0.3 ms/nuqta — bir necha yuz yadro. Graf: katta metropoliya ~1–2 GB bilan server xotirasiga sig‘adi; dunyo — hudud bo‘yicha bo‘linadi.
▸Marshrut serverlarini qanday bo'lasiz va hududlararo safar bilan nima qilasiz?
Hudud (metropoliya) bo‘yicha: har hudud graf, og‘irliklar va indekslar bilan alohida serverlar guruhida. So‘rovlarning 99%+ bitta hudud ichida. Hududlararo safarlar (shaharlararo, aeroport boshqa hududda) — alohida “katta” graf serverlari: faqat magistrallar va hudud chegaralari bilan qisqartirilgan graf, uchlaridagi qism mahalliy serverlarda. Yangilanish mustaqil: har hudud o‘z og‘irliklarini o‘z tezligida oladi.
▸ETA servisi ishlamay qolsa nima bo'ladi?
Yiqilmaydi — sifat pasayadi. Zinapoya: marshrut + ML → faqat marshrut → H3 kataklari orasidagi tarixiy matritsa (mikrosekundlar, bir necha MB) → to‘g‘ri chiziq × koeffitsient. O‘tish mezoni — vaqt byudjeti, xato emas: sekin komponent zanjirni kutishga majbur qiladi. Har pog‘ona muntazam ravishda kichik ulush trafik bilan sinaladi, aks holda zaxira kerak bo‘lganda buzilgan bo‘lib chiqadi. Zaxira ulushi — asosiy monitoring signali.
▸Narx va ekrandagi ETA bir xil bo'lishini qanday ta'minlaysiz?
Bitta hisob, bitta taklif (quote) ob’ekti: marshrut, ETA, masofa va narx bir vaqtda hisoblanib, ID va muddat bilan saqlanadi. Ekran ham, buyurtma ham shu ID ga ishora qiladi; buyurtmada narx qayta hisoblanmaydi. Safar davomida esa ETA tirik bashorat sifatida yangilanadi, narx esa — yo‘q. Serverlar orasidagi og‘irlik versiyalari farqini kamaytirish uchun so‘rovga versiya biriktiriladi yoki ekranda silliqlanadi.
▸GPS'ni soxtalashtiradigan haydovchilardan qanday himoyalanasiz?
Fizik tekshiruvlar: imkonsiz tezliklar va sakrashlar, map matching ehtimoli past iz (yo‘llardan tashqarida), sensorlar nomuvofiqligi (GPS harakat deydi, akselerometr — yo‘q), tarmoq ma’lumotlari (uyali minora boshqa joyda). Tezlik agregatsiyasida mediana va “turli haydovchilar” sharti bitta soxta hisobning ta’sirini yo‘q qiladi. Muvofiqlashtirilgan hujumga qarshi — manbalar xilma-xilligi, tarixdan keskin og‘ishni tekshirish, hisob ishonchiga qarab og‘irlik.
▸Uber Eats uchun yetkazib berish vaqtini qanday bashorat qilasiz?
Tarkibiy: max(tayyorlash vaqti, kuryer restoranga kelishi) + restoranda topshirish + restoran → mijoz safar ETA’si + binoga kirish. Yangi qism — tayyorlash vaqti: restoran, taom, buyurtma hajmi, soat, joriy bandlik bo‘yicha ML. Bashorat xatosi taqsimoti kuryerni yuborish paytini belgilaydi: erta — kuryer kutadi (xarajat), kech — taom sovuydi (sifat). Yuborishni “bashorat minus bir standart og‘ish” atrofiga qo‘yish ikkala xavfni muvozanatlaydi.
▸ETA modelini qanday xavfsiz chiqarasiz, agar aniqlik 30-40 daqiqadan keyin ma'lum bo'lsa?
Soya rejimi (hisoblanadi, ishlatilmaydi) → kichik ulush → kengaytirish, har bosqichda erta signallar bilan: kechikish, qoldiq taqsimoti, qoldiq cheklovga urilish ulushi, belgilar taqsimoti, zaxira ulushi. Kelish ETA’si aniqligi tezroq keladi (5–8 daqiqa) — undan birinchi foydalaniladi. Model versiyasi har javobga yoziladi, qaytarish — bitta tugma. Segmentlar bo‘yicha monitoring: global o‘rtacha kichik shahardagi buzilishni yashiradi.
▸Nega yo'l grafini grafik ma'lumotlar bazasida (masalan, Neo4j) saqlab, so'rov bilan eng qisqa yo'lni olmaysiz?
Chunki kerakli tezlik va yuk tartibi boshqa. Grafik bazalar umumiy maqsadli: tugun va qirralar ob’ekt sifatida, xossalar bilan, tranzaksiyalar bilan. Marshrutlash esa bitta narsani qiladi — sekundiga minglab eng qisqa yo‘l — va buning uchun ixcham massivlar (CSR), protsessor keshiga mos tartib va oldindan hisoblangan ierarxiya (CH/CRP) kerak. Butun metropoliya grafi bir necha o‘n MB — xotirada, jarayon ichida, tarmoqsiz. Grafik baza xarita tahriri va tahlil uchun foydali bo‘lishi mumkin; xizmat qilish uchun esa undan eksport qilingan, maxsus formatdagi graf.
▸Umumiy safarda (bir mashinada bir necha yo'lovchi) ETA qanday murakkablashadi?
ETA endi bitta marshrut emas, tartib masalasi: yangi yo‘lovchini qo‘shganda, uni olish va tushirish nuqtalarini mavjud to‘xtashlar ketma-ketligining qayeriga qo‘yish kerak — va har variant boshqa yo‘lovchilarning ETA’sini o‘zgartiradi. Cheklovlar: har yo‘lovchiga va’da qilingan maksimal kechikish. Har bir nomzod tartib uchun to‘xtashlar orasidagi ETA’lar kerak — bu kichik ko‘p-ga-ko‘p matritsa. Mashinalar va tartiblar soni tez o‘sadi, shuning uchun evristikalar va qat’iy vaqt byudjeti ishlatiladi. Asosiy saboq: dispetcherlik qarori ETA matritsasining sifati va tezligi bilan cheklangan.
18. Amaliyot
To‘rt daraja. Ikkinchi daraja uchun kod docs/amaliyot/uber-eta/ da:
eta.py — oltita funksiya TODO; city.py — tayyor sintetik shahar (70 × 70
chorraha, magistrallar, bir tomonlama ko‘chalar, daryo va uchta ko‘prik),
GPS o‘tishlari va safarlar generatori; check.py — 20 ta tekshiruv, taxminan
3 soniya. Faqat Python standart kutubxonasi.
1-daraja: v0 qancha adashadi
3-bo‘limdagi v0 ni (to‘g‘ri chiziq × koeffitsient ÷ o‘rtacha tezlik)
city.py shahrida sinang. 500 ta tasodifiy juftlik uchun uning ETA’sini
grafdagi haqiqiy eng tez yo‘l vaqti bilan solishtiring (eng tez yo‘lni
2-darajadan keyin o‘zingizning dijkstra bilan oling).
Tekshiruv mezoni: (1) nisbiy xatolar taqsimoti — gistogramma; (2) daryoni kesib o‘tadigan va o‘tmaydigan juftliklar uchun alohida o‘rtacha xato — 4.1-dagi hisob bilan solishtiring; (3) “dispetcherlik” tajribasi: har mijoz uchun 10 ta tasodifiy haydovchidan v0 bo‘yicha va graf bo‘yicha eng yaqinini tanlang — necha foiz hollarda tanlov farq qiladi va o‘rtacha kutish qancha oshadi?
2-daraja: ETA dvigateli (asosiy topshiriq)
eta.py dagi dijkstra, astar, bidirectional, live_speeds,
fit_residual va predict ni yozing. python check.py ularni mustaqil
orakul, tasodifiy juftliklar, shovqinli GPS o‘tishlari va chiqib ketishli
safarlar bilan tekshiradi.
Tekshiruv mezoni: Jami: 20/20 OK. Shu jumladan: uchala qidiruv 140
juftlikda aniq javob va haqiqiy yo‘l beradi; A* va ikki tomonlama qidiruv
uzun safarlarda Dijkstra’ning 75% idan kam tugun ko‘radi; ikki tomonlama
qidiruv “birinchi uchrashuv” tuzog‘iga tushmaydi; jonli og‘irliklar ETA
xatosini kamida 30% kamaytiradi; qoldiq modeli MAE ni kamida 45% kamaytiradi
va siljish ±3% ichida. Keyin tajriba: A* evristikasida vmax ni ikkiga
bo‘ling va nechta juftlikda javob noto‘g‘ri bo‘lishini sanang — 15-bo‘limdagi
to‘rtinchi antinaqshni o‘z raqamingiz bilan tasdiqlang.
3-daraja: map matching va Contraction Hierarchies
Ikki qism. (a) city.py grafida haydovchi izlarini simulyatsiya qiling:
haqiqiy yo‘l bo‘ylab har 4 soniyada nuqta, σ = 15 m GPS shovqini. Oddiy
“eng yaqin qirra” va HMM + Viterbi (5-bo‘lim 6-qadam Deep) bilan map matching
yozing. (b) CH ni yozing: qirralar farqi bo‘yicha tartib, guvoh qidiruvi,
yorliqlar, yuqoriga ikki tomonlama qidiruv.
Tekshiruv mezoni: (a) har usul uchun to‘g‘ri biriktirilgan nuqtalar ulushi va bo‘lak o‘tish vaqtlari xatosi; σ ni 5 m dan 40 m gacha oshirib, qaysi usul qachon ishdan chiqishini ko‘rsating; (b) CH natijalari 1 000 juftlikda Dijkstra bilan bir xil; o‘rtacha o‘rnatilgan tugunlar va qidiruv vaqti — 5-bo‘lim 4-qadamdagi Calc bilan solishtiring; yorliqlar soni va oldindan hisoblash vaqti.
4-daraja: sig'im va xarajat modeli
Jadval yoki skript: kirish — kunlik safarlar, bir safarga ETA so‘rovlari (seanslar, dispetcherlik nomzodlari, yangilanishlar), bitta ETA’ning CPU vaqti (marshrut va model alohida), onlayn haydovchilar va GPS chastotasi, map matching narxi, yadro narxi. Chiqish — ETA va GPS quvuri uchun yadrolar, yillik xarajat, safarga xarajat.
Tekshiruv mezoni: (1) 1.3 va 12-bo‘limdagi hisoblarni takrorlang; (2) GPS chastotasini 4 s dan 1 s ga va 15 s ga o‘zgartirib, quvur narxi va jonli tezliklar aniqligi (7-qadam Calc) o‘rtasidagi murosani ko‘rsating; (3) marshrutlashni CH o‘rniga oddiy Dijkstra bilan qilsak, xarajat necha barobar oshishini hisoblang va 12-bo‘limdagi “aniqlik qiymati” bilan solishtiring — qaysi optimallashtirish muhimroq?
19. Lug‘at
| Atama | Ma’nosi |
|---|---|
| ETA | Taxminiy yetib kelish vaqti: kelish (pickup) yoki safar (dropoff) |
| Yo‘l grafi | Tugunlar — chorrahalar, yo‘nalishli qirralar — yo‘l bo‘laklari |
| Og‘irlik | Qirrani o‘tish vaqti (soniya): uzunlik ÷ tezlik |
| Burilish jarimasi | Chorrahada burilish yoki kutish uchun qo‘shimcha vaqt |
| Dijkstra | Manfiy bo‘lmagan og‘irliklarda eng qisqa yo‘l, ustuvor navbat bilan |
| A* | Dijkstra + manzilgacha optimistik baho bilan tartib |
| Optimistik evristika | Hech qachon haqiqiy qolgan vaqtdan katta bo‘lmagan baho |
| ALT | Landmark’lar va uchburchak tengsizligi bilan A* bahosi |
| Ikki tomonlama qidiruv | Manba va manzildan bir vaqtda; to‘xtash: navbat boshlari yig‘indisi ≥ μ |
| Contraction Hierarchies | Tugunlarni qisqartirib yorliqlar qo‘shish; qidiruv faqat yuqoriga |
| Yorliq (shortcut) | Qisqartirilgan tugun o‘rnini bosuvchi qirra |
| Guvoh yo‘l | Tugunsiz ham shunday qisqa yo‘l — yorliq kerak emasligini ko‘rsatadi |
| CRP / CCH | Tuzilma va og‘irlikni ajratadigan moslashtiriladigan marshrutlash |
| Map matching | GPS nuqtalari ketma-ketligini yo‘l bo‘laklari ketma-ketligiga aylantirish |
| HMM, Viterbi | Yashirin Markov modeli va eng ehtimolli holatlar ketma-ketligi algoritmi |
| Bo‘lak o‘tish vaqti | Bo‘lakka kirish va chiqish orasidagi vaqt, kutish bilan birga |
| Tarixiy profil | Bo‘lakning haftaning har 15 daqiqasi uchun odatiy tezligi |
| Psevdo-kuzatuv (k) | Tarixiy qiymatning jonli kuzatuvlar bilan aralashtirishdagi og‘irligi |
| Vaqtga bog‘liq marshrut | Og‘irlik qirraga kirish vaqtining funksiyasi |
| FIFO sharti | Qirraga kechroq kirgan kechroq chiqadi |
| Qoldiq (residual) | Haqiqiy vaqt − marshrut ETA’si; ML modelining nishoni |
| DeepETA | Uber’ning qoldiqni bashorat qiluvchi transformer modeli |
| Asimmetrik Huber | Xato yo‘nalishiga qarab turlicha jazolovchi, chidamli yo‘qotish |
| H3 | Uber’ning olti burchakli ierarxik geo-indeksi |
| To‘plamli moslash | So‘rovlar oynada yig‘ilib, haydovchilar global tayinlanadi |
| Taklif (quote) | Narx va ETA bir marta hisoblanib, ID bilan saqlangan ob’ekt |
| Switchback tajriba | Butun hudud navbat bilan turli variantlarda — tarmoq ta’sirisiz A/B |
20. Raqamlar manbasi
| Raqam | Qiymat | Manba |
|---|---|---|
| Yillik safarlar | ~11 mlrd (2024) | Uber yillik hisoboti (2024) |
| Haydovchi va kuryerlar | ~7–8 M | Uber ochiq hisobotlari (2023–2024) |
| AQSh yo‘l grafi | ~24 M tugun, ~58 M qirra | 9-DIMACS Implementation Challenge (2006) |
| Yevropa grafida CH | qidiruv ~0.1–0.3 ms | Geisberger va boshq. (2008); Bast va boshq. (2016) sharhi |
| H3 darajalari | 16 daraja; 9-daraja ~0.105 km² | H3 hujjatlari, katak statistikasi jadvali |
| H3 ochiq kod | 2018 | Uber muhandislik blogi (2018) |
| DeepETA | 2022 | Uber muhandislik blogi (2022) |
| Michelangelo | 2017 | Uber muhandislik blogi (2017) |
| Map matching HMM | 2009 | Newson va Krumm, ACM SIGSPATIAL (2009) |
| Tirbandlik to‘lqini | 1955–1956 | Lighthill va Whitham (1955); Richards (1956) |
| 2-daraja natijalari | 20/20; 15 mutatsiya | docs/amaliyot/uber-eta/, referens implementatsiya |
Bir safarga ETA so‘rovlari, sekundiga so‘rovlar, GPS nuqtalari chastotasi va hajmi, bo‘laklar soni va kuzatuvlar zichligi, burilish va svetofor vaqtlari, xato taqsimotlari, model yaxshilanishlari, kechikish byudjetlari, xarajatlar va sig‘im hisoblari — illyustratsiya uchun taxminiy. Ular yuqoridagi ochiq raqamlardan va algoritmlar bo‘yicha nashr etilgan natijalardan kelib chiqqan, tartib jihatidan ishonchli, lekin aniq emas. Darsning asosiy xulosalari — graf kichik, qidiruv esa aqlli bo‘lishi kerak; og‘irliklar haqiqati GPS quvurida; ML fizikani emas, qolgan xatoni o‘rganadi; hisob arzon, xato qimmat — bu raqamlarning bir necha barobarlik xatosiga ham chidamli.
21. Manbalar
- Edsger W. Dijkstra (1959), “A Note on Two Problems in Connexion with Graphs”, Numerische Mathematik
- Peter E. Hart, Nils J. Nilsson, Bertram Raphael (1968), “A Formal Basis for the Heuristic Determination of Minimum Cost Paths”, IEEE Transactions on Systems Science and Cybernetics
- Andrew V. Goldberg, Chris Harrelson (2005), “Computing the Shortest Path: A* Search Meets Graph Theory”, SODA
- Robert Geisberger, Peter Sanders, Dominik Schultes, Daniel Delling (2008), “Contraction Hierarchies: Faster and Simpler Hierarchical Routing in Road Networks”, WEA
- Daniel Delling, Andrew V. Goldberg, Thomas Pajor, Renato F. Werneck (2011), “Customizable Route Planning”, SEA
- Julian Dibbelt, Ben Strasser, Dorothea Wagner (2014), “Customizable Contraction Hierarchies”, SEA
- Hannah Bast va boshq. (2016), “Route Planning in Transportation Networks”, Algorithm Engineering (sharh)
- Paul Newson, John Krumm (2009), “Hidden Markov Map Matching Through Noise and Sparseness”, ACM SIGSPATIAL GIS
- M. J. Lighthill, G. B. Whitham (1955), “On Kinematic Waves II”; P. I. Richards (1956), “Shock Waves on the Highway”
- Harold W. Kuhn (1955), “The Hungarian Method for the Assignment Problem”
- Uber muhandislik blogi (2022), “DeepETA: How Uber Predicts Arrival Times Using Deep Learning”
- Uber muhandislik blogi (2018), “H3: Uber’s Hexagonal Hierarchical Spatial Index”; H3 hujjatlari (h3geo.org)
- Uber muhandislik blogi (2017), “Meet Michelangelo: Uber’s Machine Learning Platform”
- 9th DIMACS Implementation Challenge — Shortest Paths (2006)
- Uber yillik hisobotlari (2023–2024)
