ขั้นตอนวิธีการแนะนำห้องพักโรงแรมและห้องพัก @ MMT

ที่ MakeMyTrip เราให้บริการชุดผู้ซื้อโรงแรมที่หลากหลายและช่วยให้พวกเขาสรุปแผนได้ตามวัตถุประสงค์การเดินทางการเข้าพักและข้อมูลที่หลากหลาย ดังที่ได้กล่าวไว้ความต้องการของผู้ใช้ที่สำคัญสองประการซึ่งต้องเป็นไปตามนั้นคือความพร้อมของโรงแรมและราคาห้องพักตามงบประมาณของแต่ละคน ในโพสต์บล็อกนี้เราแบ่งปันข้อมูลเชิงลึกเกี่ยวกับวิธีเพิ่มจำนวนห้องว่างของโรงแรมโดยรวมบนแพลตฟอร์มของเราและใช้การเขียนโปรแกรมแบบไดนามิกเพื่อแก้ปัญหาในการค้นหา 'ชุดค่าผสมที่ถูกที่สุดของห้องพัก' เพื่อให้ข้อเสนอมีประสิทธิภาพมากขึ้น

ให้เราเข้าใจก่อนว่าทำไมห้องว่างของโรงแรมและราคาห้องพักโดยเฉพาะราคาที่ถูกที่สุดนั้นสำคัญมาก

โรงแรมที่ว่าง: มันเป็นสิ่งสำคัญยิ่งที่จะแสดงให้ลูกค้าเห็นโรงแรมมากพอที่จะเลือกจากหน้ารายชื่อโรงแรม โรงแรมที่มีศูนย์ว่างหรือต่ำส่งผลให้ลูกค้าจำนวนมากลดลงในหน้ารายชื่อซึ่งนำไปสู่การสูญเสียทางธุรกิจที่อาจเกิดขึ้น

ราคาห้องพัก: นักเดินทางส่วนใหญ่เปรียบเทียบราคาห้องพักสำหรับโรงแรมในตัวแทนการท่องเที่ยวออนไลน์ (OTA) และทำธุรกรรมกับ OTA โดยเสนอราคาที่ถูกที่สุด เมื่อพิจารณาถึงจำนวนการจองที่เกิดขึ้นกับห้องที่มีราคาถูกที่สุดสิ่งสำคัญคือการแสดง / เน้นราคาห้องพักที่ถูกที่สุดในหน้ารายละเอียดโรงแรมเพื่อช่วยให้ลูกค้าตัดสินใจได้อย่างรวดเร็ว

โรงแรมว่างต่ำ

การค้นพบปัญหา

ที่ MakeMyTrip เราบันทึกข้อมูลจำนวนมากและวิเคราะห์เป็นประจำเพื่อหาข้อมูลเชิงลึกที่สามารถดำเนินการได้ หนึ่งในสิ่งที่เราค้นพบเมื่อไม่นานมานี้คือความพร้อมของโรงแรมในระดับต่ำหรือศูนย์บนหน้ารายชื่อโรงแรมสำหรับการค้นหาในเมืองจำนวนมาก มีสองเหตุผลหลักสำหรับเรื่องนี้:

  • มีสินค้าคงคลังน้อยลงในช่วงฤดูท่องเที่ยว / วันหยุดยาว
  • อัตราการขาดหายไปในระบบสินค้าคงคลัง MakeMyTrip สำหรับการเข้าพักที่ร้องขอ (เช่น hotelier ไม่ได้กำหนดอัตราสำหรับผู้ใหญ่ 3 คน)

ลองยกตัวอย่างเพื่อทำความเข้าใจกับสิ่งที่ดีกว่านี้ รับด้านล่างเป็นภาพรวมของสินค้าคงคลังที่อัปโหลดโดย hotelier ในระบบของเราสำหรับโรงแรม 'X' (ย่อมาจากผู้ใหญ่และ C สำหรับเด็ก)

รูปที่ (1): สแน็ปช็อตสินค้าคงคลัง

ค้นหาผู้ใช้ 1 (2 ห้อง: ห้อง 1–1A, ห้อง 2–1A) - ในกรณีนี้แม้ว่าเราจะมีห้องว่าง 3 (แม้ว่าจะมีหลายประเภท) แต่เรากลับมาที่โรงแรมที่ว่างเพราะเราตรงกับเกณฑ์การค้นหา ประเภทห้องและไม่มีประเภทห้องใดที่มีการนับสินค้าคงคลัง≥2

การค้นหาผู้ใช้ 2 (ห้องที่ 1 - 3A) - ในกรณีนี้เรากลับมาที่โรงแรมว่างเนื่องจากโรงแรมไม่ได้กำหนดอัตราสำหรับเกณฑ์การค้นหาข้างต้น

