Algorithmus für Hotelverfügbarkeit und Zimmerempfehlung bei MMT

Bei MakeMyTrip bedienen wir eine Vielzahl von Hotelkäufern und helfen ihnen dabei, Pläne zu erstellen, die ihren unterschiedlichen Reisezwecken, Belegungs- und Informationsanforderungen entsprechen. Davon abgesehen sind die beiden wichtigsten Benutzeranforderungen, die für alle erfüllt werden müssen, gleich: Verfügbarkeit des Hotels und Zimmerpreis nach Budget. In diesem Blog-Beitrag geben wir Einblicke, wie wir die Gesamtverfügbarkeit von Hotels auf unserer Plattform erhöht und mithilfe dynamischer Programmierung das Problem gelöst haben, die "günstigste Kombination von Zimmern" zu finden, um das Angebot für unsere Kunden leistungsfähiger und nützlicher zu machen.

Lassen Sie uns zunächst verstehen, warum Hotelverfügbarkeit und Zimmerpreise, insbesondere die günstigsten, so wichtig sind.

Verfügbarkeit von Hotels: Es ist von größter Wichtigkeit, dem Kunden genügend Hotels zur Auswahl auf der Seite mit den Hoteleinträgen anzuzeigen. Die Nichtverfügbarkeit oder geringe Verfügbarkeit von Hotels führt dazu, dass viele Kunden auf die Listenseite selbst fallen, was zu einem möglichen Geschäftsverlust führen kann.

Zimmerpreis: Die meisten Reisenden vergleichen die Zimmerpreise für ein Hotel in Online-Reisebüros (OTAs) und tätigen eine Transaktion für das OTA, das den günstigsten Preis bietet. Da eine erhebliche Anzahl von Buchungen für Zimmer mit dem günstigsten Preis erfolgt, ist es wichtig, den günstigsten Zimmerpreis auf der Seite mit den Hoteldetails anzuzeigen / hervorzuheben, damit der Kunde eine schnelle Entscheidung treffen kann.

Niedrige Hotelverfügbarkeit

Problemerkennung

Bei MakeMyTrip werden viele Daten protokolliert und regelmäßig analysiert, um umsetzbare Erkenntnisse zu erhalten. Einer unserer jüngsten Befunde war, dass auf der Seite mit den Hotelauflistungen für eine signifikante Anzahl von Stadtsuchen keine oder nur eine geringe Hotelverfügbarkeit vorhanden war. Dafür gab es vor allem zwei Gründe:

  • In der Hauptsaison / an langen Wochenenden ist weniger Inventar verfügbar
  • Fehlende Preise im MakeMyTrip-Inventarsystem für die angeforderte Belegung (z. B. Hotelier hat keine Preise für 3 Erwachsene konfiguriert)

Nehmen wir ein Beispiel, um dies besser zu verstehen. Im Folgenden finden Sie eine Momentaufnahme des Inventars, das der Hotelier in unserem System für das Hotel "X" hochgeladen hat (A steht für Erwachsene und C für Kinder).

Abb. 1: Bestandsaufnahme

Benutzersuche 1 (2 Zimmer: Zimmer 1–1A, Zimmer 2–1A) - In diesem Fall haben wir, obwohl wir 3 (obwohl unterschiedliche) Zimmer zur Verfügung haben, keine Hotelverfügbarkeit zurückgegeben, da wir die Suchkriterien für jedes Zimmer abgeglichen haben Zimmertyp und keiner der Zimmertypen hatte eine Inventarzahl ≥2.

Benutzersuche 2 (Zimmer 1 - 3A) - Auch in diesem Fall haben wir die Verfügbarkeit von Hotels auf Null zurückgesetzt, da der Hotelier keine Preise für die oben genannten Suchkriterien konfiguriert hat.

In beiden Fällen gab es eine Möglichkeit, die Suchkriterien der Benutzer zu erfüllen, indem verschiedene Arten von Räumen kombiniert wurden. Das Problem wird immer komplexer, da jedes Hotel eine eigene Altersgrenze für Kinder und entsprechende Preise hat.

