Class PortfolioOptimizer
java.lang.Object
neqsim.process.fielddevelopment.economics.PortfolioOptimizer
- All Implemented Interfaces:
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:
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic enumOptimization strategy.static classPortfolio optimization result.static classSingle project in the portfolio.static enumProject type classification. -
Field Summary
FieldsModifier and TypeFieldDescriptionAnnual budget constraints (year to budget in MUSD).private static final org.apache.logging.log4j.LoggerLogger instance.private Map<PortfolioOptimizer.ProjectType, Double> Maximum allocation per project type.private Map<PortfolioOptimizer.ProjectType, Double> Minimum allocation per project type.private List<PortfolioOptimizer.Project> List of candidate projects.private static final longprivate doubleTotal budget constraint (across all years). -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionaddProject(String name, double capexMusd, double npvMusd, PortfolioOptimizer.ProjectType type, double probabilityOfSuccess) Add a project to the portfolio candidates.addProject(String name, double npvMusd, PortfolioOptimizer.ProjectType type, double probabilityOfSuccess, Map<Integer, Double> capexProfile) Add a project with detailed CAPEX profile.voidaddProject(PortfolioOptimizer.Project project) Add a project directly.private booleancanAfford(PortfolioOptimizer.Project p, Map<Integer, Double> remainingBudget, double remainingTotal) Check if a project can be afforded within budget constraints.voidClear all projects.Compare multiple optimization strategies.private voiddeductCapex(PortfolioOptimizer.Project p, Map<Integer, Double> remainingBudget) Deduct project CAPEX from remaining budgets.private booleanCheck if all dependencies are satisfied.Generate comparison report for all strategies.Get all candidate projects.Optimize the portfolio using the specified strategy.Optimize with balanced allocation across project types.Optimize using expected monetary value.Optimize using greedy absolute NPV selection.Optimize using greedy NPV/CAPEX ratio selection.Optimize using risk-weighted NPV ratio.selectProjects(List<PortfolioOptimizer.Project> ranked, PortfolioOptimizer.OptimizationStrategy strategy) Select projects respecting budget constraints.voidsetAnnualBudget(int year, double budgetMusd) Set annual budget constraint.voidsetMaxAllocation(PortfolioOptimizer.ProjectType type, double maxMusd) Set maximum allocation for a project type.voidsetMinAllocation(PortfolioOptimizer.ProjectType type, double minMusd) Set minimum allocation for a project type.voidsetTotalBudget(double totalMusd) Set total budget constraint across all years.
-
Field Details
-
serialVersionUID
private static final long serialVersionUID- See Also:
-
logger
private static final org.apache.logging.log4j.Logger loggerLogger instance. -
projects
List of candidate projects. -
annualBudgets
-
totalBudgetMusd
private double totalBudgetMusdTotal budget constraint (across all years). -
minAllocationByType
Minimum allocation per project type. -
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 namecapexMusd- total CAPEX in MUSDnpvMusd- NPV in MUSDtype- project typeprobabilityOfSuccess- 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 namenpvMusd- NPV in MUSDtype- project typeprobabilityOfSuccess- probability of successcapexProfile- yearly CAPEX profile- Returns:
- the created project
-
addProject
Add a project directly.- Parameters:
project- the project to add
-
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 yearbudgetMusd- budget in MUSD
-
setTotalBudget
public void setTotalBudget(double totalMusd) Set total budget constraint across all years.- Parameters:
totalMusd- total budget in MUSD
-
setMinAllocation
Set minimum allocation for a project type.- Parameters:
type- project typeminMusd- minimum CAPEX allocation
-
setMaxAllocation
Set maximum allocation for a project type.- Parameters:
type- project typemaxMusd- maximum CAPEX allocation
-
optimize
public PortfolioOptimizer.PortfolioResult optimize(PortfolioOptimizer.OptimizationStrategy strategy) Optimize the portfolio using the specified strategy.- Parameters:
strategy- optimization strategy- Returns:
- portfolio result
-
optimizeGreedyNpvRatio
Optimize using greedy NPV/CAPEX ratio selection. -
optimizeGreedyAbsoluteNpv
Optimize using greedy absolute NPV selection. -
optimizeRiskWeighted
Optimize using risk-weighted NPV ratio. -
optimizeEmv
Optimize using expected monetary value. -
optimizeBalanced
Optimize with balanced allocation across project types. -
selectProjects
private PortfolioOptimizer.PortfolioResult selectProjects(List<PortfolioOptimizer.Project> ranked, PortfolioOptimizer.OptimizationStrategy strategy) Select projects respecting budget constraints. -
canAfford
private boolean canAfford(PortfolioOptimizer.Project p, Map<Integer, Double> remainingBudget, double remainingTotal) Check if a project can be afforded within budget constraints. -
deductCapex
Deduct project CAPEX from remaining budgets. -
dependenciesSatisfied
private boolean dependenciesSatisfied(PortfolioOptimizer.Project p, List<PortfolioOptimizer.Project> selected) Check if all dependencies are satisfied. -
compareStrategies
public Map<PortfolioOptimizer.OptimizationStrategy, PortfolioOptimizer.PortfolioResult> compareStrategies()Compare multiple optimization strategies.- Returns:
- map of strategy to result
-
generateComparisonReport
Generate comparison report for all strategies.- Returns:
- formatted comparison report
-