Dendro: Output Factors Guide

Introduction

Output factors define what Dendro tries to optimize - they are your business objectives translated into measurable metrics. While input factors control what can change, output factors determine what "better" means.

Key concepts:

  • Input Factors = What can be optimized (the variables) - see the Dendro: Input Factors Guide
  • Output Factors = What you want to improve (the objectives) - covered in this article

This guide explains how to configure output factors to align Dendro's optimization with your business goals. These can be specified in the Output Factors input table in Cosmic Frog models.

Recommended reading prior to diving into this guide: Getting Started with Dendro, a high-level overview of how Dendro works, and Dendro: Genetic Algorithm Guide which explains the inner workings of Dendro in more detail.

What Are Output Factors?

The Big Picture

An output factor tells Dendro's genetic algorithm:

  1. What to measure: Which metric from which table (e.g., total cost from network summary)
  2. For which scope: Which subset of data to include (e.g., specific facilities, products, or all)
  3. How good is good: A utility curve that maps metric values to quality scores
  4. How important it is: A weight that defines its relative priority

Real-World Analogy

Imagine you are evaluating employee performance:

  • Metrics are like performance indicators: sales revenue, customer satisfaction, error rate
  • Utility curves define what constitutes good performance: $100K sales = excellent, $50K = poor
  • Weights reflect importance: sales revenue (40%), customer satisfaction (35%), error rate (25%)
  • Overall score combines all factors: 0.40 × sales_score + 0.35 × satisfaction_score + 0.25 × error_score

Dendro uses the same approach to evaluate inventory policy combinations across your supply chain.

Output Factor Configuration

The Output Factors Table

Output factors are configured in the Output Factors input table with the following columns:

Configuration Example

Example 1: Total Supply Chain Cost

Minimize overall supply chain costs:

  • OutputFactorName:    TotalCost
  • TableName:           SimulationNetworkSummaryReplicationDetail
  • ColumnName:          TotalSupplyChainCost
  • Filter:              (leave empty for all data)
  • UtilityCurve:        [1500000,100],[2000000,0]
  • OutputFactorWeight:  0.40
  • Status:              Include

Interpretation:

  • Measures total supply chain cost from the network summary table
  • $1.5M or less = perfect score (100 points)
  • $2.0M or more = worst score (0 points)
  • Values between are interpolated linearly
  • This factor contributes 40% to the overall fitness score

Example 2: Service Level Achievement

Maximize service level performance:

  • OutputFactorName:    ServiceLevel
  • TableName:           SimulationNetworkServiceSummaryReplicationDetail
  • ColumnName:          TotalPlacedCustomerOrderQuantityOnTimeInFullRate
  • Filter:              (leave empty)
  • UtilityCurve:        [0,0],[85,10],[95,99],[100,100]
  • OutputFactorWeight:  0.35
  • Status:              Include

Interpretation:

  • Measures on-time-in-full service rate
  • 0% service = 0 points (worst)
  • 85% service = 10 points (poor)
  • 95% service = 99 points (excellent - target)
  • 100% service = 100 points (perfect)
  • This factor contributes 35% to the overall fitness score

Example 3: Facility-Specific Holding Cost

Focus on inventory costs at distribution centers only:

  • OutputFactorName:    DC_HoldingCost
  • TableName:           SimulationFacilityCostSummaryReplicationDetail
  • ColumnName:          InventoryHoldingCost
  • Filter:              FacilityType='DC'
  • UtilityCurve:        [50000,100],[150000,0]
  • OutputFactorWeight:  0.25
  • Status:              Include

Interpretation:

  • Measures inventory holding costs specifically for Distribution Centers
  • Filter excludes plants, warehouses, and other facility types
  • Results from multiple DC rows are averaged
  • $50K or less = perfect, $150K or more = worst
  • Contributes 25% to overall score

The following 2 screenshots show the Output Factors input table in Cosmic Frog; it contains 3 rows which represent the 3 examples above:

Utility Curves Explained

What Is a Utility Curve?

A utility curve translates raw metric values (like dollars or percentages) into standardized quality scores (0-100 points). It answers the question: "How good is this value?".

Format:[value1,score1],[value2,score2],[value3,score3],...

Each [value,score] pair defines a point on the curve:

  • value: The raw metric value from simulation output
  • score: The quality assessment (0-100, higher is better)

Dendro connects these points with straight lines to create a piecewise linear curve.

Utility Curve Examples

Simple Two-Point Curve (Linear)

[1000,100],[2000,0]

Meaning:

  • 1000 or less → 100 points (perfect)
  • 2000 or more → 0 points (worst)
  • 1500 → 50 points (linear interpolation)

Visualization:

Best for:

  • Cost minimization (lower is better)
  • Simple monotonic relationships

Three-Point Curve (Piecewise Linear)

[50,0],[100,50],[150,100]

Meaning:

  • 50 or less → 0 points (too low, bad)
  • 100 → 50 points (acceptable)
  • 150 or more → 100 points (target achieved, excellent)

Visualization:

Best for:

  • Metrics where both too low AND too high are bad
  • Target range optimization

Four-Point Service Level Curve

[0,0],[85,10],[95,99],[100,100]

Meaning:

  • 0% service → 0 points (unacceptable)
  • 85% service → 10 points (poor, but some credit)
  • 95% service → 99 points (target met, nearly perfect)
  • 100% service → 100 points (perfect)

Characteristics:

  • Steep slope between 85% and 95% (service improvements highly valued)
  • Minimal improvement from 95% to 100% (diminishing returns)

Visualization:

Best for:

  • Service levels with clear targets
  • Emphasizing performance around critical thresholds

Dynamic Rescaling

The challenge: Early in optimization, Dendro does not know what the best and worst possible values are.

The solution: Utility curves automatically expand when new extremes are discovered.

Example scenario:

Generation 1:

  • Best cost seen: $1,800,000
  • Worst cost seen: $2,200,000
  • Curve: [1800000,100],[2200000,0]

Generation 5:

  • A new chromosome achieves: $1,600,000 (new minimum!)
  • Curve automatically rescales: [1600000,100],[2200000,0]
  • All previous scores are recalculated with the new scale

Why it matters:

  • Ensures fair comparison across all generations
  • Prevents early solutions from being unfairly favored
  • Adapts to the actual range of achievable performance

When rescaling occurs:

  • A value below the leftmost point is discovered (new minimum)
  • A value above the rightmost point is discovered (new maximum)
  • The curve stretches proportionally to accommodate the new extreme
  • All historical fitness scores are recalculated

Weights and Priority

Understanding Weights

Weights determine how much each output factor contributes to the overall fitness score.

Common approaches:

Approach 1: Percentages (Sum to 1.0)

  • Total Cost:          Weight = 0.40 (40%)
  • Service Level:       Weight = 0.35 (35%)
  • Inventory Value:     Weight = 0.25 (25%)
  •                      Total = 1.00 (100%)

Advantage: Easy to understand - directly represents percentage contribution.

Approach 2: Whole Numbers (Relative Importance)

  • Total Cost:          Weight = 40
  • Service Level:       Weight = 35
  • Inventory Value:     Weight = 25
  •                      Total = 100 (but could be any sum)

Advantage: Can use any convenient scale; Dendro handles normalization.

