Scenario Analysis Example

Overview

This example demonstrates LumiX’s scenario analysis capabilities for exploring different business conditions and strategic decisions through systematic what-if analysis.

The production planning scenario analysis helps companies understand how different market conditions, resource availability, and strategic investments affect optimal production plans and profitability.

Problem Description

A manufacturing company wants to understand how different business scenarios affect their optimal production plan and profitability.

Scenarios to Explore:

  • Optimistic: Market expansion with increased resource capacity

  • Pessimistic: Resource constraints due to supply chain issues

  • Realistic: Moderate growth with balanced expansion

  • Strategic: Labor investment, automation, material procurement

Objective: Compare multiple scenarios to identify best strategies and assess risks.

Mathematical Formulation

Base Model (Production Planning):

\[\text{Maximize} \quad \sum_{p \in \text{Products}} \text{profit}_p \cdot x_p\]

Subject to:

\[\begin{split}\sum_{p} \text{usage}_{p,r} \cdot x_p &\leq \text{capacity}_r, \quad \forall r \in \text{Resources} \\ x_p &\geq \text{min}_p, \quad \forall p \in \text{Products}\end{split}\]

Scenario Modifications: Each scenario modifies constraint RHS values (capacities, minimums).

Key Features

Scenario Creation

Define scenarios with constraint modifications:

production = (
    LXVariable[Product, float]("production")
    .continuous()
    .bounds(lower=0)
    .indexed_by(lambda p: p.id)
    .from_data(PRODUCTS)
)

Key Points:

  • .modify_constraint_rhs() changes right-hand side of constraints

  • multiply=1.30 increases capacity by 30%

  • .describe() adds explanation for reporting

Batch Scenario Execution

Run multiple scenarios efficiently:

    Variables: 5
    Constraints: 8

Features:

  • include_baseline=True adds current model as baseline scenario

  • run_all_scenarios() solves all scenarios in batch

  • Returns dictionary mapping scenario names to solutions

Scenario Comparison

Compare results across scenarios:

        - Comparing scenarios with .compare_scenarios()
        - Parameter sensitivity with .sensitivity_to_parameter()

    The function includes a baseline scenario automatically for comparison.
    Labor capacity sensitivity tests multipliers from 0.7x to 1.5x to
    understand the profit-capacity relationship.
"""

Outputs:

  • Tabular comparison of objective values

  • Status for each scenario

  • Percentage change vs baseline

  • Best/worst scenario identification

Parameter Sensitivity

Analyze sensitivity to parameter ranges:

# Scenario 1: Optimistic - Market Expansion
print("\n1. OPTIMISTIC SCENARIO: Market Expansion")
print("   - Hire more workers (+30% labor capacity)")
print("   - Purchase new machines (+20% machine capacity)")
print("   - Increase material procurement (+25% materials)")

Tests objective value across range of parameter values.

Running the Example

Prerequisites:

pip install lumix
pip install ortools  # or cplex, gurobi

Run:

cd examples/08_scenario_analysis
python scenario_analysis.py

Expected Output:

====================================================================
SCENARIO ANALYSIS: Production Planning Under Different Conditions
====================================================================

CREATING BUSINESS SCENARIOS
--------------------------------------------------------------------

1. OPTIMISTIC SCENARIO: Market Expansion
   - Hire more workers (+30% labor capacity)
   - Purchase new machines (+20% machine capacity)
   - Increase material procurement (+25% materials)

2. PESSIMISTIC SCENARIO: Resource Constraints
   - Labor shortage (-20% labor capacity)
   - Supply chain issues (-15% material availability)

====================================================================
SCENARIO COMPARISON RESULTS
====================================================================

Scenario                Status      Objective       vs Baseline
--------------------------------------------------------------------
market_expansion        optimal     $15,234.89      +23.4%
moderate_growth         optimal     $13,456.78      +9.0%
labor_investment        optimal     $13,234.56      +7.2%
automation              optimal     $12,987.65      +5.2%
baseline                optimal     $12,345.67      -
resource_constraints    optimal     $10,123.45      -18.0%

--------------------------------------------------------------------
BEST SCENARIO: market_expansion
--------------------------------------------------------------------
Objective Value: $15,234.89
Improvement over baseline: $2,889.22 (23.4%)

====================================================================
SENSITIVITY ANALYSIS: Labor Capacity Impact
====================================================================

Multiplier   Labor Hours     Objective Value      vs Baseline
--------------------------------------------------------------------
0.7          700             $10,542.13          -14.6%
0.8          800             $11,234.56          -9.0%
0.9          900             $11,890.23          -3.7%
1.0          1000            $12,345.67          +0.0%
1.1          1100            $12,891.34          +4.4%
1.2          1200            $13,432.89          +8.8%
1.3          1300            $13,974.45          +13.2%

Complete Code Walkthrough

Step 1: Create Scenario Analyzer

Example:
    >>> model = build_production_model()
    >>> print(model.summary())
    Model: production_planning
    Variables: 5
    Constraints: 8

Step 2: Define Business Scenarios

    The model is intentionally generic to demonstrate how scenario
    analysis can be applied to any optimization model.
"""