ในทั้งสองกรณีมีวิธีที่จะปฏิบัติตามเกณฑ์การค้นหาของผู้ใช้โดยการรวมห้องประเภทต่างๆ ปัญหามีความซับซ้อนมากขึ้นเนื่องจากโรงแรมแต่ละแห่งมีเกณฑ์อายุเด็กและราคาที่สอดคล้องกัน

วิธีแก้ปัญหาสามจุด

  1. เปลี่ยนเกณฑ์การค้นหา - เราหยุดการจับคู่เกณฑ์การค้นหาผู้ใช้ที่ตรงกับประเภทห้องพักแต่ละห้องและเริ่มค้นหาด้วยคำขอการแปลง สิ่งนี้จะทำโดยเฉพาะอย่างยิ่งสำหรับการค้นหาการเข้าพักที่สูงขึ้นโดยทั่วไปความพร้อมใช้งานต่ำ
  2. สร้างอัลกอริทึมการรวมห้องพักที่ถูกที่สุด - สำหรับลูกค้าของเราข้อตกลงที่ถูกที่สุดเป็นวิธีที่ดีที่สุด เพื่อช่วยแก้ปัญหานี้และปัญหาความพร้อมใช้งานของโรงแรมจึงควรสร้างอัลกอริทึมเพื่อแสดงผู้ใช้ด้วยห้องที่ถูกที่สุด
  3. ถามผู้ประกอบการโรงแรมเพื่อกำหนดราคาสำหรับการเข้าพักที่สูงขึ้น - เนื่องจาก 60% ของผู้ใช้เดินทางคนเดียวหรือเป็นคู่โรงแรมตากอากาศมักจะปรับอัตราและสินค้าคงคลังให้เหมาะสมสำหรับการเข้าพักเดี่ยวและคู่ เพื่อช่วยให้ลูกค้าได้รับผลการค้นหาที่ดีขึ้นสำหรับการเข้าพัก> 2 เราขอให้โรงแรมตากอากาศกำหนดค่าการเข้าพักที่เป็นไปได้ทั้งหมดที่พวกเขาสนับสนุน

นี่คือวิธีที่เราคิดว่าโซลูชันโดยรวมควรทำงานได้

รูปที่ (2): Flow Diagram

(1) และ (2) ถูกเน้นด้วยสีเขียว เราอาจมีหรือไม่มีข้อมูลที่จำเป็นในการเรียกใช้อัลกอริทึมการรวมห้องพักที่ถูกที่สุดทั้งนี้ขึ้นอยู่กับช่องทางที่โรงแรมใช้งาน เพื่อจัดการกรณีดังกล่าวเราได้สร้างอัลกอริธึมเพิ่มเติมเพื่อสร้าง / ทำนายข้อมูลที่ต้องการ (การนับสินค้าคงคลังเป็นหนึ่งในนั้น)

ผลกระทบทางธุรกิจ

เราดำเนินการทั้ง (1) และ (2) ตามที่คาดไว้ความพร้อมใช้งานของโรงแรมเพิ่มขึ้นหลายเท่าในหน้ารายการของเราสำหรับคำขอค้นหาของผู้ใหญ่มากกว่า 2 คน เราเริ่มได้รับห้องพักเพิ่มอีก 5% ทุกวัน โดยรวมมีจำนวนการจองมากกว่า 50% ที่มีผู้ใหญ่มากกว่า 2 คน

รูปที่ (3): แนวโน้มการจองก่อนและหลังการเปิดตัวคุณลักษณะ

ความท้าทายและวิธีการคำนวณ

ปัญหาการแนะนำห้องพักที่ถูกที่สุดคือปัญหาการเพิ่มประสิทธิภาพแบบ Combinatorial

ให้ห้องพักของโรงแรมใน N และแขกผู้เข้าพัก P (ผู้ใหญ่และเด็ก) ค้นหาห้องพักที่ถูกที่สุดเพื่อรองรับแขก P

ในการเรียกใช้อัลกอริธึมการเพิ่มประสิทธิภาพใด ๆ เราจำเป็นต้องได้รับคุณลักษณะข้อมูลที่จำเป็นเพื่อ:

  • สร้างโอกาสที่เป็นไปได้ทั้งหมดสำหรับห้องพัก
  • คำนวณราคาสำหรับกรณีดังกล่าว

