Disponibilitatea hotelului și recomandarea camerei Algoritm @ MMT

La MakeMyTrip, servim un set divers de cumpărători de hoteluri și îi ajutăm să finalizeze planurile, având în vedere scopul de călătorie, ocuparea și informațiile lor variate. Acestea fiind spuse, cele două cele mai importante nevoi ale utilizatorului care trebuie îndeplinite pentru toate sunt aceleași - disponibilitatea hotelului și prețul camerei, în funcție de bugetul cuiva. În această postare de pe blog, împărtășim câteva informații despre cum am sporit disponibilitatea generală a hotelului pe platforma noastră și am folosit programarea dinamică pentru a rezolva problema de a găsi „cea mai ieftină combinație de camere” pentru a face oferta mai puternică și mai utilă clienților noștri.

Să înțelegem mai întâi de ce disponibilitatea hotelului și prețurile camerei, în special cele mai ieftine, sunt atât de importante.

Disponibilitatea hotelului: este extrem de important să afișăm clienților suficiente hoteluri pentru a alege de pe pagina de înregistrare a hotelului. Zero sau disponibilitatea redusă a hotelurilor duce la scăderea multor clienți pe pagina de listare, ceea ce duce la o posibilă pierdere de afaceri.

Prețul camerei: Majoritatea călătorilor compară prețurile camerelor pentru un hotel din agențiile de turism online (OTA) și fac o tranzacție cu OTA care oferă cel mai ieftin preț. Având în vedere că un număr semnificativ de rezervări se întâmplă în camere cu prețul cel mai ieftin, devine important să se afișeze / evidențieze cel mai ieftin preț al camerei pe pagina cu detalii despre hotel pentru a ajuta clientul să ia o decizie rapidă.

Disponibilitate scăzută la hotel

Descoperirea problemelor

La MakeMyTrip, înregistrăm o mulțime de date și o analizăm în mod regulat pentru a oferi informații despre acțiune. Una dintre descoperirile noastre recente a fost disponibilitatea hotelului scăzută sau nulă pe pagina de listare a hotelului pentru un număr semnificativ de căutări în oraș. Au existat în primul rând două motive pentru aceasta:

  • Mai puține stocuri disponibile în perioada de vârf / weekend-uri lungi
  • Ratele lipsă în sistemul de inventar MakeMyTrip pentru ocuparea solicitată (de exemplu, hotelier nu a configurat tarife pentru 3 adulți)

Să luăm un exemplu pentru a înțelege mai bine acest lucru. Mai jos este prezentată o imagine a inventarului încărcat de hotelier în sistemul nostru pentru hotelul „X” (A înseamnă pentru adult și C pentru copil).

Fig (1): Instantaneă de inventar

Căutare utilizator 1 (2 Camere: Cameră 1–1A, Cameră 2–1A) - În acest caz, deși avem 3 (deși diferite tipuri) de camere disponibile, returnam zero disponibilități de hotel, întrucât corespundem criteriilor de căutare pentru fiecare tipul camerei și niciunul din tipul camerei nu a avut număr de inventar ≥2.

Căutare utilizator 2 (camera 1-3A) - De asemenea, în acest caz, ne întoarcem disponibilitatea zero a hotelurilor, deoarece hotelierul nu a configurat tarifele pentru criteriile de căutare de mai sus.

În ambele cazuri, a existat o modalitate de a îndeplini criteriile de căutare a utilizatorilor prin combinarea diferitelor tipuri de camere. Problema devine mult mai complexă, deoarece fiecare hotel are propriul prag de vârstă al copilului și prețurile corespunzătoare.