Dreipunktlösung

  1. Ändern der Suchkriterien - Wir haben aufgehört, die genauen Benutzersuchkriterien für jeden Zimmertyp zu erfüllen, und haben die Suche mit der transformierten Suchanfrage gestartet. Dies gilt insbesondere für Suchen mit höherer Belegung, bei denen die Verfügbarkeit im Allgemeinen niedrig ist.
  2. Bauen Sie den günstigsten Algorithmus für die Raumkombination - Für unsere Kunden ist das günstigste Angebot das beste. Um dies und das Problem der Hotelverfügbarkeit zu lösen, war es sinnvoll, einen Algorithmus zu entwickeln, um den Benutzern die günstigste Kombination von Zimmern zu präsentieren.
  3. Bitten Sie die Hoteliers, die Preise für eine höhere Belegung zu konfigurieren. - Da 60% der Benutzer alleine oder zu zweit reisen, optimieren die Hoteliers im Allgemeinen die Preise und den Lagerbestand für Einzel- und Doppelbelegung. Um Kunden zu helfen, bessere Suchergebnisse für Belegung> 2 zu erhalten, haben wir die Hoteliers gebeten, alle möglichen Belegungskombinationen zu konfigurieren, die sie unterstützen.

Hier ist, wie wir dachten, die Gesamtlösung sollte funktionieren.

Bild (2): Flussdiagramm

(1) und (2) sind grün hervorgehoben. Abhängig vom Kanal, von dem aus das Hotel genutzt wird, verfügen wir möglicherweise über die erforderlichen Informationen, um den Algorithmus für die günstigste Zimmerkombination auszuführen. Um solche Fälle zu bewältigen, haben wir einige zusätzliche Algorithmen entwickelt, um die erforderlichen Daten zu generieren / vorherzusagen (Inventurzählung ist eine davon).

Auswirkungen auf das Geschäft

Wir haben sowohl (1) als auch (2) implementiert. Wie erwartet hat sich die Hotelverfügbarkeit auf unserer Listenseite für Suchanfragen von mehr als 2 Erwachsenen vervielfacht. Wir bekamen auch täglich 5% zusätzliche Übernachtungen. Insgesamt stieg die Anzahl der Buchungen mit mehr als 2 Erwachsenen um über 50%.

Abb. 3: Buchungstrend vor und nach dem Feature-Release

Rechnerische Herausforderungen und Herangehensweise

Das günstigste Raumempfehlungsproblem ist ein kombinatorisches Optimierungsproblem.

Bei N Hotelzimmern und P (Erwachsene + Kinder) finden Sie die günstigste Zimmerkombination für P Gäste.

Um einen Optimierungsalgorithmus ausführen zu können, mussten Datenattribute abgerufen werden, die für Folgendes erforderlich sind:

  • Generieren Sie alle möglichen Belegungen für einen Raum
  • Berechnen Sie den Preis für solche Fälle

Zu diesem Zweck haben wir begonnen, Attribute auf Hotel- und Zimmerebene zu verwenden, z. B. Altersschwelle für Kinder, maximal zulässige Erwachsene / Kinder in einem Zimmer, Anzahl der verfügbaren Zimmer für jeden Zimmertyp, Preis für zusätzliche Erwachsene usw. Jeder Hotelier kann seine Tarifdetails wie Belegung unabhängig konfigurieren Bis zu welchem ​​Alter wird der Gast als Kind betrachtet? Zusätzlicher Preis für Kinder? Zusätzlicher Preis für Erwachsene? Maximaler Preis für Erwachsene / Kinder, die in jedem Zimmer untergebracht werden können? All dies muss bei der Erstellung und Berechnung des Preises für jedes Zimmer und jede Belegung berücksichtigt werden. Die Handhabung dieser Attribute erhöhte die rechnerische Komplexität um ein Vielfaches. Eine weitere Herausforderung bestand darin, die Latenzen der Suchanfragen intakt zu halten. Diese Berechnungen sind in Echtzeit und auf Anfrage mit 200 bis 250 Hotels durchzuführen.

Während wir immer an dynamische Programmierung gedacht hatten, um dieses Problem zu lösen, haben wir die Brute-Force-Lösung und einige gierige Ansätze in Betracht gezogen, um zu sehen, ob sie für unsere Anwendungsfälle ausreichten / funktionierten.

Brute-Force-Lösung: Hierbei wurde jede mögliche Kombination für das angegebene Inventar mit allen Tarifplänen erstellt. Diese Räume müssten dann auch mit unterschiedlichen Belegungskombinationen mit einer Keule versehen werden. Dies führte zu einer exponentiellen zeitlichen Komplexität.

Abb. 4: Der Brute-Force-Ansatz führt zu einer exponentiellen zeitlichen Komplexität

Dies war machbar, aber nicht skalierbar. Es wird auch eine signifikante Latenz der Such-API hinzufügen.

Gierige Ansätze: Wir haben einige Strategien untersucht, aber in jedem einen Gegenfall gefunden. Das Grundproblem war, dass wir keine Zimmer haben, die nach Preis und Belegung (für Gäste) sortiert sind. Darüber hinaus kann jedes Superior-Zimmer / jede Superior-Suite im Vergleich zu einem Standardzimmer mehr Personen beherbergen.