# Decision Variable: Production quantity for each product
production = (
    LXVariable[Product, float]("production")
    .continuous()
    .bounds(lower=0)
    .indexed_by(lambda p: p.id)
    .from_data(PRODUCTS)
)

# Create model
model = LXModel[Product]("production_planning").add_variable(production)

# Objective: Maximize total profit
profit_expr = LXLinearExpression[Product]().add_term(
    production, coeff=lambda p: p.selling_price - p.unit_cost
)
model.maximize(profit_expr)

# Constraints: Resource capacity limits
for resource in RESOURCES:
    usage_expr = LXLinearExpression().add_term(
        production, coeff=lambda p, r=resource: get_resource_usage(p, r)
    )

    model.add_constraint(
        LXConstraint(f"capacity_{resource.name}")
        .expression(usage_expr)
        .le()
        .rhs(resource.capacity)
    )

# Constraints: Minimum production requirements
model.add_constraint(
    LXConstraint[Product]("min_production")
    .expression(LXLinearExpression[Product]().add_term(production, 1.0))

Step 3: Run All Scenarios

    ============================================================
    Creating 6 business scenarios...
    Best Scenario: market_expansion
    Objective Value: 12345.67
    ...

Step 4: Compare and Analyze Results

    This function demonstrates the complete LXScenarioAnalyzer workflow:
        - Creating scenarios with .modify_constraint_rhs()
        - Running batch analysis with .run_all_scenarios()
        - Comparing scenarios with .compare_scenarios()
        - Parameter sensitivity with .sensitivity_to_parameter()

    The function includes a baseline scenario automatically for comparison.
    Labor capacity sensitivity tests multipliers from 0.7x to 1.5x to
    understand the profit-capacity relationship.
"""

print("=" * 80)
print("SCENARIO ANALYSIS: Production Planning Under Different Conditions")
print("=" * 80)

# Build base model
print("\nBuilding base optimization model...")
model = build_production_model()
optimizer = LXOptimizer().use_solver(solver_to_use).enable_rational_conversion()

Step 5: Parameter Sensitivity Analysis


print("\n" + "-" * 80)
print("CREATING BUSINESS SCENARIOS")
print("-" * 80)

# Scenario 1: Optimistic - Market Expansion
print("\n1. OPTIMISTIC SCENARIO: Market Expansion")
print("   - Hire more workers (+30% labor capacity)")
print("   - Purchase new machines (+20% machine capacity)")
print("   - Increase material procurement (+25% materials)")

optimistic = (
    LXScenario[Product]("market_expansion")
    .modify_constraint_rhs("capacity_Labor Hours", multiply=1.30)
    .modify_constraint_rhs("capacity_Machine Hours", multiply=1.20)
    .modify_constraint_rhs("capacity_Raw Materials", multiply=1.25)
    .describe("Market expansion: increase all resource capacities")
)
analyzer.add_scenario(optimistic)

# Scenario 2: Pessimistic - Resource Constraints
print("\n2. PESSIMISTIC SCENARIO: Resource Constraints")
print("   - Labor shortage (-20% labor capacity)")
print("   - Supply chain issues (-15% material availability)")

pessimistic = (

Learning Objectives

After completing this example, you should understand:

  1. Scenario Modeling: How to define business scenarios with parameter changes

  2. Batch Execution: Running multiple scenarios efficiently

  3. Result Comparison: Analyzing and comparing scenario outcomes

  4. Parameter Sensitivity: Testing ranges of parameter values

  5. Risk Assessment: Quantifying downside risks and upside opportunities

  6. Strategic Planning: Using scenarios for decision support

Common Patterns

Pattern 1: Resource Capacity Scenario

scenario = (
    LXScenario[Model]("scenario_name")
    .modify_constraint_rhs("capacity_Resource1", multiply=1.2)
    .modify_constraint_rhs("capacity_Resource2", multiply=0.9)
    .describe("Increase Resource1, decrease Resource2")
)

Pattern 2: Demand Scenario

high_demand = (
    LXScenario[Product]("high_demand")
    .modify_constraint_rhs("min_production_A", multiply=1.5)
    .modify_constraint_rhs("min_production_B", multiply=1.3)
    .describe("50% increase in product A demand")
)

Pattern 3: Multi-Parameter Scenario

complex_scenario = (
    LXScenario[Model]("complex")
    .modify_constraint_rhs("capacity_Labor", multiply=1.3)
    .modify_constraint_rhs("capacity_Machine", multiply=0.8)
    .modify_constraint_rhs("min_production", to=150.0)
    .describe("Labor expansion with machine constraints")
)

Scenario Types

Optimistic Scenarios

Test best-case outcomes:

  • Market expansion

  • Resource abundance

  • High efficiency

  • Use: Understand maximum potential

Pessimistic Scenarios

Test worst-case outcomes:

  • Resource constraints

  • Supply chain disruptions

  • Market downturns

  • Use: Risk assessment and contingency planning

Realistic Scenarios

Test expected outcomes:

  • Moderate growth

  • Balanced changes

  • Historical trends

  • Use: Most likely planning baseline

Strategic Scenarios

Test specific strategic decisions:

  • Investment options (labor vs automation)

  • Market focus (product mix changes)

  • Process improvements

  • Use: Evaluate strategic alternatives

Business Insights

The example generates actionable insights:

Resource Impact Analysis:

  • Labor capacity: Highest marginal value (+$X per hour)

  • Machine capacity: Second most impactful

  • Materials: Adequate current capacity

Investment Priorities:

  1. Labor expansion: Best ROI

  2. Automation: Long-term efficiency gains

  3. Material procurement: Lower priority

Risk Exposure:

  • Downside risk: -18% profit under resource constraints

  • Upside potential: +23% profit with market expansion

  • Recommendation: Build buffer capacity

Extending the Example

Try These Modifications

  1. Price Scenarios: Vary product prices and costs

  2. Demand Scenarios: Different demand patterns

  3. Multi-Stage: Sequential decision scenarios

  4. Monte Carlo: Probabilistic scenario generation

  5. Conditional: Scenario trees with dependencies

Next Steps

After mastering this example:

  1. Example 09 (Sensitivity Analysis): Understanding shadow prices

  2. Example 10 (What-If Analysis): Quick tactical decisions

  3. Scenario Tree Modeling: Sequential decision making

See Also

Related Examples:

API Reference:

Files in This Example

  • scenario_analysis.py - Main scenario analysis demonstration

  • sample_data.py - Data models (Product, Resource) and sample data

  • README.md - Detailed documentation and usage guide