Approach 3: Priority Multipliers

  • Critical Factor:     Weight = 10
  • Important Factor:    Weight = 5
  • Secondary Factor:    Weight = 2
  • Minor Factor:        Weight = 1

Advantage: Emphasizes relative priorities clearly.

How Weights Affect Optimization

Example calculation:

Output Factors:

  1. Holding Cost:   Raw value = $80,000  → Utility score = 60  → Weight = 0.40
  2. Service Level:  Raw value = 94%      → Utility score = 85  → Weight = 0.35
  3. Transport Cost: Raw value = $45,000  → Utility score = 70  → Weight = 0.25

Weighted Contributions:

  1. Holding Cost:       60 × 0.40 = 24.0 points
  2. Service Level:      85 × 0.35 = 29.75 points
  3. Transport Cost:     70 × 0.25 = 17.5 points

Overall Fitness Score: 24.0 + 29.75 + 17.5 = 71.25 points

Higher fitness scores are better in Dendro

The fitness calculation adds these weighted scores, so the formula is:

Fitness = 24.0 + 29.75 + 17.5 = 71.25

Choosing Appropriate Weights

Balanced approach:

  • Cost factors (total):    50%
  • Service factors (total): 50%

Equal priority to cost reduction and service achievement.

Cost-focused approach:

  • Cost factors (total):    70%
  • Service factors (total): 30%

Emphasizes cost minimization; willing to accept moderate service levels.

Service-focused approach:

  • Cost factors (total):    30%
  • Service factors (total): 70%

Prioritizes customer service; cost is secondary.

Multi-objective balanced:

  • Holding cost:      25%
  • Transport cost:    25%
  • Service level:     25%
  • Inventory turns:   25%

Equal consideration to multiple objectives.

How Fitness Scoring Works

Step-by-Step Process

Step 1: Extract Metric Values

For each output factor, Dendro reads the metric value from the simulation results:

  • Factor 1 (Total Cost):     Reads TotalSupplyChainCost → $1,750,000
  • Factor 2 (Service Level):  Reads OnTimeInFullRate → 92%
  • Factor 3 (Holding Cost):   Reads InventoryHoldingCost → $320,000

Step 2: Look Up Raw Utility Scores

Each value is mapped to a raw score using its utility curve:

  • Factor 1: $1,750,000 → Utility curve [1500000,100],[2000000,0]
    • Interpolation: (1,750,000 - 1,500,000) / (2,000,000 - 1,500,000) = 0.5
    • Raw score: 100 - (0.5 × 100) = 50
  • Factor 2: 92% → Utility curve [0,0],[85,10],[95,99],[100,100]
    • Falls between 85 and 95: Interpolate
    • Raw score: 10 + ((92-85)/(95-85)) × (99-10) = 10 + 62.3 = 72.3
  • Factor 3: $320,000 → Utility curve [200000,100],[400000,0]
    • Interpolation: (320,000 - 200,000) / (400,000 - 200,000) = 0.6
    • Raw score: 100 - (0.6 × 100) = 40

Step 3: Normalize Scores (if needed)

Utility scores are scaled to a 0-100 range based on the min/max scores in the curve:

  • If all curves use 0-100 range → No additional scaling needed
  • Scores are already normalized: 50, 72.3, 40

Step 4: Apply Weights

Multiply each normalized score by its weight:

  • Factor 1: 50 × 0.40 = 20.0
  • Factor 2: 72.3 × 0.35 = 25.3
  • Factor 3: 40 × 0.25 = 10.0

Step 5: Sum Weighted Scores

Combine all weighted scores:

Overall score = 20.0 + 25.3 + 10.0 = 55.3

Comparing Chromosomes

Chromosome A:

  • Total Cost: $1,600,000 → Score 80 → Weighted 32.0
  • Service:    96%        → Score 100 → Weighted 35.0
  • Holding:    $280,000   → Score 60 → Weighted 15.0
  •                        Total:        82.0

Chromosome B:

  • Total Cost: $1,750,000 → Score 50 → Weighted 20.0
  • Service:    92%        → Score 72 → Weighted 25.2
  • Holding:    $320,000   → Score 40 → Weighted 10.0
  •                        Total:        55.2

Result: Chromosome A (fitness score of 82.0) is better than Chromosome B (fitness score of 55.2).

Chromosome A achieves better performance across all metrics, resulting in a higher fitness score.

In Cosmic Frog, the Overall Fitness Scores of all scenarios (=chromosomes) run can be assessed in the Simulation Evolutionary Algorithm Summary output table after a Dendro run has completed. Scores of individual output factors can be reviewed in the Simulation Evolutionary Algorithm Output Factor Report output table:

The top 10 records of the Simulation Evolutionary Algorithm Summary output table showing the 10 scenarios with the best overall fitness scores.
The Simulation Evolutionary Algorithm Output Factor Report output table showing the values and weighted scores of the individual output factors of the 5 best scenarios.

Automatic Output Factor Generation

Overview

The Automatically Generate Output Factors option automatically creates standard output factor configurations based on your target service levels and baseline simulation results. This option can be set in the Dendro section of the Technology Parameters.

When to use:

  • Starting a new Dendro project
  • You do not have pre-configured output factors
  • You want a balanced cost/service optimization

What it creates:

  1. Cost Factor: Minimize total supply chain cost
  2. Service Factor: Achieve target service level

How Automatic Generation Works

Cost Factor Generation

Step 1: Run baseline simulation Execute your current inventory policies to measure actual cost.

Step 2: Establish boundaries

  • Baseline Cost: $1,800,000
  • Left Boundary (best):    75% of baseline = $1,350,000
  • Right Boundary (worst): 110% of baseline = $1,980,000

Step 3: Create utility curve

UtilityCurve: [1350000,100],[1980000,0]

Interpretation:

  • Reducing cost by 25% or more → Perfect (100 points)
  • Increasing cost by 10% or more → Poor (0 points)
  • Linear interpolation between

Step 4: Set weight

OutputFactorWeight: 1 (50% when combined with service factor)

Service Factor Generation

Step 1: Use configured service targets

Step 2: Create multi-point utility curve

UtilityCurve: [0,0],[85,10],[95,99],[100,100]

Interpretation:

  • 0% service → 0 points (complete failure)
  • 85% service → 10 points (minimum acceptable threshold)
  • 95% service → 99 points (target achieved)
  • 100% service → 100 points (perfect)

Design rationale:

  • Steep slope between 85-95%: Strong incentive to reach target
  • Flat between 95-100%: Diminishing returns for over-achievement
  • Some credit at 85%: Acknowledges partial success

Step 3: Set weight

OutputFactorWeight: 1 (50% when combined with cost factor)

Result of Automatic Generation

OutputFactors Table:

  • Row 1:
    • OutputFactorName:    Cost
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          TotalSupplyChainCost
    • Filter:              NULL
    • UtilityCurve:        [1350000,100],[1980000,0]
    • OutputFactorWeight:  1
    • Status:              Include
  • Row 2:
    • OutputFactorName:    Service
    • TableName:           SimulationNetworkServiceSummaryReplicationDetail
    • ColumnName:          TotalPlacedCustomerOrderQuantityOnTimeInFullRate
    • Filter:              NULL
    • UtilityCurve:        [0,0],[85,10],[95,99],[100,100]
    • OutputFactorWeight:  1
    • Status:              Include