Der günstigste Algorithmus zur Raumkombination

Lassen Sie uns ein paar Begriffe und Notationen verstehen, bevor wir zum Algorithmus springen.

Abb. 5: Terminologie für den Algorithmus der günstigsten Raumkombination

Wir haben das Problem modelliert, die günstigste Kombination von Räumen um das sehr berühmte 0-1-Rucksackproblem herum zu finden. Die Elemente (N) und Gewichte (W) in der Rucksackaufgabe werden lose der Menge der physischen Räume im Hotel und den verschiedenen möglichen Belegungskombinationen zugeordnet (von 0 bis zur gewünschten Belegung). In unserem Fall gab es jedoch einige spezielle Einschränkungen, die eine besondere Behandlung erforderten.

  1. Unterelemente / Virtuelle Räume: Jedes Element ist im 0-1-Rucksackproblem einzigartig, aber dies ist in unserem Fall nicht der Fall. Ein physischer Raum (Gegenstand) muss bei allen möglichen Belegungen und Tarifen berücksichtigt werden, um die Eindeutigkeit des Gegenstandssatzes sicherzustellen. Dies führt zur Erstellung virtueller Räume für jeden physischen Raum. Das N im Rucksackproblem 0–1 ist in unserem Fall der Menge der virtuellen Räume zugeordnet.
  2. Sicherstellen, dass der physische Raum einmal genutzt wird: Dies ist eine direkte Implikation von (1). Während wir für alle Berechnungen und Entscheidungen im Algorithmus virtuelle Räume verwenden, muss sichergestellt sein, dass ein physischer Raum für jede Raumkombination nur einmal verwendet wird und im Falle eines Konflikts die beste Alternative gefunden werden muss.
  3. Randfälle beim Ausfüllen der Restbelegung: Wir mussten unter Bezugnahme auf die bereits gelösten Teilprobleme einige Randfälle behandeln. z.B. Viele Hotels erlauben keine Buchungen mit Zimmern, die nur Kinder haben. Wir müssen auch Fälle behandeln, in denen wir die Belegung durch Erwachsene durch einen virtuellen Raum erfüllt haben und nur die Belegung durch Kinder übrig bleibt.

Wichtige Schritte zum Erstellen des Algorithmus

  1. Ergebnis einer transformierten Suchanfrage abrufen.
  2. Erstellen Sie eine zweidimensionale Matrix T mit allen möglichen Raumbelegungen als Spalten (W) und virtuellen Räumen als Zeilen (N).
  3. In jeder Zelle der zweidimensionalen Matrix betrachten wir zwei Möglichkeiten - den entsprechenden virtuellen Raum als Teil der optimalen Lösung auszuwählen oder ihn zu verwerfen. Wir berechnen die mit und ohne diesen virtuellen Raum verbundenen Kosten und wählen den günstigsten aus. Jede Matrixzelle speichert die Schlüsselattribute von Räumen, die zur Erfüllung der Belegung dieser Zelle verwendet werden.

Die Matrix wird mit der folgenden Wiederholungsrelation von unten nach oben gefüllt:

Bild (6): Berechnungsformel

4. Geben Sie das Ergebnis nach dem Durchlaufen der Matrix zurück.

Beispiel:

Abb. (7): Angaben zur Zimmer- / Tarifebene

Für die obigen Eingabeparameter wird die folgende zweidimensionale Matrix erstellt. Die orangefarbene Spalte enthält den Preis für jedes virtuelle Zimmer gemäß den vom Hotelier vorgenommenen Konfigurationen.

Abb. 8: Die 2D-Matrix mit Einträgen für 3 Erwachsene und 2 Kinder. Null-Einträge wurden mit

Grün hervorgehobene Zellen zeigen die günstigste Raumkombination für die angegebenen Suchkriterien an. In der Zelle erwähnte Raumkennungen beschreiben, welche Räume berücksichtigt werden sollen, und ihre Indizes definieren die Belegung jedes Raums. Blau hervorgehobene Zellen werden verwendet, um die grüne Zelle rekursiv zu berechnen (unter Verwendung der oben erwähnten Wiederholungsrelation).

Dieser Algorithmus hat in der Produktion ziemlich gut funktioniert, ohne die 99. Perzentil-Latenz unserer Such-API zu beeinträchtigen. Auch nach dem Zwischenspeichern dieser Empfehlungsergebnisse verarbeiten wir jede Minute etwa 15.000 einzigartige Hotelkombinationen.

Besonderer Dank geht an Ajay Singh und Abhijeet Sharad für die Unterstützung beim Entwurf dieses Blogs.