Soluție în trei puncte

  1. Schimbarea criteriilor de căutare - Am încetat să potrivim criteriile exacte de căutare a utilizatorilor pentru fiecare tip de cameră și am început să căutăm cu cerere de căutare transformată. Acest lucru se face în special pentru căutările de ocupare mai ridicate, dacă disponibilitatea este în general scăzută.
  2. Construiți cel mai ieftin algoritm de combinație de cameră - Pentru clienții noștri, cea mai ieftină ofertă este cea mai bună. Pentru a rezolva această problemă și disponibilitatea hotelului, a avut sens să construim un algoritm pentru a prezenta utilizatorilor cea mai ieftină combinație de camere.
  3. Rugați hotelierii să configureze prețurile pentru ocupare mai mare - Deoarece 60% dintre utilizatori călătoresc singuri sau ca un cuplu, în general hotelierii optimizează tarifele și inventarul pentru ocupare unică și dublă. Pentru a ajuta clienții să obțină rezultate de căutare mai bune pentru ocuparea> 2, am solicitat hotelierilor să configureze toate combinațiile posibile pe care le acceptă.

Iată cum am crezut că soluția generală ar trebui să funcționeze.

Fig (2): diagrama de flux

(1) și (2) sunt evidențiate în verde. În funcție de canalul de la care se consumă hotelul, este posibil să avem sau nu informațiile necesare pentru a rula cel mai ieftin algoritm de combinație a camerei. Pentru a gestiona astfel de cazuri, am creat niște algoritmi suplimentari pentru a genera / prezice datele cerute (numărul inventarului fiind unul dintre ele).

Impactul asupra afacerii

Am implementat atât (1) cât și (2). După cum era de așteptat, disponibilitatea hotelului a crescut de mai multe ori pe pagina noastră de înregistrare pentru solicitări de căutare a mai mult de 2 adulți. De asemenea, am început să obținem cu 5% nopți de cameră în fiecare zi. În general, s-a înregistrat un salt de peste 50% în numărul de rezervări cu mai mult de 2 adulți.

Fig (3): tendința de rezervare înainte și după lansarea funcției

Provocări și abordări de calcul

Cea mai ieftină problemă de recomandare a camerei este o problemă de optimizare combinatorie.

Având în vedere N camere de hotel și P (adulți + copii), găsiți cea mai ieftină combinație de camere pentru a găzdui oaspeții P.

Pentru a rula orice algoritm de optimizare, a fost necesar să obținem atribute de date necesare pentru:

  • Generați toate locurile de muncă posibile pentru o cameră
  • Calculați prețul pentru astfel de cazuri

Pentru aceasta, am început să consumăm atribute la nivel de hotel și cameră, cum ar fi pragul de vârstă al copilului, adulți maxim / copii permisi într-o cameră, numărul de disponibilități pentru fiecare tip de cameră, preț suplimentar pentru adulți, etc. până la care nu va percepe un cost suplimentar (bază de ocupare), la care vârsta copilului va considera oaspeți drept copil, preț suplimentar pentru copii, preț suplimentar pentru adulți, max. adulți / copii care pot fi adăpostiți în fiecare cameră. Toate acestea trebuie să fie îngrijite în timp ce se generează și se calculează prețul fiecărei camere și locurilor de muncă. Manevrarea acestor atribute a mărit multifoldul de complexitate calculală. Provocarea suplimentară a fost menținerea intactă a aplicațiilor de căutare. Aceste calcule vor fi făcute în timp real și la cerere conținând 200-250 de hoteluri.

În timp ce am avut întotdeauna în minte o programare dinamică pentru a rezolva această problemă, am luat în considerare soluția de forță brută și câteva abordări lacome pentru a vedea dacă au fost suficiente / au funcționat pentru cazurile noastre de utilizare.

Soluție Brute Force: Aceasta presupunea crearea fiecărei combinații posibile pentru inventarul dat cu toate planurile tarifare. Aceste camere ar trebui apoi să fie puse în club cu diferite combinații de ocupare. Aceasta a dus la o complexitate exponențială a timpului.

Fig (4): Abordarea forței brute are ca rezultat o complexitate de timp exponențială

Acest lucru era posibil, dar nu poate fi scalabil. De asemenea, va adăuga latență semnificativă a api de căutare.

Abordări lacome: am explorat câteva strategii, dar am găsit un caz în fiecare dintre ele. Problema de bază a fost aceea că nu avem camere clasificate în funcție de preț și de pax (oaspete). Mai mult, orice cameră / suite superioară poate găzdui mai multe persoane în comparație cu o cameră standard.