สำหรับสิ่งนี้เราเริ่มใช้คุณลักษณะระดับโรงแรมและห้องพักเช่นเกณฑ์อายุเด็กสูงสุดผู้ใหญ่ / เด็กที่ได้รับอนุญาตในห้องจำนวนห้องว่างแต่ละประเภทราคาผู้ใหญ่พิเศษ ฯลฯ ผู้โรงแรมแต่ละคนสามารถกำหนดรายละเอียดอัตราค่าไฟฟ้าได้อย่างอิสระเช่นอาชีพ จนกว่าเขาจะไม่คิดค่าใช้จ่ายเพิ่มเติม (การเข้าพักขั้นพื้นฐาน) ซึ่งเขาจะพิจารณาเด็กเป็นแขกราคาเด็กเพิ่มราคาผู้ใหญ่เพิ่มผู้ใหญ่สูงสุด / เด็กสูงสุดที่สามารถเข้าพักได้ในแต่ละห้อง สิ่งเหล่านี้จำเป็นต้องได้รับการดูแลในขณะที่สร้างและคำนวณราคาของแต่ละห้องและการเข้าพัก การจัดการคุณสมบัติเหล่านี้เพิ่มความซับซ้อนหลายเท่าในการคำนวณ ความท้าทายเพิ่มเติมคือการรักษาความหน่วงของ API การค้นหาให้เหมือนเดิม การคำนวณเหล่านี้จะต้องทำตามเวลาจริงและสำหรับคำขอที่มีโรงแรม 200–250 แห่ง

ในขณะที่เรามีการเขียนโปรแกรมแบบไดนามิกอยู่ในใจเพื่อแก้ปัญหานี้เราได้พิจารณาวิธีการแก้ปัญหากำลังดุร้ายและวิธีการโลภไม่กี่เพื่อดูว่าพวกเขาพอเพียง / ทำงานสำหรับกรณีการใช้งานของเรา

Brute Force Solution: สิ่งนี้เกี่ยวข้องกับการสร้างชุดค่าผสมที่เป็นไปได้ทั้งหมดสำหรับสินค้าคงคลังที่กำหนดพร้อมแผนภาษีทั้งหมด ห้องเหล่านี้จะต้องมีการรวมกับการเข้าพักที่แตกต่างกันเช่นกัน สิ่งนี้ทำให้เกิดความซับซ้อนของเวลาแบบเอกซ์โปเนนเชียล

รูปที่ (4): Brute force approach ส่งผลให้เกิดความซับซ้อนของเวลาแบบเอกซ์โปเนนเชียล

นี่เป็นไปได้ แต่ไม่สามารถปรับขนาดได้ นอกจากนี้ยังเพิ่มความหน่วงแฝงที่สำคัญของ API การค้นหา

วิธีการโลภ: เราสำรวจกลยุทธ์บางอย่าง แต่พบกรณีตอบโต้ในแต่ละกลยุทธ์ ปัญหาพื้นฐานคือเราไม่มีห้องพักเรียงตามราคาและท่าน (แขก) พัก นอกจากนี้ห้องสุพีเรีย / ห้องสวีทสามารถรองรับผู้คนได้มากขึ้นเมื่อเทียบกับห้องมาตรฐาน

อัลกอริทึมการผสมห้องที่ถูกที่สุด

ให้เราเข้าใจคำศัพท์และสัญลักษณ์บางอย่างก่อนที่เราจะข้ามไปยังอัลกอริทึม

ภาพ (5): คำศัพท์สำหรับอัลกอริทึมการผสมห้องที่ถูกที่สุด

เราสร้างแบบจำลองปัญหาในการค้นหาชุดค่าผสมที่ถูกที่สุดของห้องพักที่มีปัญหามาก 0–1 เป้สะพายหลัง รายการ (N) และน้ำหนัก (W) ในปัญหาเป้สะพายหลังหลวมแผนที่ชุดของห้องทางกายภาพในโรงแรมและการรวมเข้าพักที่เป็นไปได้ที่แตกต่างกัน (เริ่มต้นจาก 0 และนำไปสู่การเข้าพักที่ร้องขอ) อย่างไรก็ตามมีข้อ จำกัด บางอย่างในกรณีของเราซึ่งจำเป็นต้องมีการจัดการเป็นพิเศษ

  1. รายการย่อย / ห้องเสมือน: แต่ละรายการไม่ซ้ำกันในปัญหาเป้ 0–1 แต่นั่นไม่เป็นความจริงในกรณีของเรา ห้องทางกายภาพ (รายการ) จะต้องได้รับการพิจารณาด้วยการครอบครองและภาษีที่เป็นไปได้ทั้งหมดเพื่อให้แน่ใจว่ามีเอกลักษณ์ในชุดของรายการ สิ่งนี้ส่งผลให้เกิดการสร้างห้องเสมือนจริงสำหรับแต่ละห้องทางกายภาพ ปัญหา N ในปัญหาเครื่องหลัง 0-1 นั้นตรงกับชุดของห้องเสมือนจริงในกรณีของเรา
  2. ให้แน่ใจว่ามีการใช้ห้องกายภาพหนึ่งครั้ง: นี่เป็นนัยโดยตรงของ (1) แม้ว่าเราจะใช้ห้องเสมือนจริงสำหรับการคำนวณและการตัดสินใจทั้งหมดในอัลกอริทึม แต่ก็ต้องมั่นใจว่าห้องฟิสิคัลจะใช้เพียงครั้งเดียวสำหรับการรวมกันของห้องและต้องการค้นหาทางเลือกที่ดีที่สุดในกรณีที่มีความขัดแย้ง
  3. กรณีขอบขณะเติมช่องว่างที่เหลือ: เราต้องจัดการกับกรณีขอบสองสามกรณีในขณะที่อ้างถึงปัญหาย่อยที่ได้รับการแก้ไขแล้ว เช่นโรงแรมจำนวนมากไม่อนุญาตให้จองห้องพักที่มีเด็กเท่านั้น นอกจากนี้เรายังต้องจัดการกับกรณีที่เราได้เข้าพักผู้ใหญ่ผ่านห้องเสมือนจริงและเหลือเพียงเด็กเท่านั้น