Optimization behavior: Dendro will seek policies that:

  1. Reduce total cost below baseline (up to 25% reduction rewarded)
  2. Achieve 95% service level (strong incentive)
  3. Balance these objectives equally (50/50 weighting)

Common Output Factor Configurations

Configuration 1: Cost Minimization Only

Goal: Find the lowest-cost inventory policies without service constraints.

Setup:

  • OutputFactorName:    TotalCost
  • TableName:           SimulationNetworkSummaryReplicationDetail
  • ColumnName:          TotalSupplyChainCost
  • UtilityCurve:        [1000000,100],[3000000,0]
  • OutputFactorWeight:  1.0

Result: Dendro minimizes cost aggressively; service may suffer.

When to use:

  • Internal supply chains where service is less critical
  • Cost reduction initiatives
  • Initial baseline to understand cost/service trade-offs

Configuration 2: Service Maximization with Cost Limit

Goal: Maximize service while preventing excessive cost increases.

Setup:

  • Factor 1 - Service (Primary):
    • OutputFactorName:    Service
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          OnTimeInFullRate
    • UtilityCurve:        [90,0],[95,50],[98,99],[100,100]
    • OutputFactorWeight:  0.70
  • Factor 2 - Cost (Constraint):
    • OutputFactorName:    CostLimit
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          TotalSupplyChainCost
    • UtilityCurve:        [1500000,100],[2000000,50],[2500000,0]
    • OutputFactorWeight:  0.30

Result: Dendro prioritizes service but penalizes solutions exceeding cost thresholds.

When to use:

  • Customer-facing supply chains
  • High service level commitments
  • Budget-constrained projects

Configuration 3: Balanced Multi-Objective

Goal: Optimize multiple objectives with balanced priorities.

Setup:

  • Factor 1 - Holding Cost:
    • OutputFactorName:    HoldingCost
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          InventoryHoldingCost
    • UtilityCurve:        [200000,100],[500000,0]
    • OutputFactorWeight:  0.25

  • Factor 2 - Transport Cost:
    • OutputFactorName:    TransportCost
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          TransportationCost
    • UtilityCurve:        [300000,100],[600000,0]
    • OutputFactorWeight:  0.25
  • Factor 3 - Service Level:
    • OutputFactorName:    Service
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          FillRate
    • UtilityCurve:        [85,0],[95,99],[100,100]
    • OutputFactorWeight:  0.30
  • Factor 4 - Inventory Turns:
    • OutputFactorName:    InventoryTurns
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          InventoryTurns
    • UtilityCurve:        [2,0],[6,50],[12,100]
    • OutputFactorWeight:  0.20

Result: Dendro finds well-rounded solutions balancing cost, service, and efficiency.

When to use:

  • Complex supply chains with multiple stakeholders
  • Strategic planning initiatives
  • Comprehensive optimization projects

Configuration 4: Regional Differentiation

Goal: Different service targets for different regions.

Setup:

  • Factor 1 - Premium Region Service:
    • OutputFactorName:    Premium_Service
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          FillRate
    • Filter:              Region='Premium'
    • UtilityCurve:        [92,0],[98,99],[100,100]
    • OutputFactorWeight:  0.40
  • Factor 2 - Standard Region Service:
    • OutputFactorName:    Standard_Service
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          FillRate
    • Filter:              Region='Standard'
    • UtilityCurve:        [85,0],[92,99],[100,100]
    • OutputFactorWeight:  0.30
  • Factor 3 - Overall Cost:
    • OutputFactorName:    TotalCost
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          TotalSupplyChainCost
    • UtilityCurve:        [2000000,100],[3000000,0]
    • OutputFactorWeight:  0.30

Result: Premium regions get higher service targets; standard regions have lower thresholds.

When to use:

  • Multi-tier customer segments
  • Geographic differentiation strategies
  • SLA-based service requirements

Multi-Row Handling

The Challenge

Some output tables contain multiple rows per scenario (e.g., one row per facility or product). Dendro combines these into a single metric value by using a straight average calculation. More options will be added in future releases.

How it works: Calculates the arithmetic mean of all matching rows.

SQL equivalent:

SELECT AVG(ColumnName) 
FROM TableName 
WHERE ScenarioName = 'Gen3_Chr5' AND [Filter]

Example:

  • Facility A holding cost: $80,000
  • Facility B holding cost: $120,000
  • Facility C holding cost: $100,000
  • SimpleAverage: ($80,000 + $120,000 + $100,000) / 3 = $100,000

Best for:

  • Metrics where all entities are equally important
  • Balanced optimization across all facilities/products
  • Simple, intuitive interpretation

Best Practices

1. Start with Simple Utility Curves

Do not use:

[0,0],[10,5],[20,15],[30,28],[40,45],[50,65],[60,82],[70,95],[80,98],[90,99],[100,100]

Over-complicated curves are hard to understand and maintain.

Do use:

[0,0],[85,10],[95,99],[100,100]

Simple curves with clear inflection points at meaningful thresholds.

Principle: Use the minimum number of points to capture your business logic.

2. Align Utility Curves with Business Objectives

Cost factors (minimize):

[best_cost, 100], [worst_acceptable_cost, 0]

Lower values → higher scores.

Service factors (maximize):

[minimum_acceptable, 0], [target, 99], [perfect, 100]

Higher values → higher scores.

Efficiency metrics (target range):

[too_low, 0], [optimal, 100], [too_high, 0]

Sweet spot in the middle.

3. Set Realistic Utility Curve Bounds

Too narrow:

[1900000,100],[2000000,0]

Only a 5% range - most solutions will score 0 or 100, providing little differentiation.

Too wide:

[500000,100],[5000000,0]

Unrealistic extremes - actual values may all cluster in a small region, reducing curve sensitivity.

Just right:

[1500000,100],[2500000,0]

Reasonable range around baseline (±25%) allows meaningful differentiation.

4. Balance Weight Distribution

Avoid extreme imbalances:

  • Cost:       Weight = 0.95
  • Service:    Weight = 0.05

Service becomes nearly irrelevant - Dendro will slash costs with little regard for service.

Prefer balanced or clearly justified ratios:

  • Cost:       Weight = 0.60
  • Service:    Weight = 0.40

Both factors matter; cost slightly more important.

Or equal weighting for exploration:

  • Cost:       Weight = 0.50
  • Service:    Weight = 0.50

Neutral stance - let Dendro find the natural trade-off.

5. Use Automatic Generation as a Starting Point

Workflow:

  1. Run automatic output factor generation
  2. Review the created factors and curves
  3. Adjust weights based on business priorities
  4. Refine utility curve shapes to match objectives
  5. Test and iterate

Benefits:

  • Quick start with reasonable defaults
  • Curves based on actual baseline performance
  • Easy to customize from a working foundation

6. Test Your Configuration

Before running full optimization:

  • Validate filters: Ensure they return expected data, e.g.:
