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):
Subject to:
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 constraintsmultiply=1.30increases capacity by 30%.describe()adds explanation for reporting
Batch Scenario Execution¶
Run multiple scenarios efficiently:
Variables: 5
Constraints: 8
Features:
include_baseline=Trueadds current model as baseline scenariorun_all_scenarios()solves all scenarios in batchReturns 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:
Scenario Modeling: How to define business scenarios with parameter changes
Batch Execution: Running multiple scenarios efficiently
Result Comparison: Analyzing and comparing scenario outcomes
Parameter Sensitivity: Testing ranges of parameter values
Risk Assessment: Quantifying downside risks and upside opportunities
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:
Labor expansion: Best ROI
Automation: Long-term efficiency gains
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¶
Price Scenarios: Vary product prices and costs
Demand Scenarios: Different demand patterns
Multi-Stage: Sequential decision scenarios
Monte Carlo: Probabilistic scenario generation
Conditional: Scenario trees with dependencies
Next Steps¶
After mastering this example:
Example 09 (Sensitivity Analysis): Understanding shadow prices
Example 10 (What-If Analysis): Quick tactical decisions
Scenario Tree Modeling: Sequential decision making
See Also¶
Related Examples:
Sensitivity Analysis Example - Shadow prices and reduced costs
What-If Analysis Example - Quick parameter changes
Production Planning Example - Base model for scenarios
API Reference:
lumix.analysis.LXScenariolumix.analysis.LXScenarioAnalyzer
Files in This Example¶
scenario_analysis.py- Main scenario analysis demonstrationsample_data.py- Data models (Product, Resource) and sample dataREADME.md- Detailed documentation and usage guide