Ovqat yetkazib berishda kuryerlar dispetcherlashi qanday ishlaydi
Chuqur3 daqInnovialabs tahririyati
Qisqacha
Dispetcherlash — har bir necha soniyada tayyorlanayotgan buyurtmalar va bo‘sh kuryerlarni yig‘ib, variantlarni yetkazish va kutish vaqti bo‘yicha baholab, eng yaxshisini tayinlaydigan sikl; ETA va kuzatuv kuryerlardan keladigan GPS-koordinatalar oqimiga asoslanadi.
Qisqacha qanday tuzilgan
Yetkazib berish dispetcheri bitta vazifani qayta-qayta hal qiladi: qaysi kuryer qaysi buyurtmalarni va qanday tartibda olib boradi. Zamonaviy servislarda bu xarita bilan o‘tirgan odam emas, sikllar bilan ishlaydigan algoritm:
- tez orada kuryer kerak bo‘ladigan buyurtmalar pulini yig‘adi;
- kuryerlar pulini yig‘adi: bo‘shlar va tez orada bo‘shaydiganlar;
- «kuryer — buyurtmalar» juftliklarini xarajat funksiyasi bo‘yicha baholaydi;
- eng yaxshi variantlarni tayinlab, kuryer ilovasiga topshiriq yuboradi.
Inson-dispetcher istisnolar uchun qoladi: rad etishlar, YTH, muammoli manzillar.
Kuryerni qachon tayinlash kerak
Asosiy g‘oya — kuryer restoranga buyurtma tayyor bo‘lgan paytda yetib kelishi kerak. Erta kelsa — bekor turadi va boshqa buyurtmalarni olib bormaydi. Kech kelsa — ovqat soviydi.
Shuning uchun tizim hisoblaydi:
- tayyorlash vaqti — restoran tarixi, buyurtmadagi taomlar va oshxonaning joriy yuklamasi bo‘yicha;
- kuryerning restoranga yetib kelish vaqti;
- tayinlash momenti = tayyor bo‘lish vaqti minus yetib kelish vaqti minus kichik zaxira.
Restoran planshet yoki KDS’da holatlarni belgilasa, aniqlik oshadi: «qabul qilindi», «tayyorlanmoqda», «tayyor». Bu signallarsiz tizim faqat prognozga tayanadi.
Batching: buyurtmalarni birlashtirish
Batching — bitta kuryer bir safarda bir nechta buyurtmani olib borishi. Bu gavjum soatlarda kuryerlarni tejaydi, lekin birinchi buyurtmani kechiktirish xavfi bor.
Birlashtirish odatda o‘zini oqlaydigan shartlar:
- buyurtmalar bitta yoki qo‘shni restoranlardan;
- yetkazish manzillari bir yo‘nalishda;
- tayyor bo‘lish vaqtlari yaqin;
- har bir buyurtma uchun qo‘shimcha kechikish biznes belgilagan chegaradan oshmaydi.
Batch ichidagi nuqtalar tartibi — soddalashtirilgan marshrutlash masalasi (vaqt oynalari bilan TSP varianti). Ikki-uch buyurtma uchun barcha variantlarni sinab ko‘rish mumkin, katta hajmlarda evristikalar qo‘llanadi.
Tayinlash mantig‘i
Har bir «kuryer + buyurtmalar to‘plami» varianti xarajat oladi, masalan:
cost = w1 * mijozgacha_vaqt
+ w2 * kuryerning_restoranda_kutishi
+ w3 * va’da_qilingan_ETA_dan_kechikish
+ w4 * kuryer_bosib_o‘tgan_masofa
Vaznlarni biznes sozlaydi: nima muhimroq — mijoz uchun tezlik yoki kuryerlar bandligi. Keyin masala tayinlash masalasiga aylanadi: umumiy xarajati eng kam juftliklarni tanlash. Yondashuvlar:
- ochko‘z (greedy): eng yaxshi mavjud variantni navbat bilan tayinlash — oddiy va tez, lekin optimal emas;
- optimallashtiruvchi: butun pul uchun tayinlashni birdaniga hal qilish (masalan, venger algoritmi yoki solverlar) — natija yaxshiroq, amalga oshirish murakkabroq;
- kechiktirilgan qaror: buyurtma bir necha soniya kutadi, balki qulayroq juftlik paydo bo‘lar.
Qo‘shimcha ravishda transport turi, termosumka sig‘imi, kuryer zonasi va smena tugashigacha qolgan vaqt hisobga olinadi.
ETA qanday hisoblanadi
ETA bosqichlardan tashkil topadi:
| Bosqich | Baholash manbai |
|---|---|
| Tayyorlash | Restoran tarixi, buyurtma tarkibi, oshxona yuklamasi |
| Kuryerning restoranga kelishi | Marshrut va yo‘l harakati ma’lumotlari |
| Buyurtmani topshirish | Aynan shu restorandagi o‘rtacha kechikish |
| Yetkazish | Transport turini hisobga olgan holda mijozgacha marshrut |
| «Oxirgi metrlar» | Manzil turi: ofis, shlagbaumli turar-joy majmuasi, xususiy uy |
Odatda bosqichlar bo‘yicha oddiy o‘rtachalardan boshlashadi, keyin haqiqiy vaqtlarda o‘qitilgan ML-modelga o‘tishadi. Har bir holat o‘zgarganda ETA’ni qayta hisoblash va mijozga optimistik nuqta emas, halol oraliqni ko‘rsatish muhim.
Kuzatuv arxitekturasi
Odatiy sxema:
- kuryer ilovasi har bir necha soniyada GPS-koordinatalarni yuboradi, aloqa yomon bo‘lsa nuqtalarni to‘plab yuboradi;
- qabul qilish shlyuzi ularni navbat yoki oqimga yozadi (Kafka, Redis Streams va shunga o‘xshashlar);
- joylashuv servisi eng yaqin kuryerlarni topish uchun geoindeksli tezkor xotirada har bir kuryerning oxirgi pozitsiyasini saqlaydi;
- dispetcher pozitsiyalar va buyurtma holatlarini o‘qiydi;
- mijoz yangilanishlarni WebSocket yoki davriy so‘rov orqali oladi.
Amaliy jihatlar: GPS sakrashlarini filtrlash, kuryer telefoni batareyasini tejash, bahsli holatlarni tahlil qilish uchun treklar tarixini saqlash va geolokatsiyani soxtalashtirishdan himoya.
Ko‘p uchraydigan xatolar
- Kuryerni buyurtma rasmiylashtirilishi bilanoq tayinlash — u oshxonada uzoq kutadi.
- Birinchi mijozga sovuq ovqat yetib boradigan agressiv batching.
- «Oxirgi metrlar» va aniq restoran yuklamasini hisobga olmaydigan ETA.
- Algoritm xato qilganda dispetcher uchun qo‘lda boshqarish rejimining yo‘qligi.