SELECT * FROM SimulationFacilityCostSummaryReplicationDetail 
WHERE ScenarioName = 'Baseline' AND FacilityType = 'DC'
  • Check utility curve parsing: Verify your curve syntax is valid
    • [100,0],[200,100]  ✓ Valid
    • [100,0] [200,100]  ✗ Invalid (missing comma between pairs)
  • Simulate scoring: Manually calculate expected fitness for baseline
    • Extract metric values
    • Apply utility curves
    • Weight and sum
    • Compare to Dendro's actual baseline score

7. Review Score Distribution

After the Dendro runs have all completed, review the Overall Fitness Score values in the Simulation Evolutionary Algorithm Summary output table and the scores of the individiual otuput factors Simulation Evolutionary Algorithm Output Factor Report output tables.

Healthy optimization shows:

  • Wide range of scores in early generations (exploration)
  • Converging scores in later generations (refinement)
  • Best score steadily improving

Warning signs:

  • All scores very similar → Utility curves too flat or weights too imbalanced
  • No improvement → Input factors may not affect output metrics
  • Erratic scores → Possible simulation instability or measurement issues

Troubleshooting

The symptoms of the problems desribed in this section can generally be seen either in the Cosmic Frog output tables, typically the Simulation Evolutionary Algorithm Summary and/or the Simulation Evolutionary Algorithm Output Factor Report output tables, or in the logs of the base scenario that Dendro was run on. These logs can be reviewed using the Run Manager application. The following screenshot shows part of a Job Log of a Dendro run, which is the most detailed log available:

After opening the Run Manager application, users first need to select the base scenario that was kicked off running Dendro on it, (this scenario does not have a _GAx.xx postfix). Next select the Job Log by clicking on the 5th icon in the row of icons at the right top of the logs.

Besides the Job Log, the Job Records log (second icon in the row of icons at the top rightof the logs) can also be helpful; it contains status messages of a run at a more aggregated level. If a run ends in an error, the Job Error Log may provide useful troubleshooting information. This log is accessed by clicking on the last icon in the row of icons at the top right of the logs.

Problem: All chromosomes score the same

Symptom: Fitness scores are nearly identical across different policy combinations.

Possible causes:

Cause 1: Utility curves too flat

UtilityCurve: [0,100],[10000000,0]

Range is so wide that actual values ($1.5M-$2.5M) all map to ~80-90 points.

Solution: Narrow the utility curve to the realistic range of values.

Cause 2: Weights too imbalanced

  • Dominant factor:  Weight = 0.99
  • Other factors:    Weight = 0.01 (total)

One factor overwhelms all others, hiding differentiation.

Solution: Balance weights more evenly (unless extreme prioritization is truly intended).

Cause 3: Input factors do not affect output metrics - optimizing parameters that do not impact measured outcomes.

Solution: Verify that input factor changes influence output metrics via simulation.

Problem: Service factor not improving

Symptom: Cost decreases but service stays low or drops.

Possible causes:

Cause 1: Service weight too low

  • Cost:     Weight = 0.90
  • Service:  Weight = 0.10

Dendro focuses almost entirely on cost reduction.

Solution: Increase service weight to at least 0.30-0.50.

Cause 2: Service utility curve rewards poor performance

UtilityCurve: [80,50],[100,100]

80% service still gets 50 points - not enough penalty.

Solution: Use a steeper curve with lower minimum:

UtilityCurve: [80,0],[95,99],[100,100]

Cause 3: Conflicting objectives Impossible to improve service without exceeding cost limits defined in utility curves.

Solution: Relax cost constraints or adjust service targets to achievable levels.

Problem: Fitness scores keep getting recalculated

Symptom: Frequent rescaling events throughout optimization.

Possible cause: Utility curve bounds are too narrow; Dendro keeps finding values outside the range.

Solution:

  1. Widen utility curve boundaries to accommodate full range of possible values
  2. Use automatic generation (analyzes baseline to set appropriate ranges)
  3. Run a few test scenarios to understand realistic value ranges before final configuration

Problem: Output factor not found in results

Symptom: Error loading output factors or calculating fitness.

Possible causes:

Cause 1: Wrong table name

TableName: NetworkSummary

Actual table is SimulationNetworkSummaryReplicationDetail.

Solution: Use exact table name from database schema.

Cause 2: Wrong column name

ColumnName: TotalCost

Actual column is TotalSupplyChainCost.

Solution: Verify column names match simulation output schema exactly.

Cause 3: Filter returns no rows

Filter: Region='West Coast'

No rows in output table have Region='West Coast'.

Solution: Test filter with SQL query against actual simulation output.

Problem: Utility curve parsing error

Symptom: "UtilityCurve is None" or parsing failures.

Common syntax errors:

Missing commas between pairs:

[100,0][200,100]

Correct:

[100,0],[200,100]

Spaces inside brackets:

[ 100 , 0 ],[ 200 , 100 ]

Correct (spaces are removed automatically but avoid for clarity):

[100,0],[200,100]

Invalid numbers:

[1,000,0],[2,000,100]

Commas in numbers are invalid.

Correct:

[1000,0],[2000,100]

Single point:

[100,0]

Need at least two points for a curve.

Correct:

[100,0],[200,100]

Advanced Topics

Time-Based Output Factors

Optimize performance across different time periods:

  • Factor 1 - Peak Season Service:
    • Filter: Month IN (11,12)
    • Weight: 0.40
  • Factor 2 - Off-Season Service:
    • Filter: Month NOT IN (11,12)
    • Weight: 0.20
  • Factor 3 - Annual Cost:
    • Filter: (empty - all months)
    • Weight: 0.40

Result: Higher service standards during peak season, relaxed otherwise.

Category-Specific Output Factors

Different objectives for different product categories:

  • Factor 1 - A-Item Service (High priority):
    • Filter: ProductCategory='A'
    • UtilityCurve: [95,0],[98,99],[100,100]
    • Weight: 0.35
  • Factor 2 - B-Item Service (Medium priority):
    • Filter: ProductCategory='B'
    • UtilityCurve: [90,0],[95,99],[100,100]
    • Weight: 0.25
  • Factor 3 - C-Item Service (Low priority):
    • Filter: ProductCategory='C'
    • UtilityCurve: [85,0],[90,99],[100,100]
    • Weight: 0.15
  • Factor 4 - Total Cost (All categories):
    • Filter: (empty)
    • Weight: 0.25

Result: ABC-based service differentiation with balanced cost control.

Summary

Output factors define success in Dendro optimization:

What to measure: Metrics from simulation output tables

How good is good: Utility curves mapping values to quality scores

How important: Weights defining relative priorities

Key takeaways:

  1. Start simple - Use automatic generation or basic two-point curves
  2. Align with business goals - Utility curves should reflect real objectives
  3. Balance priorities - Weights should represent true trade-offs
  4. Set realistic bounds - Utility curves should span achievable value ranges
  5. Test before optimizing - Validate filters, curves, and baseline scoring
  6. Monitor and adjust - Review results and refine configuration iteratively

Well-configured output factors ensure Dendro optimizes for what truly matters to your business - whether that is cost minimization, service maximization, or balanced multi-objective optimization.

Other Helpful Resources

You may find these links helpful, some of which have already been mentioned above:

Please do not hesitate to contact the Optilogic Support team on support@optilogic.com for any questions or feedback.

Introduction

Output factors define what Dendro tries to optimize - they are your business objectives translated into measurable metrics. While input factors control what can change, output factors determine what "better" means.

