ขั้นตอนวิธีการแนะนำห้องพักโรงแรมและห้องพัก @ 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 ที่ช่วยร่างบล็อกนี้