Cel mai ieftin algoritm de combinație de camere

Să înțelegem câțiva termeni și notări înainte de a sări la algoritm.

Fig (5): terminologie pentru cel mai ieftin algoritm de combinație de camere

Am modelat problema de a găsi cea mai ieftină combinație de camere în jurul celebrei probleme 0-1 la rucsac. Articolele (N) și greutățile (W) din problemele de rucsac se potrivesc cu ușurință la setul de camere fizice din hotel și la diferite combinații posibile de ocupare (începând cu 0 și până la ocuparea solicitată). Cu toate acestea, au existat anumite constrângeri unice în cazul nostru care au necesitat o manipulare specială.

  1. Subarticule / Camere virtuale: Fiecare articol este unic în problemele 0-1 de la doză, dar acest lucru nu este adevărat în cazul nostru. O cameră fizică (articol) trebuie luată în considerare cu toate locurile și tarifele posibile pentru a asigura unicitatea setului de articole. Aceasta duce la crearea de camere virtuale pentru fiecare cameră fizică. N în problemele 0-1 de la sacul de mână se ocupă de fapt setul de camere virtuale din cazul nostru.
  2. Asigurarea camerei fizice este folosită o singură dată: Aceasta este o implicație directă a (1). Deși folosim camere virtuale pentru toate calculele și deciziile din algoritm, trebuie să ne asigurăm că o cameră fizică este utilizată o singură dată pentru fiecare combinație de camere și trebuie să găsim cea mai bună alternativă în caz de conflict.
  3. Cazuri de margine în timp ce completați ocuparea rămasă: Am trebuit să gestionăm câteva cazuri de margine, făcând referire la sub-problemele rezolvate deja. de exemplu, multe hoteluri nu permit rezervarea cu o cameră care are doar copii. De asemenea, trebuie să ne ocupăm de cazurile în care am îndeplinit gradul de ocupare a adulților printr-o cameră virtuală și rămâne doar ocuparea copiilor.

Pași cheie pentru construirea algoritmului

  1. Obțineți rezultatul solicitării de căutare transformate.
  2. Creați o matrice T în 2 dimensiuni cu toate locurile posibile de cameră ca coloane (W) și camere virtuale ca rânduri (N).
  3. La fiecare celulă a matricei bidimensionale, avem în vedere două posibilități - să selectăm camera virtuală corespunzătoare ca parte a soluției optime sau să o eliminăm. Calculăm costurile asociate cu sau fără acea cameră virtuală și alegem cea mai ieftină. Fiecare celulă matrice stochează atributele cheie ale camerelor care sunt utilizate pentru a îndeplini gradul de ocupare al acelei celule.

Matricea este completată într-un mod de jos în sus folosind relația de repetare de mai jos:

Fig (6): Formula de calcul

4. Întoarceți rezultatul după parcurgerea matricei.

Exemplu:

Fig (7): Detalii despre nivel de cameră / tarif

Pentru parametrii de intrare de mai sus, va fi creată următoarea matrice bidimensională. Coloana în portocaliu surprinde prețul corespunzător fiecărei camere virtuale, conform configurațiilor efectuate de hotelier.

Fig (8): Matricea 2D care prezintă intrări pentru 3 adulți și 2 copii. Înregistrările nule au fost marcate drept „X”.

Celulele evidențiate în verde arată cea mai ieftină combinație de camere pentru criteriile de căutare specificate. Identificatorii de cameră menționați în celulă descriu care sunt camerele care trebuie luate în considerare și abonamentele lor definesc gradul de ocupare a fiecărei camere. Celulele evidențiate în albastru sunt cele utilizate pentru calcularea celulelor verzi în mod recursiv (folosind relația de recurență menționată mai sus).

Acest algoritm a funcționat destul de bine în producție, fără a afecta 99a latență procentuală a API-ului nostru de căutare. Chiar și după plasarea acestor rezultate din recomandări, în fiecare minut procesăm în jur de 15K combinații hoteliere unice.

Mulțumiri speciale pentru Ajay Singh și Abhijeet Sharad pentru contribuția la redactarea acestui blog.