Key concepts:

  • Input Factors = What can be optimized (the variables) - see the Dendro: Input Factors Guide
  • Output Factors = What you want to improve (the objectives) - covered in this article

This guide explains how to configure output factors to align Dendro's optimization with your business goals. These can be specified in the Output Factors input table in Cosmic Frog models.

Recommended reading prior to diving into this guide: Getting Started with Dendro, a high-level overview of how Dendro works, and Dendro: Genetic Algorithm Guide which explains the inner workings of Dendro in more detail.

What Are Output Factors?

The Big Picture

An output factor tells Dendro's genetic algorithm:

  1. What to measure: Which metric from which table (e.g., total cost from network summary)
  2. For which scope: Which subset of data to include (e.g., specific facilities, products, or all)
  3. How good is good: A utility curve that maps metric values to quality scores
  4. How important it is: A weight that defines its relative priority

Real-World Analogy

Imagine you are evaluating employee performance:

  • Metrics are like performance indicators: sales revenue, customer satisfaction, error rate
  • Utility curves define what constitutes good performance: $100K sales = excellent, $50K = poor
  • Weights reflect importance: sales revenue (40%), customer satisfaction (35%), error rate (25%)
  • Overall score combines all factors: 0.40 × sales_score + 0.35 × satisfaction_score + 0.25 × error_score

Dendro uses the same approach to evaluate inventory policy combinations across your supply chain.

Output Factor Configuration

The Output Factors Table

Output factors are configured in the Output Factors input table with the following columns:

Configuration Example

Example 1: Total Supply Chain Cost

Minimize overall supply chain costs:

  • OutputFactorName:    TotalCost
  • TableName:           SimulationNetworkSummaryReplicationDetail
  • ColumnName:          TotalSupplyChainCost
  • Filter:              (leave empty for all data)
  • UtilityCurve:        [1500000,100],[2000000,0]
  • OutputFactorWeight:  0.40
  • Status:              Include

Interpretation:

  • Measures total supply chain cost from the network summary table
  • $1.5M or less = perfect score (100 points)
  • $2.0M or more = worst score (0 points)
  • Values between are interpolated linearly
  • This factor contributes 40% to the overall fitness score

Example 2: Service Level Achievement

Maximize service level performance:

  • OutputFactorName:    ServiceLevel
  • TableName:           SimulationNetworkServiceSummaryReplicationDetail
  • ColumnName:          TotalPlacedCustomerOrderQuantityOnTimeInFullRate
  • Filter:              (leave empty)
  • UtilityCurve:        [0,0],[85,10],[95,99],[100,100]
  • OutputFactorWeight:  0.35
  • Status:              Include

Interpretation:

  • Measures on-time-in-full service rate
  • 0% service = 0 points (worst)
  • 85% service = 10 points (poor)
  • 95% service = 99 points (excellent - target)
  • 100% service = 100 points (perfect)
  • This factor contributes 35% to the overall fitness score

Example 3: Facility-Specific Holding Cost

Focus on inventory costs at distribution centers only:

  • OutputFactorName:    DC_HoldingCost
  • TableName:           SimulationFacilityCostSummaryReplicationDetail
  • ColumnName:          InventoryHoldingCost
  • Filter:              FacilityType='DC'
  • UtilityCurve:        [50000,100],[150000,0]
  • OutputFactorWeight:  0.25
  • Status:              Include

Interpretation:

  • Measures inventory holding costs specifically for Distribution Centers
  • Filter excludes plants, warehouses, and other facility types
  • Results from multiple DC rows are averaged
  • $50K or less = perfect, $150K or more = worst
  • Contributes 25% to overall score

The following 2 screenshots show the Output Factors input table in Cosmic Frog; it contains 3 rows which represent the 3 examples above:

Utility Curves Explained

What Is a Utility Curve?

A utility curve translates raw metric values (like dollars or percentages) into standardized quality scores (0-100 points). It answers the question: "How good is this value?".

Format:[value1,score1],[value2,score2],[value3,score3],...

Each [value,score] pair defines a point on the curve:

  • value: The raw metric value from simulation output
  • score: The quality assessment (0-100, higher is better)

Dendro connects these points with straight lines to create a piecewise linear curve.

Utility Curve Examples

Simple Two-Point Curve (Linear)

[1000,100],[2000,0]

Meaning:

  • 1000 or less → 100 points (perfect)
  • 2000 or more → 0 points (worst)
  • 1500 → 50 points (linear interpolation)

Visualization:

Best for:

  • Cost minimization (lower is better)
  • Simple monotonic relationships

Three-Point Curve (Piecewise Linear)

[50,0],[100,50],[150,100]

Meaning:

  • 50 or less → 0 points (too low, bad)
  • 100 → 50 points (acceptable)
  • 150 or more → 100 points (target achieved, excellent)

Visualization:

Best for:

  • Metrics where both too low AND too high are bad
  • Target range optimization

Four-Point Service Level Curve

[0,0],[85,10],[95,99],[100,100]

Meaning:

  • 0% service → 0 points (unacceptable)
  • 85% service → 10 points (poor, but some credit)
  • 95% service → 99 points (target met, nearly perfect)
  • 100% service → 100 points (perfect)

Characteristics:

  • Steep slope between 85% and 95% (service improvements highly valued)
  • Minimal improvement from 95% to 100% (diminishing returns)

Visualization:

Best for:

  • Service levels with clear targets
  • Emphasizing performance around critical thresholds

Dynamic Rescaling

The challenge: Early in optimization, Dendro does not know what the best and worst possible values are.

The solution: Utility curves automatically expand when new extremes are discovered.

Example scenario:

Generation 1:

  • Best cost seen: $1,800,000
  • Worst cost seen: $2,200,000
  • Curve: [1800000,100],[2200000,0]

Generation 5:

  • A new chromosome achieves: $1,600,000 (new minimum!)
  • Curve automatically rescales: [1600000,100],[2200000,0]
  • All previous scores are recalculated with the new scale

Why it matters:

  • Ensures fair comparison across all generations
  • Prevents early solutions from being unfairly favored
  • Adapts to the actual range of achievable performance

When rescaling occurs:

  • A value below the leftmost point is discovered (new minimum)
  • A value above the rightmost point is discovered (new maximum)
  • The curve stretches proportionally to accommodate the new extreme
  • All historical fitness scores are recalculated

Weights and Priority

Understanding Weights

Weights determine how much each output factor contributes to the overall fitness score.

Common approaches:

Approach 1: Percentages (Sum to 1.0)

  • Total Cost:          Weight = 0.40 (40%)
  • Service Level:       Weight = 0.35 (35%)
  • Inventory Value:     Weight = 0.25 (25%)
  •                      Total = 1.00 (100%)

Advantage: Easy to understand - directly represents percentage contribution.

Approach 2: Whole Numbers (Relative Importance)

  • Total Cost:          Weight = 40
  • Service Level:       Weight = 35
  • Inventory Value:     Weight = 25
  •                      Total = 100 (but could be any sum)

Advantage: Can use any convenient scale; Dendro handles normalization.

Approach 3: Priority Multipliers

  • Critical Factor:     Weight = 10
  • Important Factor:    Weight = 5
  • Secondary Factor:    Weight = 2
  • Minor Factor:        Weight = 1

Advantage: Emphasizes relative priorities clearly.

How Weights Affect Optimization

Example calculation:

Output Factors:

  1. Holding Cost:   Raw value = $80,000  → Utility score = 60  → Weight = 0.40
  2. Service Level:  Raw value = 94%      → Utility score = 85  → Weight = 0.35
  3. Transport Cost: Raw value = $45,000  → Utility score = 70  → Weight = 0.25

Weighted Contributions:

  1. Holding Cost:       60 × 0.40 = 24.0 points
  2. Service Level:      85 × 0.35 = 29.75 points
  3. Transport Cost:     70 × 0.25 = 17.5 points

Overall Fitness Score: 24.0 + 29.75 + 17.5 = 71.25 points

Higher fitness scores are better in Dendro

The fitness calculation adds these weighted scores, so the formula is:

Fitness = 24.0 + 29.75 + 17.5 = 71.25

Choosing Appropriate Weights

Balanced approach:

  • Cost factors (total):    50%
  • Service factors (total): 50%

Equal priority to cost reduction and service achievement.

Cost-focused approach:

  • Cost factors (total):    70%
  • Service factors (total): 30%

Emphasizes cost minimization; willing to accept moderate service levels.

Service-focused approach:

  • Cost factors (total):    30%
  • Service factors (total): 70%

Prioritizes customer service; cost is secondary.

Multi-objective balanced:

  • Holding cost:      25%
  • Transport cost:    25%
  • Service level:     25%
  • Inventory turns:   25%

Equal consideration to multiple objectives.

How Fitness Scoring Works

Step-by-Step Process

Step 1: Extract Metric Values

For each output factor, Dendro reads the metric value from the simulation results:

  • Factor 1 (Total Cost):     Reads TotalSupplyChainCost → $1,750,000
  • Factor 2 (Service Level):  Reads OnTimeInFullRate → 92%
  • Factor 3 (Holding Cost):   Reads InventoryHoldingCost → $320,000

Step 2: Look Up Raw Utility Scores

Each value is mapped to a raw score using its utility curve:

  • Factor 1: $1,750,000 → Utility curve [1500000,100],[2000000,0]
    • Interpolation: (1,750,000 - 1,500,000) / (2,000,000 - 1,500,000) = 0.5
    • Raw score: 100 - (0.5 × 100) = 50
  • Factor 2: 92% → Utility curve [0,0],[85,10],[95,99],[100,100]
    • Falls between 85 and 95: Interpolate
    • Raw score: 10 + ((92-85)/(95-85)) × (99-10) = 10 + 62.3 = 72.3
  • Factor 3: $320,000 → Utility curve [200000,100],[400000,0]
    • Interpolation: (320,000 - 200,000) / (400,000 - 200,000) = 0.6
    • Raw score: 100 - (0.6 × 100) = 40

Step 3: Normalize Scores (if needed)

Utility scores are scaled to a 0-100 range based on the min/max scores in the curve:

  • If all curves use 0-100 range → No additional scaling needed
  • Scores are already normalized: 50, 72.3, 40

Step 4: Apply Weights

Multiply each normalized score by its weight:

  • Factor 1: 50 × 0.40 = 20.0
  • Factor 2: 72.3 × 0.35 = 25.3
  • Factor 3: 40 × 0.25 = 10.0

Step 5: Sum Weighted Scores

Combine all weighted scores:

Overall score = 20.0 + 25.3 + 10.0 = 55.3

Comparing Chromosomes

Chromosome A:

  • Total Cost: $1,600,000 → Score 80 → Weighted 32.0
  • Service:    96%        → Score 100 → Weighted 35.0
  • Holding:    $280,000   → Score 60 → Weighted 15.0
  •                        Total:        82.0

Chromosome B:

  • Total Cost: $1,750,000 → Score 50 → Weighted 20.0
  • Service:    92%        → Score 72 → Weighted 25.2
  • Holding:    $320,000   → Score 40 → Weighted 10.0
  •                        Total:        55.2

Result: Chromosome A (fitness score of 82.0) is better than Chromosome B (fitness score of 55.2).

Chromosome A achieves better performance across all metrics, resulting in a higher fitness score.

In Cosmic Frog, the Overall Fitness Scores of all scenarios (=chromosomes) run can be assessed in the Simulation Evolutionary Algorithm Summary output table after a Dendro run has completed. Scores of individual output factors can be reviewed in the Simulation Evolutionary Algorithm Output Factor Report output table:

The top 10 records of the Simulation Evolutionary Algorithm Summary output table showing the 10 scenarios with the best overall fitness scores.
The Simulation Evolutionary Algorithm Output Factor Report output table showing the values and weighted scores of the individual output factors of the 5 best scenarios.

Automatic Output Factor Generation

Overview

The Automatically Generate Output Factors option automatically creates standard output factor configurations based on your target service levels and baseline simulation results. This option can be set in the Dendro section of the Technology Parameters.

When to use:

  • Starting a new Dendro project
  • You do not have pre-configured output factors
  • You want a balanced cost/service optimization

What it creates:

  1. Cost Factor: Minimize total supply chain cost
  2. Service Factor: Achieve target service level

How Automatic Generation Works

Cost Factor Generation

Step 1: Run baseline simulation Execute your current inventory policies to measure actual cost.

Step 2: Establish boundaries

  • Baseline Cost: $1,800,000
  • Left Boundary (best):    75% of baseline = $1,350,000
  • Right Boundary (worst): 110% of baseline = $1,980,000

Step 3: Create utility curve

UtilityCurve: [1350000,100],[1980000,0]

Interpretation:

  • Reducing cost by 25% or more → Perfect (100 points)
  • Increasing cost by 10% or more → Poor (0 points)
  • Linear interpolation between

Step 4: Set weight

OutputFactorWeight: 1 (50% when combined with service factor)

Service Factor Generation

Step 1: Use configured service targets

Step 2: Create multi-point utility curve

UtilityCurve: [0,0],[85,10],[95,99],[100,100]

Interpretation:

  • 0% service → 0 points (complete failure)
  • 85% service → 10 points (minimum acceptable threshold)
  • 95% service → 99 points (target achieved)
  • 100% service → 100 points (perfect)

Design rationale:

  • Steep slope between 85-95%: Strong incentive to reach target
  • Flat between 95-100%: Diminishing returns for over-achievement
  • Some credit at 85%: Acknowledges partial success

Step 3: Set weight

OutputFactorWeight: 1 (50% when combined with cost factor)

Result of Automatic Generation

OutputFactors Table:

  • Row 1:
    • OutputFactorName:    Cost
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          TotalSupplyChainCost
    • Filter:              NULL
    • UtilityCurve:        [1350000,100],[1980000,0]
    • OutputFactorWeight:  1
    • Status:              Include
  • Row 2:
    • OutputFactorName:    Service
    • TableName:           SimulationNetworkServiceSummaryReplicationDetail
    • ColumnName:          TotalPlacedCustomerOrderQuantityOnTimeInFullRate
    • Filter:              NULL
    • UtilityCurve:        [0,0],[85,10],[95,99],[100,100]
    • OutputFactorWeight:  1
    • Status:              Include

