Class ProductionOptimizer

java.lang.Object
neqsim.process.util.optimizer.ProductionOptimizer

public class ProductionOptimizer extends Object
Production optimization utility for process simulation models.

This class provides comprehensive optimization capabilities for NeqSim process models, supporting single-variable and multi-variable optimization with multiple search algorithms. It can maximize throughput subject to equipment capacity constraints, or optimize arbitrary objective functions with configurable constraints.

Supported Search Algorithms

  • BINARY_FEASIBILITY - Traditional monotonic binary search on feasibility. Fast for single-variable problems where feasibility is monotonic with respect to the decision variable.
  • GOLDEN_SECTION_SCORE - Golden-section search on a composite score. Suitable for single-variable non-monotonic responses.
  • NELDER_MEAD_SCORE - Nelder-Mead simplex algorithm for multi-dimensional optimization. Does not require gradients; works well for 2-10 decision variables.
  • PARTICLE_SWARM_SCORE - Particle swarm optimization for global search. Good for non-convex problems with multiple local optima.

Multi-Objective Optimization

The optimizer supports Pareto multi-objective optimization via weighted-sum scalarization. This generates a Pareto front by solving multiple single-objective problems with different weight combinations. Use optimizePareto(ProcessSystem, StreamInterface, ProductionOptimizer.OptimizationConfig, List, List) for multi-objective problems.

Usage Example (Java)

// Create process model
ProcessSystem process = new ProcessSystem();
Stream feed = new Stream("feed", fluid);
feed.setFlowRate(100000.0, "kg/hr");
Compressor compressor = new Compressor("compressor", feed);
process.add(feed);
process.add(compressor);
process.run();

// Configure and run optimization
ProductionOptimizer optimizer = new ProductionOptimizer();
OptimizationConfig config = new OptimizationConfig(50000.0, 200000.0).tolerance(100.0)
    .searchMode(SearchMode.GOLDEN_SECTION_SCORE).maxIterations(30);

OptimizationResult result = optimizer.optimize(process, feed, config, null, null);
System.out.println("Optimal rate: " + result.getOptimalRate() + " kg/hr");

Usage Example (Python via neqsim-python/JPype)

from neqsim.neqsimpython import jneqsim

# Import classes
ProductionOptimizer = jneqsim.process.util.optimizer.ProductionOptimizer
OptimizationConfig = ProductionOptimizer.OptimizationConfig
SearchMode = ProductionOptimizer.SearchMode

# Create optimizer and config
optimizer = ProductionOptimizer()
config = OptimizationConfig(50000.0, 200000.0) \
    .tolerance(100.0) \
    .searchMode(SearchMode.GOLDEN_SECTION_SCORE)

# Run optimization
result = optimizer.optimize(process, feed, config, None, None)
print(f"Optimal rate: {result.getOptimalRate():.0f} kg/hr")

Multi-Variable Optimization Example

// Define manipulated variables
List<ManipulatedVariable> variables = Arrays.asList(
    new ManipulatedVariable("flowRate", 50000, 200000, "kg/hr",
        (proc, val) -> proc.getUnit("feed").setFlowRate(val, "kg/hr")),
    new ManipulatedVariable("pressure", 100, 200, "bara",
        (proc, val) -> ((Compressor) proc.getUnit("comp")).setOutletPressure(val, "bara")));

OptimizationConfig config = new OptimizationConfig(0, 1) // bounds ignored for multi-var
    .searchMode(SearchMode.NELDER_MEAD_SCORE);

OptimizationResult result = optimizer.optimize(process, variables, config, objectives, null);
Version:
1.0
Author:
NeqSim Development Team
See Also: