Class PortfolioOptimizer

java.lang.Object
neqsim.process.fielddevelopment.economics.PortfolioOptimizer
All Implemented Interfaces:
Serializable

public class PortfolioOptimizer extends Object implements Serializable
Multi-field portfolio optimizer for capital-constrained investment decisions.

Optimizes project selection across multiple fields subject to annual capital budget constraints. Uses value-based ranking with optional risk weighting to maximize portfolio NPV while respecting budget limits for each year.

Optimization Approaches

  • Greedy NPV/CAPEX: Rank by NPV/investment ratio, select until budget exhausted
  • Risk-Weighted: Adjust ranking by probability of success
  • Balanced: Ensure mix of project types (development, IOR, exploration)

Example Usage

PortfolioOptimizer optimizer = new PortfolioOptimizer();

// Add projects
optimizer.addProject("Field A", 500.0, 850.0, ProjectType.DEVELOPMENT, 0.85);
optimizer.addProject("Field B", 300.0, 420.0, ProjectType.DEVELOPMENT, 0.90);
optimizer.addProject("Field C IOR", 100.0, 180.0, ProjectType.IOR, 0.95);
optimizer.addProject("Exploration X", 150.0, 600.0, ProjectType.EXPLORATION, 0.30);

// Set annual budget constraints
optimizer.setAnnualBudget(2025, 400.0);
optimizer.setAnnualBudget(2026, 450.0);
optimizer.setAnnualBudget(2027, 350.0);

// Optimize
PortfolioResult result = optimizer.optimize(OptimizationStrategy.GREEDY_NPV_RATIO);

// Results
System.out.println("Selected projects: " + result.getSelectedProjects());
System.out.println("Portfolio NPV: " + result.getTotalNpv() + " MUSD");
System.out.println("Capital efficiency: " + result.getCapitalEfficiency());
Version:
1.0
Author:
ESOL
See Also:
  • Field Details

    • serialVersionUID

      private static final long serialVersionUID
      See Also:
    • logger

      private static final org.apache.logging.log4j.Logger logger
      Logger instance.
    • projects

      private List<PortfolioOptimizer.Project> projects
      List of candidate projects.
    • annualBudgets

      private Map<Integer,Double> annualBudgets
      Annual budget constraints (year to budget in MUSD).
    • totalBudgetMusd

      private double totalBudgetMusd
      Total budget constraint (across all years).
    • minAllocationByType

      private Map<PortfolioOptimizer.ProjectType, Double> minAllocationByType
      Minimum allocation per project type.
    • maxAllocationByType

      private Map<PortfolioOptimizer.ProjectType, Double> maxAllocationByType
      Maximum allocation per project type.
  • Constructor Details

    • PortfolioOptimizer

      public PortfolioOptimizer()
      Creates a new portfolio optimizer.
  • Method Details

    • addProject

      public PortfolioOptimizer.Project addProject(String name, double capexMusd, double npvMusd, PortfolioOptimizer.ProjectType type, double probabilityOfSuccess)
      Add a project to the portfolio candidates.
      Parameters:
      name - project name
      capexMusd - total CAPEX in MUSD
      npvMusd - NPV in MUSD
      type - project type
      probabilityOfSuccess - probability of success (0-1)
      Returns:
      the created project for further configuration
    • addProject

      public PortfolioOptimizer.Project addProject(String name, double npvMusd, PortfolioOptimizer.ProjectType type, double probabilityOfSuccess, Map<Integer,Double> capexProfile)
      Add a project with detailed CAPEX profile.
      Parameters:
      name - project name
      npvMusd - NPV in MUSD
      type - project type
      probabilityOfSuccess - probability of success
      capexProfile - yearly CAPEX profile
      Returns:
      the created project
    • addProject

      public void addProject(PortfolioOptimizer.Project project)
      Add a project directly.
      Parameters:
      project - the project to add
    • getProjects

      public List<PortfolioOptimizer.Project> getProjects()
      Get all candidate projects.
      Returns:
      list of projects
    • clearProjects

      public void clearProjects()
      Clear all projects.
    • setAnnualBudget

      public void setAnnualBudget(int year, double budgetMusd)
      Set annual budget constraint.
      Parameters:
      year - the year
      budgetMusd - budget in MUSD
    • setTotalBudget

      public void setTotalBudget(double totalMusd)
      Set total budget constraint across all years.
      Parameters:
      totalMusd - total budget in MUSD
    • setMinAllocation

      public void setMinAllocation(PortfolioOptimizer.ProjectType type, double minMusd)
      Set minimum allocation for a project type.
      Parameters:
      type - project type
      minMusd - minimum CAPEX allocation
    • setMaxAllocation

      public void setMaxAllocation(PortfolioOptimizer.ProjectType type, double maxMusd)
      Set maximum allocation for a project type.
      Parameters:
      type - project type
      maxMusd - maximum CAPEX allocation
    • optimize

      Optimize the portfolio using the specified strategy.
      Parameters:
      strategy - optimization strategy
      Returns:
      portfolio result
    • optimizeGreedyNpvRatio

      private PortfolioOptimizer.PortfolioResult optimizeGreedyNpvRatio()
      Optimize using greedy NPV/CAPEX ratio selection.
      Returns:
      optimized portfolio result
    • optimizeGreedyAbsoluteNpv

      private PortfolioOptimizer.PortfolioResult optimizeGreedyAbsoluteNpv()
      Optimize using greedy absolute NPV selection.
      Returns:
      optimized portfolio result
    • optimizeRiskWeighted

      private PortfolioOptimizer.PortfolioResult optimizeRiskWeighted()
      Optimize using risk-weighted NPV ratio.
      Returns:
      optimized portfolio result
    • optimizeEmv

      private PortfolioOptimizer.PortfolioResult optimizeEmv()
      Optimize using expected monetary value.
      Returns:
      optimized portfolio result
    • optimizeBalanced

      private PortfolioOptimizer.PortfolioResult optimizeBalanced()
      Optimize with balanced allocation across project types.
      Returns:
      optimized portfolio result
    • selectProjects

      Select projects respecting budget constraints.
      Parameters:
      ranked - list of projects ranked by selection priority
      strategy - the optimization strategy being used
      Returns:
      optimized portfolio result with selected projects
    • canAfford

      private boolean canAfford(PortfolioOptimizer.Project p, Map<Integer,Double> remainingBudget, double remainingTotal)
      Check if a project can be afforded within budget constraints.
      Parameters:
      p - the project to check
      remainingBudget - map of year to remaining budget for that year
      remainingTotal - the total remaining budget across all years
      Returns:
      true if the project can be afforded, false otherwise
    • deductCapex

      private void deductCapex(PortfolioOptimizer.Project p, Map<Integer,Double> remainingBudget)
      Deduct project CAPEX from remaining budgets.
      Parameters:
      p - the project whose CAPEX should be deducted
      remainingBudget - map of year to remaining budget to update
    • dependenciesSatisfied

      private boolean dependenciesSatisfied(PortfolioOptimizer.Project p, List<PortfolioOptimizer.Project> selected)
      Check if all dependencies are satisfied.
      Parameters:
      p - the project to check dependencies for
      selected - the list of already selected projects
      Returns:
      true if all dependencies are satisfied, false otherwise
    • compareStrategies

      Compare multiple optimization strategies.
      Returns:
      map of strategy to result
    • generateComparisonReport

      public String generateComparisonReport()
      Generate comparison report for all strategies.
      Returns:
      formatted comparison report