Optimization behavior: Dendro will seek policies that:

  1. Reduce total cost below baseline (up to 25% reduction rewarded)
  2. Achieve 95% service level (strong incentive)
  3. Balance these objectives equally (50/50 weighting)

Common Output Factor Configurations

Configuration 1: Cost Minimization Only

Goal: Find the lowest-cost inventory policies without service constraints.

Setup:

  • OutputFactorName:    TotalCost
  • TableName:           SimulationNetworkSummaryReplicationDetail
  • ColumnName:          TotalSupplyChainCost
  • UtilityCurve:        [1000000,100],[3000000,0]
  • OutputFactorWeight:  1.0

Result: Dendro minimizes cost aggressively; service may suffer.

When to use:

  • Internal supply chains where service is less critical
  • Cost reduction initiatives
  • Initial baseline to understand cost/service trade-offs

Configuration 2: Service Maximization with Cost Limit

Goal: Maximize service while preventing excessive cost increases.

Setup:

  • Factor 1 - Service (Primary):
    • OutputFactorName:    Service
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          OnTimeInFullRate
    • UtilityCurve:        [90,0],[95,50],[98,99],[100,100]
    • OutputFactorWeight:  0.70
  • Factor 2 - Cost (Constraint):
    • OutputFactorName:    CostLimit
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          TotalSupplyChainCost
    • UtilityCurve:        [1500000,100],[2000000,50],[2500000,0]
    • OutputFactorWeight:  0.30

Result: Dendro prioritizes service but penalizes solutions exceeding cost thresholds.

When to use:

  • Customer-facing supply chains
  • High service level commitments
  • Budget-constrained projects

Configuration 3: Balanced Multi-Objective

Goal: Optimize multiple objectives with balanced priorities.

Setup:

  • Factor 1 - Holding Cost:
    • OutputFactorName:    HoldingCost
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          InventoryHoldingCost
    • UtilityCurve:        [200000,100],[500000,0]
    • OutputFactorWeight:  0.25

  • Factor 2 - Transport Cost:
    • OutputFactorName:    TransportCost
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          TransportationCost
    • UtilityCurve:        [300000,100],[600000,0]
    • OutputFactorWeight:  0.25
  • Factor 3 - Service Level:
    • OutputFactorName:    Service
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          FillRate
    • UtilityCurve:        [85,0],[95,99],[100,100]
    • OutputFactorWeight:  0.30
  • Factor 4 - Inventory Turns:
    • OutputFactorName:    InventoryTurns
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          InventoryTurns
    • UtilityCurve:        [2,0],[6,50],[12,100]
    • OutputFactorWeight:  0.20

Result: Dendro finds well-rounded solutions balancing cost, service, and efficiency.

When to use:

  • Complex supply chains with multiple stakeholders
  • Strategic planning initiatives
  • Comprehensive optimization projects

Configuration 4: Regional Differentiation

Goal: Different service targets for different regions.

Setup:

  • Factor 1 - Premium Region Service:
    • OutputFactorName:    Premium_Service
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          FillRate
    • Filter:              Region='Premium'
    • UtilityCurve:        [92,0],[98,99],[100,100]
    • OutputFactorWeight:  0.40
  • Factor 2 - Standard Region Service:
    • OutputFactorName:    Standard_Service
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          FillRate
    • Filter:              Region='Standard'
    • UtilityCurve:        [85,0],[92,99],[100,100]
    • OutputFactorWeight:  0.30
  • Factor 3 - Overall Cost:
    • OutputFactorName:    TotalCost
    • TableName:           SimulationNetworkSummaryReplicationDetail
    • ColumnName:          TotalSupplyChainCost
    • UtilityCurve:        [2000000,100],[3000000,0]
    • OutputFactorWeight:  0.30

Result: Premium regions get higher service targets; standard regions have lower thresholds.

When to use:

  • Multi-tier customer segments
  • Geographic differentiation strategies
  • SLA-based service requirements

Multi-Row Handling

The Challenge

Some output tables contain multiple rows per scenario (e.g., one row per facility or product). Dendro combines these into a single metric value by using a straight average calculation. More options will be added in future releases.

How it works: Calculates the arithmetic mean of all matching rows.

SQL equivalent:

SELECT AVG(ColumnName) 
FROM TableName 
WHERE ScenarioName = 'Gen3_Chr5' AND [Filter]

Example:

  • Facility A holding cost: $80,000
  • Facility B holding cost: $120,000
  • Facility C holding cost: $100,000
  • SimpleAverage: ($80,000 + $120,000 + $100,000) / 3 = $100,000

Best for:

  • Metrics where all entities are equally important
  • Balanced optimization across all facilities/products
  • Simple, intuitive interpretation

Best Practices

1. Start with Simple Utility Curves

Do not use:

[0,0],[10,5],[20,15],[30,28],[40,45],[50,65],[60,82],[70,95],[80,98],[90,99],[100,100]

Over-complicated curves are hard to understand and maintain.

Do use:

[0,0],[85,10],[95,99],[100,100]

Simple curves with clear inflection points at meaningful thresholds.

Principle: Use the minimum number of points to capture your business logic.

2. Align Utility Curves with Business Objectives

Cost factors (minimize):

[best_cost, 100], [worst_acceptable_cost, 0]

Lower values → higher scores.

Service factors (maximize):

[minimum_acceptable, 0], [target, 99], [perfect, 100]

Higher values → higher scores.

Efficiency metrics (target range):

[too_low, 0], [optimal, 100], [too_high, 0]

Sweet spot in the middle.

3. Set Realistic Utility Curve Bounds

Too narrow:

[1900000,100],[2000000,0]

Only a 5% range - most solutions will score 0 or 100, providing little differentiation.

Too wide:

[500000,100],[5000000,0]

Unrealistic extremes - actual values may all cluster in a small region, reducing curve sensitivity.

Just right:

[1500000,100],[2500000,0]

Reasonable range around baseline (±25%) allows meaningful differentiation.

4. Balance Weight Distribution

Avoid extreme imbalances:

  • Cost:       Weight = 0.95
  • Service:    Weight = 0.05

Service becomes nearly irrelevant - Dendro will slash costs with little regard for service.

Prefer balanced or clearly justified ratios:

  • Cost:       Weight = 0.60
  • Service:    Weight = 0.40

Both factors matter; cost slightly more important.

Or equal weighting for exploration:

  • Cost:       Weight = 0.50
  • Service:    Weight = 0.50

Neutral stance - let Dendro find the natural trade-off.

5. Use Automatic Generation as a Starting Point

Workflow:

  1. Run automatic output factor generation
  2. Review the created factors and curves
  3. Adjust weights based on business priorities
  4. Refine utility curve shapes to match objectives
  5. Test and iterate

Benefits:

  • Quick start with reasonable defaults
  • Curves based on actual baseline performance
  • Easy to customize from a working foundation

6. Test Your Configuration

Before running full optimization:

  • Validate filters: Ensure they return expected data, e.g.:
