Professor Guide

Professor's Guide

LCO Hotel Optimizer — comprehensive academic manual

Kapodistrian Academy of Science

Professor's Guide to the LCO Hotel Optimizer

A comprehensive manual for preparing research datasets, running Lexicographic Constraint Optimization (LCO) experiments with the platform's four solvers, training the LCPG reinforcement-learning policy, exporting reproducible results, and citing the underlying methodology.

Based on Valamontes (2026)Version 1.0September 2026Platform build v1.7.0

1. Introduction & Purpose

The LCO Hotel Optimizer is a research-grade platform implementing Lexicographic Constraint Optimization (LCO) for hotel revenue management. Rather than collapsing revenue, risk, operations, fairness, and sustainability into a single weighted sum, LCO solves six competing objectives in strict priority order — freezing each tier's optimal value as a hard floor that every subsequent tier must respect.

This guide is written for university faculty and research students who need to prepare datasets, run controlled optimization experiments, train the LCPG reinforcement-learning policy, and export results suitable for classroom use, theses, and peer-reviewed publication.

2. The LCO Model & Floor-Locking Mechanism

The six-tier lexicographic hierarchy, solved in priority order:

L1

Feasibility / Ethics / Legal

Hard constraints — VIP guarantees, ADA accessibility (floors 1–2), room exclusivity. Infeasible if violated. Enforced in the simulator before any optimization.

L2

Revenue / Margin