ขั้นตอนสำคัญในการสร้างอัลกอริทึม

  1. รับผลลัพธ์ของคำขอการแปลง
  2. สร้างเมทริกซ์ 2 มิติ T พร้อมการครอบครองห้องที่เป็นไปได้ทั้งหมดเช่นคอลัมน์ (W) และห้องเสมือนเป็นแถว (N)
  3. ในแต่ละเซลล์ของเมทริกซ์สองมิติเราจะพิจารณาความเป็นไปได้สองอย่าง - เพื่อเลือกห้องเสมือนที่สอดคล้องกันซึ่งเป็นส่วนหนึ่งของทางออกที่ดีที่สุดหรือเพื่อละทิ้งมัน เราคำนวณค่าใช้จ่ายที่เกี่ยวข้องกับและไม่มีห้องเสมือนนั้นและเลือกราคาถูกที่สุด แต่ละเซลล์เมทริกซ์จะเก็บคุณสมบัติที่สำคัญของห้องที่ใช้เพื่อเติมเต็มการครอบครองของเซลล์นั้น

เมทริกซ์นั้นเต็มไปด้วยแฟชั่นจากล่างขึ้นบนโดยใช้ความสัมพันธ์ที่เกิดซ้ำด้านล่าง:

รูปที่ (6): สูตรคำนวณ

4. ส่งคืนผลลัพธ์หลังจากผ่านเมทริกซ์

ตัวอย่าง:

รูปที่ (7): รายละเอียดระดับห้อง / อัตราภาษี

สำหรับพารามิเตอร์อินพุตข้างต้นเมทริกซ์สองมิติต่อไปนี้จะถูกสร้างขึ้น คอลัมน์สีส้มจะจับราคาที่สอดคล้องกับห้องเสมือนจริงแต่ละห้องตามการกำหนดค่าที่ดำเนินการโดย hotelier

รูปที่ 8 เมทริกซ์ 2D แสดงรายการสำหรับผู้ใหญ่ 3 คนและเด็ก 2 คน รายการ Null ถูกทำเครื่องหมายเป็น 'X'

เซลล์ที่เน้นสีเขียวจะแสดงชุดค่าห้องที่ถูกที่สุดสำหรับเกณฑ์การค้นหาที่ระบุ ตัวระบุห้องที่กล่าวถึงในเซลล์อธิบายถึงห้องที่จะต้องพิจารณาและตัวห้อยของพวกเขากำหนดการเข้าพักของแต่ละห้อง เซลล์ที่เน้นด้วยสีน้ำเงินคือเซลล์ที่ใช้ในการคำนวณเซลล์สีเขียวแบบเรียกซ้ำ (ใช้ความสัมพันธ์ที่เกิดซ้ำดังกล่าวข้างต้น)

อัลกอริทึมนี้ใช้งานได้ดีในการผลิตโดยไม่ส่งผลกระทบต่อความหน่วงเปอร์เซ็นต์ไทล์ 99 ของ API การค้นหาของเรา แม้หลังจากแคชผลลัพธ์คำแนะนำเหล่านี้เรายังคงประมวลผลชุดค่าใช้จ่ายของโรงแรมที่ไม่ซ้ำกันประมาณ 15K ทุกนาที

ขอขอบคุณเป็นพิเศษกับ Ajay Singh และ Abhijeet Sharad ที่ช่วยร่างบล็อกนี้