SELECT * FROM SimulationFacilityCostSummaryReplicationDetail 
WHERE ScenarioName = 'Baseline' AND FacilityType = 'DC'
  • Check utility curve parsing: Verify your curve syntax is valid
    • [100,0],[200,100]  ✓ Valid
    • [100,0] [200,100]  ✗ Invalid (missing comma between pairs)
  • Simulate scoring: Manually calculate expected fitness for baseline
    • Extract metric values
    • Apply utility curves
    • Weight and sum
    • Compare to Dendro's actual baseline score

7. Review Score Distribution

After the Dendro runs have all completed, review the Overall Fitness Score values in the Simulation Evolutionary Algorithm Summary output table and the scores of the individiual otuput factors Simulation Evolutionary Algorithm Output Factor Report output tables.

Healthy optimization shows:

  • Wide range of scores in early generations (exploration)
  • Converging scores in later generations (refinement)
  • Best score steadily improving

Warning signs:

  • All scores very similar → Utility curves too flat or weights too imbalanced
  • No improvement → Input factors may not affect output metrics
  • Erratic scores → Possible simulation instability or measurement issues

Troubleshooting

The symptoms of the problems desribed in this section can generally be seen either in the Cosmic Frog output tables, typically the Simulation Evolutionary Algorithm Summary and/or the Simulation Evolutionary Algorithm Output Factor Report output tables, or in the logs of the base scenario that Dendro was run on. These logs can be reviewed using the Run Manager application. The following screenshot shows part of a Job Log of a Dendro run, which is the most detailed log available:

After opening the Run Manager application, users first need to select the base scenario that was kicked off running Dendro on it, (this scenario does not have a _GAx.xx postfix). Next select the Job Log by clicking on the 5th icon in the row of icons at the right top of the logs.

Besides the Job Log, the Job Records log (second icon in the row of icons at the top rightof the logs) can also be helpful; it contains status messages of a run at a more aggregated level. If a run ends in an error, the Job Error Log may provide useful troubleshooting information. This log is accessed by clicking on the last icon in the row of icons at the top right of the logs.

Problem: All chromosomes score the same

Symptom: Fitness scores are nearly identical across different policy combinations.

Possible causes:

Cause 1: Utility curves too flat

UtilityCurve: [0,100],[10000000,0]

Range is so wide that actual values ($1.5M-$2.5M) all map to ~80-90 points.

Solution: Narrow the utility curve to the realistic range of values.

Cause 2: Weights too imbalanced

  • Dominant factor:  Weight = 0.99
  • Other factors:    Weight = 0.01 (total)

One factor overwhelms all others, hiding differentiation.

Solution: Balance weights more evenly (unless extreme prioritization is truly intended).

Cause 3: Input factors do not affect output metrics - optimizing parameters that do not impact measured outcomes.

Solution: Verify that input factor changes influence output metrics via simulation.

Problem: Service factor not improving

Symptom: Cost decreases but service stays low or drops.

Possible causes:

Cause 1: Service weight too low

  • Cost:     Weight = 0.90
  • Service:  Weight = 0.10

Dendro focuses almost entirely on cost reduction.

Solution: Increase service weight to at least 0.30-0.50.

Cause 2: Service utility curve rewards poor performance

UtilityCurve: [80,50],[100,100]

80% service still gets 50 points - not enough penalty.

Solution: Use a steeper curve with lower minimum:

UtilityCurve: [80,0],[95,99],[100,100]

Cause 3: Conflicting objectives Impossible to improve service without exceeding cost limits defined in utility curves.

Solution: Relax cost constraints or adjust service targets to achievable levels.

Problem: Fitness scores keep getting recalculated

Symptom: Frequent rescaling events throughout optimization.

Possible cause: Utility curve bounds are too narrow; Dendro keeps finding values outside the range.

Solution:

  1. Widen utility curve boundaries to accommodate full range of possible values
  2. Use automatic generation (analyzes baseline to set appropriate ranges)
  3. Run a few test scenarios to understand realistic value ranges before final configuration

Problem: Output factor not found in results

Symptom: Error loading output factors or calculating fitness.

Possible causes:

Cause 1: Wrong table name

TableName: NetworkSummary

Actual table is SimulationNetworkSummaryReplicationDetail.

Solution: Use exact table name from database schema.

Cause 2: Wrong column name

ColumnName: TotalCost

Actual column is TotalSupplyChainCost.

Solution: Verify column names match simulation output schema exactly.

Cause 3: Filter returns no rows

Filter: Region='West Coast'

No rows in output table have Region='West Coast'.

Solution: Test filter with SQL query against actual simulation output.

Problem: Utility curve parsing error

Symptom: "UtilityCurve is None" or parsing failures.

Common syntax errors:

Missing commas between pairs:

[100,0][200,100]

Correct:

[100,0],[200,100]

Spaces inside brackets:

[ 100 , 0 ],[ 200 , 100 ]

Correct (spaces are removed automatically but avoid for clarity):

[100,0],[200,100]

Invalid numbers:

[1,000,0],[2,000,100]

Commas in numbers are invalid.

Correct:

[1000,0],[2000,100]

Single point:

[100,0]

Need at least two points for a curve.

Correct:

[100,0],[200,100]

Advanced Topics

Time-Based Output Factors

Optimize performance across different time periods:

  • Factor 1 - Peak Season Service:
    • Filter: Month IN (11,12)
    • Weight: 0.40
  • Factor 2 - Off-Season Service:
    • Filter: Month NOT IN (11,12)
    • Weight: 0.20
  • Factor 3 - Annual Cost:
    • Filter: (empty - all months)
    • Weight: 0.40

Result: Higher service standards during peak season, relaxed otherwise.

Category-Specific Output Factors

Different objectives for different product categories:

  • Factor 1 - A-Item Service (High priority):
    • Filter: ProductCategory='A'
    • UtilityCurve: [95,0],[98,99],[100,100]
    • Weight: 0.35
  • Factor 2 - B-Item Service (Medium priority):
    • Filter: ProductCategory='B'
    • UtilityCurve: [90,0],[95,99],[100,100]
    • Weight: 0.25
  • Factor 3 - C-Item Service (Low priority):
    • Filter: ProductCategory='C'
    • UtilityCurve: [85,0],[90,99],[100,100]
    • Weight: 0.15
  • Factor 4 - Total Cost (All categories):
    • Filter: (empty)
    • Weight: 0.25

Result: ABC-based service differentiation with balanced cost control.

Summary

Output factors define success in Dendro optimization:

What to measure: Metrics from simulation output tables

How good is good: Utility curves mapping values to quality scores

How important: Weights defining relative priorities

Key takeaways:

  1. Start simple - Use automatic generation or basic two-point curves
  2. Align with business goals - Utility curves should reflect real objectives
  3. Balance priorities - Weights should represent true trade-offs
  4. Set realistic bounds - Utility curves should span achievable value ranges
  5. Test before optimizing - Validate filters, curves, and baseline scoring
  6. Monitor and adjust - Review results and refine configuration iteratively

Well-configured output factors ensure Dendro optimizes for what truly matters to your business - whether that is cost minimization, service maximization, or balanced multi-objective optimization.

Other Helpful Resources

You may find these links helpful, some of which have already been mentioned above:

Please do not hesitate to contact the Optilogic Support team on support@optilogic.com for any questions or feedback.

Have More Questions?

Contact Support

Get in touch

Contact Sales

Get in touch

Visit Frogger Pond Community

Visit our Community