Maximize total accepted booking revenue (sum of accepted bookings' price). The optimum Z₂* is recorded and frozen as a revenue floor for all lower tiers.

L3

Risk / Overbooking

Minimize expected overbooking slack subject to the L2 floor (revenue ≥ Z₂* − ε). Uses show probabilities show_prob.

L4

Operations

Minimize housekeeping turnovers — count of room-change events across the calendar given the L2/L3-feasible assignment.

L5

Workforce Fairness

Minimize overtime and balance shift load across staff, within the L1–L4-feasible region.

L6

Sustainability / Energy

Minimize energy use by clustering guests (floor stacking, shared HVAC zones), within all higher floors.

Floor locking — the core idea: once tier k is optimized, its value Z*_k is frozen as a constraintZ*_k − ε_k for every subsequent tier. Lower tiers may only optimize within the feasible region guaranteed by higher tiers. The tolerance ε controls how strictly the floor is enforced — the platform default locks L3 to retain ≥ 95% of L2 revenue.

Why lexicographic, not weighted-sum?

A weighted sum forces the researcher to price ethics, risk, and energy on a common scale — a scientifically and ethically fraught exercise. LCO declares an explicit priority order (guests' rights before revenue, revenue before operations) and lets each objective reach its own optimum, producing a Pareto-efficient, ethically defensible policy.

3. Notation & Decision Variables

The platform uses the notation from the paper's Tables 3–7. Key symbols:

SymbolTypeDescription
b ∈ Bindex/setBooking index; B = set of all bookings
r ∈ R, d ∈ Dindex/setRoom index; day in planning horizon
a_b ∈ {0,1}decisionBooking-acceptance indicator (1 = accepted)
y_{b,r,d} ∈ {0,1}decisionAssignment of booking b to room r on day d
w_d ≥ 0decisionOverbooking slack on day d (L3)
h_{r,d} ∈ {0,1}decisionHousekeeping turnover indicator (L4)
Pr(show_b)parameterShow probability for booking b (the show_prob CSV field)
Cap_dparameterAvailable room capacity on day d (= room_count)
Z*_kscalarOptimal floor value of tier-k objective
ε_k ≥ 0parameterTolerance for tier-k floor enforcement
γ ∈ (0,1)parameterDiscount factor in the CMDP / LCPG policy
HparameterRolling horizon length (e.g. 14 days)

4. Account & Subscription Tiers

Three tiers gate solver access. The right tier depends on the experiment scale.

Free

$0
  • l2_heuristic solver
  • 5 solver runs/day
  • ≤ 10 rooms
  • CSV export
  • Interactive Simulator

Pro

$19/mo
  • All Free + l3_lock solver
  • LCPG training (Algorithm 1)
  • LCPG Analytics + Data Loader
  • PDF report export
  • API access
  • Unlimited runs

Enterprise

Custom
  • All Pro + milp_neos (CBC via NEOS)
  • Multi-property (Benders/ADMM)
  • Quantum QUBO solver
  • SLA support
  • Bulk operations

For classroom and multi-student research, Pro is the recommended minimum — it unlocks the verified L3 floor-locking solver and LCPG training. The exact-MILP solver (NEOS/CBC) is the gold standard for reproducible benchmarks and requires Enterprise.

5. Preparing Your Research Dataset

The core input is a booking dataset: one row per booking request, with stay and guest attributes. The platform accepts CSV uploaded through the LCPG Data Loader (Analytics & Data → LCPG Data Loader; Pro+ required). A downloadable Mykonos sample dataset (500 bookings, 180 days, 8 floors, 100 rooms)is available on the loader page to use as a template.

5.1 CSV Field Reference

FieldTypeRequiredDescription
start_dayNumberYesCheck-in day (integer ≥ 1)
lengthNumberYesLength of stay in nights
priceNumberYesBooking price — per stay; the L2 objective sums accepted bookings' price
show_prob0–1OptionalProbability the guest shows up (default 0.85). Drives expected-shows and L3 overbooking slack.
booking_channelTextOptionalOTA, Direct, Corporate, Other — used by Channel Trends chart
lead_timeNumberOptionalDays between booking and check-in — drives Lead-Time Distribution
day_of_weekTextOptionalMonday–Sunday
customer_segmentTextOptionalLeisure, Business, Group, Other — drives Segment Profitability
is_vipBooleanOptionaltrue/false or 1/0 — VIP bookings trigger an L1 hard constraint (always accepted, top-floor Suite)
is_adaBooleanOptionaltrue/false or 1/0 — ADA bookings must be on floors 1–2 (accessibility, L1)
event_indicatorTextOptionalLocal event/holiday name — feeds demand multipliers in Rate Pricing & Demand Forecast
rate_codeTextOptionalBAR, CORP, PROMO, GROUP, PACKAGE, EARLY_BIRD
room_typeTextOptionalStandard, Deluxe, Suite — applies revenue premiums 1.0× / 1.35× / 1.85×
floor_numberNumberOptionalHotel floor; 1–2 = ADA accessible; higher floors add a view premium up to +18%

5.2 Sample CSV Rows (Mykonos template)

start_day,length,price,show_prob,booking_channel,lead_time,day_of_week,customer_segment,is_vip,is_ada,event_indicator,rate_code,room_type,floor_number
1,3,360,0.92,Direct,21,Monday,Business,false,false,,BAR,Standard,4
2,2,300,0.85,OTA,8,Tuesday,Leisure,false,false,Athens Tech Conf,CORP,Deluxe,7
3,1,540,0.95,Corporate,2,Wednesday,Business,true,false,,BAR,Suite,8
4,5,190,0.88,OTA,45,Saturday,Leisure,false,true,Summer Peak,PACKAGE,Standard,1

5.3 Field Semantics That Affect the Math

  • is_vip and is_ada are L1 hard constraints. VIP bookings are always accepted and assigned to a top-floor Suite; ADA bookings are pinned to floors 1–2. Mislabeling them defeats the ethical tier — label them accurately from your source data.
  • show_prob drives the L3 overbooking model: expected shows = sum of (accepted × show_prob). Typical real-world no-show rates give 0.78–0.95; the platform default is 0.85.
  • room_type applies revenue premiums: Standard 1.0×, Deluxe 1.35×, Suite 1.85×. floor_number adds a view premium up to +18% on the top floor.
  • event_indicator tags demand-driving days; it feeds the Rate Pricing Report and Demand Forecast multipliers downstream.
  • price is summed over accepted bookings to form the L2 objective. Keep it as total-stay price (or document your per-night convention consistently).

5.4 Best Practices for Reproducible Research

  • One row per booking. Do not split a multi-night stay into daily rows — length captures the duration.
  • Scale to your instance. The paper's Appendix A instance is 10 rooms × 5 days with 12 bookings. The Mykonos sample is 100 rooms × 180 days with 500 bookings. Match rooms/days to your research question.
  • Start from the sample, then perturb. Download the Mykonos CSV, vary one column at a time (show_prob, price, event_indicator) to isolate effects.
  • Record dataset metadata. When configuring, name the dataset and set room_count and analysis_period_days to match your CSV exactly.
  • Keep booleans clean. Use true/false or 1/0 — mixed casing can cause parse errors.

6. Loading Data via the LCPG Data Loader

  1. Navigate to Analytics & Data → LCPG Data Loader (Pro+ required; Free users see an upgrade prompt).
  2. Step 1 — Upload CSV: drag your CSV into the uploader. It parses, validates columns, and previews the bookings.
  3. Step 2 — Configure Dataset: name the dataset, add a description, confirm room_count and analysis_period_days, then save. It is stored as an LCPGDataset record (one row, with the bookings array embedded).
  4. The saved dataset appears in LCPG Analytics and can feed the Simulator and all solvers.
Quick start: use the Sample Data Download button on the loader page to fetch Mykonos_Hotel_Bookings_500.csv, then upload it directly to see a fully populated analytics suite.

7. The LCPG Analytics Suite

LCPG Analytics (Analytics & Data → LCPG Analytics) renders every saved dataset through a sequence of analytical modules. Each module is a publication-ready chart you can screenshot or feed into your results notebook:

Summary Stats

Total bookings, total revenue, avg booking value, analysis period

Report Exporter

One-click PDF/CSV export of the dataset and charts

Multi-Property Selector

Tag bookings to multiple properties for decomposition

Calendar Heatmap

Occupancy intensity across days × rooms

Channel Trends

Revenue share by OTA / Direct / Corporate / Other

Lead-Time Distribution

How far in advance guests book

Segment Profitability

Revenue by Leisure / Business / Group / Other

Rate Pricing Report

Daily ADR, RevPAR, event-driven demand multipliers

Demand Forecast

Seasonal projected occupancy + peak-day alerts

Industry Benchmark

Compare ADR/occupancy vs. STR-style benchmarks

Solver Panel

The four optimization solvers (Section 8)

LCO Optimizer

One-click L2→L3 lock with tier cascade and action plan

Enhanced Future Analysis

Project the LCO strategy onto future booking windows

LCPG Recommendations

AI-generated per-segment rate & acceptance suggestions

7A. Interpreting the Analytics — The Mykonos Example

The charts in LCPG Analytics are not just descriptive dashboards — each one maps directly to an input, constraint, or output of the LCO model. This section explains what the numbers actually mean for a revenue manager, using the bundled Mykonos sample (500 bookings, 180 days, 100 rooms, 8 floors) as a worked example. Load it via Sample Data Download on the LCPG Data Loader to follow along.

Summary Stats — the sanity check

  • Total bookings (500): the demand pool the solver selects from. With 100 rooms over 180 days the theoretical capacity is 18,000 room-nights — 500 bookings averaging ~3 nights ≈ 1,500 room-nights sold, so the hotel runs ~8% occupied on average. That low base occupancy is the real Mykonos problem: the challenge is not capacity, it is selecting the right 500 from a much larger request stream.
  • Total & average booking value: the sum of accepted price is exactly what L2 maximizes. A high average (~€420) skewed by a few Suite bookings tells you a handful of VIPs drive margin — protect them at L1.

Calendar Heatmap — where the money is made

The day × room occupancy grid makes the season legible. On Mykonos you will see a thin band of occupancy through spring, a dense red cluster in July–August, and a sharp cliff in late September. That cliff is the single most actionable insight in the dataset: demand collapses almost overnight, so any L3 overbooking you tolerate in August must be unwound by week 38. Read the heatmap left-to-right as the shape of the revenue function the L2 solver is maximising.

Channel Trends — margin, not just volume

A typical Mykonos split is OTA ≈ 55%, Direct ≈ 20%, Corporate ≈ 20%, Other ≈ 5%. Volume here is deceptive: OTA revenue carries 15–22% commission, so a booking booked through OTA is worth ~18% less to the hotel than the same price booked Direct. For the revenue manager this means the L2 objective (which uses gross price) overstates OTA contribution; when you compare scenarios, weight Direct/Corporate more heavily, or upload net price instead. The chart is the diagnostic — the solver is blind to commission unless you encode it in price.

Lead-Time Distribution — the overbooking signal

Mykonos shows a bimodal lead time: leisure guests book 30–60 days out, corporate guests book 1–7 days out. Long-lead leisure bookings have lower show_prob(plans change); short-lead corporate have higher certainty. This is precisely the information L3 exploits: overbooking slack is only worth accepting on days where lead-time is long and show probability is low. If your lead-time distribution is single-mode and short, L3 has little to gain — expect a flat revenue/risk frontier in the sensitivity sweep.

Segment Profitability — who to protect

Group and Business segments often show lower per-booking price but high repeat value; Leisure shows high price but high no-show risk. On Mykonos, Group drives the August peak (weddings, events) and Business the shoulder months. Use this to justify L1 VIP protection: theis_vip flag should capture the high-repeat Business segment, not just arbitrary high payers.

Rate Pricing Report — ADR, RevPAR and event multipliers

  • ADR (Average Daily Rate): room revenue ÷ occupied room-nights. Mykonos ADR climbs from ~€180 in May to ~€640 in early August — a 3.5× swing that the Rate Recommendations engine amplifies with event multipliers.
  • RevPAR (Revenue Per Available Room): ADR × occupancy. Because base occupancy is low, RevPAR (≈ €30–€55) looks weak even when ADR is strong — the lever is filling rooms, not raising price further. This reframes the L2 objective for off-peak days.
  • Event multipliers: the event_indicator column (e.g. Athens Tech Conf, Summer Peak) marks days where the Demand Forecast raises projected occupancy. These multipliers feed Rate Recommendations — a 1.3× multiplier on a Conference day typically lifts the recommended rate 18–25%.

Demand Forecast & Industry Benchmark — context, not ground truth

The forecast projects the seasonal curve forward; the benchmark overlays an STR-style competitive set (e.g. Aegean luxury 5★ properties). If your ADR sits above the benchmark during peak but below it in shoulder months, the implicit recommendation is to raise shoulder rates and hold peak rates — exactly the move the Rate Recommendations page will suggest once you run it. Treat both as priors; the solver's L2 output is the decision.

Worked example — Mykonos, l3_lock run

  1. L2: solver accepts ~430 of 500 bookings → Z₂* ≈ €182,000. The 70 rejections are low-price, long-lead OTA bookings that collide on August peak nights.
  2. L3 (floor locked at 95%): overbooking slack falls ~55%, revenue retained ≈ €173,000. The heatmap now shows 6–8 rooms double-booked on 4 peak nights — acceptable because those nights have show_prob ≈ 0.78.
  3. L4: housekeeping turns drop ~20% by stacking guests vertically on floors 6–8 instead of scattering them.
  4. L6: energy estimate falls ~12% from floor clustering — guests share HVAC zones.

The reading: the analytics did not just describe the data, they predicted which levers L3–L6 would pull. A manager who reads Summary Stats alone would chase occupancy; one who reads Lead-Time + Channel together sees that the real opportunity is selective overbooking on low-show-probability OTA peak nights — which is what L3 then does automatically.

7B. Previous-Season Data: Why It Helps & Where to Source It

The optimizers in this guide are not used in a vacuum — they are calibrated by previous-season (historical) data, which acts as the empirical prior that makes every decision defensible. Last season's records feed five distinct places in the platform:

1. The seasonality shape — Demand Forecast & Calendar Heatmap

The seasonal curve (the "thin spring band → dense July–August red cluster → late-September cliff" of §7A) is the shape of the L2 revenue function the solver maximises. A past season's bookings reveal where demand actually concentrates, so the Demand Forecast can project that curve forward and pre-position overbooking and price moves instead of estimating them in the abstract.

2. The ADR / RevPAR baseline — Rate Pricing Report

Historical ADR and RevPAR define the baseline the rate engine lifts from. The Mykonos swing of ~€180 (May) to ~€640 (Aug) is only visible with last season's daily ADR; the event_indicatormultipliers then layer on top of that baseline. Without the baseline, recommended rates have no anchor.

3. Lead-time & show probabilities — L3 overbooking

Past bookings reveal the bimodal lead-time pattern (leisure 30–60 days out, corporate 1–7 days out) and real no-show rates. These calibrate show_prob, which drives the L3 overbooking model. Overbooking only pays off on low-show-probability, long-lead nights — and you only know which nights those are from history.

4. The competitive reference — Industry Benchmark

The STR-style competitive set is overlaid on your ADR. If your peak ADR sits above the benchmark but shoulder-month ADR sits below it, the actionable read is "raise shoulder, hold peak" — a read that is impossible without last season's benchmark numbers.

5. Ground truth — Backtesting

The most direct use: any pricing or acceptance strategy is validated against historical PMS data before it is trusted live (§13). Previous seasons are the ground truth the strategy is scored against, closing the loop between the model and observed outcomes.

In short: previous-season data converts the optimizers from a one-shot mathematical exercise into a calibrated, testable policy — supplying the seasonality shape, the show probabilities, the ADR baseline, the competitive reference, and the backtest ground truth.

Where to source the data

  • Internal — your own PMS (primary source). Oracle Opera, Mews, Cloudbeds, Apaleo, Hotelogix and similar property systems. The platform's PMS Sync page and the syncPMSData backend pull reservations, ADR and occupancy directly from your property system — the cleanest previous-season data because it is your hotel. Your channel manager / direct-booking engine supplies the Direct / Corporate vs OTA split the Channel Trends chart relies on.
  • External benchmarks — rates & ADR/RevPAR. STR (CoStar Group) is the de-facto standard for hotel ADR, RevPAR and occupancy benchmarks — the same "STR-style competitive set" referenced in §7A. For competitor daily rates (consumed by fetchCompetitorRates and the Competitor Analysis module), use licensed rate-shopping tools (RateGain, OTA Insight, Snapshot/TravelClick) or the OTAs' partner APIs (Booking.com, Expedia, Agoda, Hotels.com). Note: scraping OTA pages directly usually violates their Terms of Service — use a licensed rate-shopper rather than DIY scraping.
  • Open / research datasets (classroom & thesis work). Kaggle's "Hotel booking demand" (Antonio, de Almeida & Nunes — the H1 resort + H2 city-hotel dataset) contains real booking records with lead time, cancellations and segment that map cleanly onto the CSV schema in §5.1. The Expedia Hotel Recommendations dataset offers search and booking-intent logs. Inside Airbnb listings/calendar data can serve as a short-term-rental demand signal (not a direct hotel equivalent) for markets where STR rentals compete with hotels.
Practical path: start from the bundled Mykonos sample to learn the CSV schema, then replace it with your own PMS export for real research, and add STR / rate-shopper benchmarks for the competitor and industry-benchmark layers. Always record dataset provenance in your methods section for reproducibility (§15).

8. Running the Four Optimization Solvers

The Solver Panel (inside LCPG Analytics and the Simulator) exposes four backends. Pick the one that matches your tier and research question:

Optimize Tier L₂ — Maximize Revenue

Freel2_heuristic

Fast greedy heuristic. Sorts bookings by price descending, packs into the room-day calendar, returns Z₂* revenue, accepted count, occupancy. Calls solveOptimization backend. Good for quick exploration.

Lock Floor & Optimize L₃

Prol3_lock

Solves L2, freezes the revenue floor at Z₂* (with ε tolerance, default 95% retention), then minimizes expected overbooking slack. Calls solveLCPGOptimization. Returns the full tier cascade (L1–L4) with floor values and HK-turns.

Train LCPG (Paper §4)

Prolcpg_training

Reinforcement-learning policy gradient across all six tiers (Algorithm 1). Save the scenario first; takes ~30s. Calls trainLCPG. Produces an adaptive intra-tier policy you can apply to future bookings.

Solve MILP via NEOS (CBC)

Enterprisemilp_neos

Exact mixed-integer program solved on the NEOS server with CBC, greedy fallback if unavailable. Returns optimal revenue, accepted bookings with room assignments, room-type inventory. The gold standard for reproducible benchmarks. Calls solveMILP.

8.1 The Revenue-Floor Tolerance ε

ε controls how strictly the L2 floor is enforced when optimizing L3 and below. The platform default locks L3 to retain ≥ 95% of L2 revenue (ε = 0.05 of the floor). A larger ε trades revenue for more overbooking reduction; ε → 0 enforces the floor exactly. Sweep ε in the Simulator's sensitivity analysis to plot the revenue/risk frontier.

8.2 Reading Solver Results

  • l2_heuristic / milp: returns accepted_revenue, accepted_count, occupancy_rate, revenue_floor, and (MILP) per-booking room assignments.
  • l3_lock: returns a tier cascade object (l1…l4) with each tier's name, status, floor value, plus metrics: accepted/rejected bookings, overbooking slack, housekeeping turns, occupancy, avg price.
  • lcpg_training: returns trained policy parameters and per-tier value estimates for application to future windows.

9. The Interactive Simulator

Research → Simulator is the hands-on experiment surface. Configure rooms, days, the revenue-floor tolerance ε, and a booking table, then run any solver. Notable capabilities:

  • Toolbar actions: Save / Load scenario, Export CSV, Export PDF report, Reset to the 10×5 paper instance, Share scenario.
  • Room Assignment Grid: color-coded booking-to-room calendar with VIP/ADA legends.
  • Crisis Mode: evaluates ethical/revenue risk and activates an L1-prioritized re-optimization under disruption.
  • Batch Sensitivity Analysis: vary show probability or price across a range and observe revenue, occupancy, acceptance.
  • Market Pricing Overlay & Demand Forecast: overlay live competitor rates and seasonal demand onto your scenario.
  • Version History & Collaboration: save labeled versions of a scenario and chat with co-researchers on a shared scenario.

Reproducing the paper (Appendix A): open the Simulator and click Reset to load the 10-room × 5-day, 12-booking instance, then run Optimize L₂ → Lock Floor → L₃. Expected: L2 revenue Z₂* around $1,847; L3 reduces overbooking slack ~55% while retaining ~98% of L2 revenue; measurable reductions in housekeeping turns and energy use at L4/L6.

10. The LCPG Algorithm (Algorithm 1)

Lexicographic Constrained Policy Gradient (LCPG) trains an RL policy that respects all six tier floors simultaneously. Run it via Train LCPG (Paper §4). Pseudocode:

Require: tiers {L1..L6}, simulator S, initial theta, lr eta,
         batch B, horizon H, floors {Z*_k}
1:  Enforce L1 hard feasibility (ADA, safety, VIP) in S
2:  for k from 2 to 6 do
7:      repeat
8:          generate B rollouts of length H with policy pi_theta
9:          estimate E[r_k] and E[c_j] for j <= k
10:         project infeasible actions to satisfy L1 and floors
11:         compute constrained gradient g
12:         theta <- theta + eta * g
13:         update duals lambda_j <- max(0, lambda_j + eta_lambda * [Z_j - E[r_j]])
14:     until convergence
15: freeze floor Z_k and inject into the nightly MILP

The constrained gradient (Eq. 28) is g = ∇_θ ( E[r_k] − Σ_{j<k} λ_j [Z_j − E[r_j]]⁺ ), where the dual variables λ_j penalize floor violations. The discount factor γ in (0,1) weights future rewards. Full derivation and correctness proofs are on the Advanced Methods → Certifications tab (Appendices B–D).

11. The CAG Descent Method

Componentwise Approximated Gradient (CAG) provides stable descent directions when the true gradient is noisy or undefined — common on non-convex hotel revenue surfaces with discrete inventory thresholds. It is documented on the Advanced Methods → CAG Method tab:

d^Newton = −H⁻¹(x) ∇f(x) — classical

d^CAG = −H⁻¹(x) q(x) — Eq. 37, modified

∇f(x*) = 1, d ≥ 0 ⟹ ∇f(x*)ᵀ d = d ≥ 0 — descent, Thm 2.1

∇L_j(x)ᵀ d_CAG(x) ≥ 0 for all j less than k — floor preserved, Eq. 39

CAG is used inside LCPG training and the multi-property orchestration to guarantee floors are never violated during a gradient step.

12. Reproducing Appendix A with Pyomo

For off-platform replication, the paper's Appendix A provides a Pyomo MILP you can run locally:

pip install pyomo highspy

# Mini LCO demo: 10 rooms x 5 days
# Tier L2: maximize revenue -> record Z2*
# Tier L3: minimize expected overbooking slack with a revenue floor
from pyomo.environ import (ConcreteModel, Set, Var, Binary,
    Constraint, Objective, maximize, minimize, SolverFactory)

DAYS, ROOMS = 5, 10
bookings = { 1:(1,2,120,0.92), 2:(1,3,110,0.85), ... }  # 12 bookings
# Build model, solve L2, lock floor, solve L3
# (full code on Advanced Methods -> Pyomo Code tab)

The platform's milp_neos solver runs an equivalent formulation on the NEOS CBC server — compare your local Pyomo results against it for cross-validation.

13. Supporting Research Modules

  • Occupancy Calendar: daily occupancy/ADR/RevPAR projections with event overlays; click a day to model it in the Pricing Sandbox.
  • Competitor Analysis: rate benchmarking, price-parity monitoring, and rate-change alerts.
  • Rate Recommendations: AI-generated per-room-type rate suggestions with confidence and revenue-impact estimates.
  • Multi-Property: Benders / ADMM decomposition across properties (Pro+).
  • Dynamic & RL: live stochastic-arrival re-optimization demo with rolling horizon H.
  • Advanced Methods: CAG, LCPG pseudocode, Pyomo code, notation tables, and correctness certifications (Appendices B–D).
  • Backtesting: validate pricing strategies against historical PMS data; upload your own backtest dataset.
  • Custom Reports: assemble reusable report widgets (KPIs, trends, calendar, distribution).
  • Event Management: maintain the events that drive demand multipliers in forecasts.

14. Exporting Results for Publication

  • CSV export (Simulator toolbar & LCPG Report Exporter) — booking-level results for R / Python / Stata.
  • PDF report (Simulator toolbar & MILP Results Report) — formatted summary with KPIs, accepted-booking tables, room assignments.
  • LCPG Reports Hub — comprehensive analytical reports from trained datasets.
  • API access (Pro+) — programmatic retrieval of solver results via base44.functions.invoke(...) for automated pipelines.
  • This guide as PDF — the Download PDF button above captures the entire document to A4.

15. Reproducibility Checklist

  1. Record the dataset name, room_count, analysis_period_days, and booking count.
  2. Record the solver ID (l2_heuristic / l3_lock / lcpg_training / milp_neos) and the ε tolerance used.
  3. Save the scenario (Simulator → Save) and note its ID for later recall.
  4. Export the CSV of accepted bookings and the PDF report; store both with the run.
  5. For MILP runs, record the NEOS job number shown in the results panel.
  6. For LCPG training, record the trained policy identifier and the horizon H.
  7. Pin the platform build (v1.7.0) in your methods section so future readers can match behavior.

16. Recommended Research Workflow

  1. State the research question (e.g. "How does ε affect L3 overbooking slack at fixed L2 revenue?").
  2. Prepare a booking CSV per Section 5, or start from the Mykonos sample and perturb one column.
  3. Load it via the LCPG Data Loader; verify in LCPG Analytics summary stats.
  4. Open the Simulator, set rooms/days/ε, run a solver; record the tier cascade.
  5. Vary one parameter in Batch Sensitivity Analysis to build a frontier plot.
  6. For exact benchmarks, run Solve MILP via NEOS (Enterprise) and compare against the heuristic.
  7. For adaptive-policy research, run Train LCPG and apply the policy to a future window.
  8. Save the scenario, export CSV + PDF, and attach them to your analysis notebook.
  9. Cite the methodology (Section 18) and the platform build version.

16A. End-to-End Walkthrough: CSV → Analysis Report

This is the complete procedure, with no steps skipped, to go from an empty account to a publication-ready analysis report using the bundled Mykonos sample (500 bookings, 180 days, 100 rooms, 8 floors). Estimated time on a Pro+ account: ~25 minutes.

Phase 1 — Set up & load data

  1. 1

    Sign in and confirm your tier

    Log in with your account. In the top bar, confirm the tier badge reads Pro or Enterprise. Free users can complete steps 1–9 but cannot train LCPG or export the MILP report — the guide flags where Pro+ is required.

  2. 2

    Get the Mykonos sample CSV

    Open Analytics & Data → LCPG Data Loader. Click Sample Data Download to fetch Mykonos_Hotel_Bookings_500.csv. Save it locally. (If you already have your own booking CSV, you can use it instead — ensure the header matches Section 5.1.)

  3. 3

    Upload the CSV

    Drag the file into the uploader on the same page. It parses, validates the columns, and shows a bookings preview. If you see a parse error, fix the CSV per Section 17 (Troubleshooting) and re-upload — do not proceed with a partial parse.

  4. 4

    Configure & save the dataset

    Fill the dataset form: Name = Mykonos 500, room_count = 100, analysis_period_days = 180, optional description. Click Save. A green confirmation means the LCPGDataset record was created.

Phase 2 — Read the analytics

  1. 5

    Open LCPG Analytics and verify Summary Stats

    Navigate to Analytics & Data → LCPG Analytics. Select the Mykonos 500 dataset. The Summary Stats card should read ~500 bookings, analysis period 180 days. If numbers look off, return to the Data Loader — the dataset is the input to everything that follows.

  2. 6

    Read every chart (interpret, don't just view)

    Work through Calendar Heatmap → Channel Trends → Lead-Time → Segment Profitability → Rate Pricing → Demand Forecast → Industry Benchmark. Use Section 7A to interpret each. Note one actionable finding per chart in your notes file (e.g. "OTA = 55% → net price overstated by ~18%"). These notes become your report's narrative.

Phase 3 — Run the solvers

  1. 7

    Open the Simulator and load the dataset

    Go to Research → Simulator. Use Load Scenario (or the dataset loader on the left) to pull in Mykonos 500. Confirm the booking table populated (500 rows) and rooms/days read 100 / 180.

  2. 8

    Set the revenue-floor tolerance ε

    In the configuration panel set epsilon = 0.05 (the default — locks L3 to ≥ 95% of L2 revenue). Leave rooms = 100, days = 180.

  3. 9

    Run L₂ — maximize revenue (baseline)

    Click Optimize Tier L₂ (l2_heuristic). Wait for the result panel. Record: accepted_revenue (this is Z₂*), accepted_count, occupancy_rate. This is your revenue ceiling — every subsequent tier is bounded by it.

  4. 10

    Lock the floor & optimize L₃

    Click Lock Floor & Optimize L₃ (l3_lock, Pro+). The tier cascade panel returns L1–L4 with each floor value. Record the overbooking-slack reduction (%), revenue retained vs Z₂*, and housekeeping turns. This is the headline result of the run.

  5. 11

    Train the LCPG policy (optional, Pro+)

    First Save the scenario (required before training). Then click Train LCPG. Wait ~30s. The trained policy identifier and per-tier value estimates appear — these let you apply an adaptive policy to a future booking window.

  6. 12

    Solve the exact MILP benchmark (optional, Enterprise)

    Click Solve MILP via NEOS (CBC). Record the NEOS job number from the results panel and compare accepted_revenue against the heuristic from step 9. The MILP value is the gold-standard optimum; the gap quantifies your heuristic's quality.

  7. 13

    Run a sensitivity sweep

    Open Batch Sensitivity Analysis. Sweep show_prob from 0.70 → 0.95 in steps of 0.05. The resulting frontier plot (revenue vs overbooking) is a figure for your report — export it as a screenshot.

Phase 4 — Export the analysis report

  1. 14

    Save the scenario

    In the Simulator toolbar click Save Scenario, name it (e.g. Mykonos_L3lock_e05), and note the scenario ID shown in the confirmation. You will need it to recall or share the run.

  2. 15

    Export the booking-level CSV

    Click Export CSV in the toolbar. This downloads the accepted-booking table (with room assignments, price, tier outcomes) for further analysis in R / Python / Stata.

  3. 16

    Export the PDF results report

    Click Export PDF (Simulator toolbar), or open LCPG Reports Hub and use the Report Exporter for the full formatted report (KPIs, accepted-booking tables, room assignments, tier cascade). This PDF is your primary analysis deliverable.

  4. 17

    Assemble a Custom Report (optional)

    For a tailored deliverable, open Analytics & Data → Custom Reports. Add the KPI Summary, Revenue Trend, Occupancy Calendar, and Booking Distribution widgets, then export the assembled report. This is useful when the audience is non-academic (e.g. a hotel GM).

  5. 18

    Apply the strategy to the future (optional)

    Open LCPG Analytics → LCO Optimizer → Enhanced Future Analysis to project the locked L3 strategy onto the next booking window, then Rate Recommendations to generate per-room-type rate suggestions. These operational outputs close the loop from analysis to decision.

Phase 5 — Reproducibility & citation

  1. 19

    Complete the reproducibility checklist

    Work through Section 15: record dataset name, room_count, analysis_period_days, solver IDs, ε, scenario ID, NEOS job number (if used), trained-policy ID (if used), and the platform build (v1.7.0). Store the CSV + PDF alongside these metadata in one folder.

  2. 20

    Cite the methodology

    In your methods section, cite Valamontes (2026) and the platform build (Section 18). Pin the build version so future readers can reproduce your numbers exactly.

You're done. You now have: a saved dataset, a saved scenario, the L2/L3 tier cascade, an optional LCPG policy and MILP benchmark, a sensitivity frontier, the booking CSV, and the PDF analysis report — all reproducible from the recorded metadata.

17. Troubleshooting

  • "Upgrade required" on LCPG Data Loader / Analytics: these are Pro+ features. Free users can still use the interactive Simulator with the l2_heuristic solver.
  • "Save scenario first": the LCPG trainer requires a saved scenario to persist the trained policy — save before clicking Train.
  • CSV parse errors: check boolean formatting (true/false or 1/0), quote text fields, ensure the header row matches Section 5.1 exactly.
  • NEOS unavailable: the milp_neos solver falls back to a greedy solve if the NEOS server is unreachable; results will be heuristic, not exact — note this in your methods.
  • L3 not reducing slack: ε may be too tight; increase the revenue-floor tolerance to allow L3 more freedom.
  • Daily run limit (Free): 5 solver runs/day across all solvers; runs reset at midnight Athens time.

18. Citations & Credits

When publishing results produced with this platform, cite the underlying work and the platform build:

Valamontes, A. (2026). Lexicographic Constraint Optimization in Hotel Management. Kapodistrian Academy of Science.

LCO Hotel Optimizer, platform build v1.7.0 (2026).

© 2026 Kapodistrian Academy of Science & Antonios Valamontes. All Rights Reserved.

LCO Hotel Optimizer • Professor's Guide v1.0
Lexicographic Constraint Optimization in Hotel Management • Based on Valamontes (2026)