Package neqsim.process.util.optimizer


package neqsim.process.util.optimizer
Process optimization engine and constraint evaluation utilities.

This package provides a comprehensive framework for process optimization. For a detailed overview of when to use which optimizer, see the documentation at docs/process/optimization/OPTIMIZATION_OVERVIEW.md.

Two Main Optimizers - When to Use Which:

Optimizer Selection Guide
Scenario Use
Find max throughput at given pressures ProcessOptimizationEngine
Find bottleneck equipment ProcessOptimizationEngine
Generate Eclipse VFP tables ProcessOptimizationEngine
Custom objective (e.g., minimize cost) ProductionOptimizer
Multi-variable optimization ProductionOptimizer
Pareto multi-objective ProductionOptimizer
Model calibration to data BatchParameterEstimator

Core Classes:

Key Features:

  • Multiple Search Algorithms: Binary search, golden section, gradient descent, Armijo-Wolfe line search, BFGS, Nelder-Mead, and Particle Swarm
  • Constraint Caching: TTL-based caching for repeated constraint evaluations
  • Sensitivity Analysis: Calculate flow sensitivities and shadow prices
  • Bottleneck Detection: Identify limiting equipment and constraints
  • Multi-Objective Pareto: Generate Pareto fronts for conflicting objectives
  • Parallel Evaluation: Evaluate scenarios in parallel
  • FlowRateOptimizer Integration: Seamless integration with production optimizer
  • Adjuster Integration: Coordinate optimization with existing Adjuster units
  • Eclipse Export: Generate VFPPROD, VFPINJ, and VFPEXP tables
  • Fluent API: Builder pattern for convenient configuration

Quick Start - ProcessOptimizationEngine (throughput-focused):

// Find maximum throughput at given pressures
ProcessOptimizationEngine engine = new ProcessOptimizationEngine(process);
engine.setSearchAlgorithm(SearchAlgorithm.GOLDEN_SECTION);

OptimizationResult result = engine.findMaximumThroughput(50.0, // inlet pressure (bara)
    10.0, // outlet pressure (bara)
    1000.0, // min flow
    100000.0 // max flow
);

System.out.println("Max flow: " + result.getOptimalValue() + " kg/hr");
System.out.println("Bottleneck: " + result.getBottleneck());

Quick Start - ProductionOptimizer (general-purpose):

// Optimize with custom objective
ProductionOptimizer optimizer = new ProductionOptimizer();
OptimizationConfig config = new OptimizationConfig(50000.0, 200000.0).tolerance(100.0)
    .searchMode(SearchMode.GOLDEN_SECTION_SCORE);

// Define objective (minimize compressor power)
List<OptimizationObjective> objectives = Arrays.asList(new OptimizationObjective("power",
    proc -> ((Compressor) proc.getUnit("comp")).getPower("kW"), 1.0, ObjectiveType.MINIMIZE));

OptimizationResult result = optimizer.optimize(process, feed, config, objectives, null);

Pareto Multi-Objective Optimization:

// Trade off throughput vs power
List<OptimizationObjective> objectives = Arrays.asList(
    new OptimizationObjective("throughput", proc -> proc.getUnit("outlet").getFlowRate("kg/hr"),
        1.0, ObjectiveType.MAXIMIZE),
    new OptimizationObjective("power",
        proc -> ((Compressor) proc.getUnit("comp")).getPower("kW"), 1.0,
        ObjectiveType.MINIMIZE));

OptimizationConfig config = new OptimizationConfig(50000.0, 200000.0).paretoGridSize(20);

ParetoResult pareto = optimizer.optimizePareto(process, feed, config, objectives);

for (ParetoPoint pt : pareto.getPoints()) {
  System.out.println("Flow: " + pt.getObjectives().get("throughput") + ", Power: "
      + pt.getObjectives().get("power"));
}

Constraint Evaluation with Caching:

ProcessConstraintEvaluator evaluator = new ProcessConstraintEvaluator(process);
evaluator.setCacheTTLMillis(30000); // 30 second cache

// Evaluate constraints (uses cache if valid)
ProcessConstraintEvaluator.ConstraintEvaluationResult result = evaluator.evaluate();

System.out.println("Utilization: " + result.getOverallUtilization() * 100 + "%");
System.out.println("Bottleneck: " + result.getBottleneckEquipment());

// Calculate flow sensitivities
Map<String, Double> sensitivities = evaluator.calculateFlowSensitivities(5000.0, "kg/hr");

// Estimate max feasible flow
double maxFlow = evaluator.estimateMaxFlow(5000.0, "kg/hr");
Version:
1.8
Author:
NeqSim Development Team
See Also: