Investment Optimization

SpineOpt offers numerous ways to optimise investment decisions energy system models and in particular, offers a number of methodologies for capturing increased detail in investment models while containing the impact on run time. The basic principles of investments will be discussed first and this will be followed by more advanced approaches.

Key concepts for investments

Investment Decisions

These are the investment decisions that SpineOpt currently supports. At a high level, this means that the activity of the entities in question is controlled by an investment decision variable. The current implementation supports investments in:

Investment Variable Types

In all cases the capacity of the unit or connection or the maximum node state of a node is multiplied by the investment variable which may none, linear, integer or binary. This is determined, for units and connections, by setting the investment_variable_type parameter accordingly. Similarly, for node storages the storage_investment_variable_type is specified.

Identiying Investment Candidate Units, Connections and Storages

The parameter investment_count_max_cumulative represents the number of units of this type that may be invested in. investment_count_max_cumulative determines the upper bound of the investment variable and setting this to a value greater than 0 together with setting investment_variable_type to something else than none identifies the unit as an investment candidate unit in the optimisation. If the investment_variable_type is set to integer, the investment variable can be interpreted as the number of discrete units that may be invested in. If the investment_variable_type is set to binary, the number of discrete unit investments is limited to 1. However, if investment_variable_type is linear and the capacity_per_unit is set to unity, the investment decision variable can then be interpreted as the capacity of the unit rather than the number of units with investment_count_max_cumulative being the maximum capacity that can be invested in. Finally, we can invest in discrete blocks of capacity by setting capacity_per_unit to the size of the investment capacity blocks and have investment_variable_type set to integer with investment_count_max_cumulative representing the maximum number of capacity blocks that may be invested in. The key points here are:

Investment Costs

Investment costs are specified by setting the appropriate *_investment\_cost parameter. The investment costs for units are specified by setting the unit_investment_cost parameter. This is currently interpreted as the full cost over the investment period for the unit. See the section below on investment temporal structure for setting the investment period. If the investment period is 1 year, then the corresponding unit_investment_cost is the annualised investment cost. For connections and storages, the investment cost parameters are connection_investment_cost and storage_investment_cost, respectively.

Temporal and Stochastic Structure of Investment Decisions

SpineOpt's flexible stochastic and temporal structure extend to investments where individual investment decisions can have their own temporal and stochastic structure independent of other investment decisions and other model variables. A global temporal resolution for all investment decisions can be defined by specifying the relationship model__default_investment_temporal_block. If a specific temporal resolution is required for specific investment decisions, then one can specify the following relationships:

Specifying any of the above relationships will override the corresponding model__default_investment_temporal_block.

Similarly, a global stochastic structure can be defined for all investment decisions by specifying the relationship model__default_investment_stochastic_structure. If a specific stochastic structure is required for specific investment decisions, then one can specify the following relationships:

Specifying any of the above relationships will override the corresponding model__default_investment_stochastic_structure.

Impact of connection investments on network characteristics

The model parameter connection_investment_power_flow_impact_active is available to control whether the impact of connection investments on the network characteristics should be captured. If set to true, then the model will use line outage distribution factors (LODF) to compute the impact of each connection investment over the flow across the network. Note that this introduces another variable, connection_intact_flow, representing the hypothetical flow on a connection in case all connection investments were in place. Also note that the impact of each connection is captured individually.

Creating an Investment Candidate Unit Example

If we have model that is not currently set up for investments, and we wish to create an investment candidate unit, we can take the following steps.

  • Create the unit object with all the relationships and parameters necessary to describe its function.
  • Ensure that the existing_units parameter is set to zero so that the unit is unavailable unless invested in.
  • Set the investment_count_max_cumulative parameter for the unit to 1 to specify that a maximum of 1 new unit of this type may be invested in by the model.
  • Set the investment_variable_type to integer to specify that this is a discrete unit investment decision.
  • Specify the lifetime_technical of the unit to, say, 1 year to specify that this is the minimum amount of time this new unit must be in existence after being invested in.
  • Specify the investment period for this unit's investment decision in one of two ways:
  • Similarly to the above, define the stochastic structure for the unit's investment decision by specifying either model__default_investment_stochastic_structure or unit__investment_stochastic_structure
  • Specify your unit's investment cost by setting the unit_investment_cost parameter. Since we have defined the investment period above as 1 year, this is therefore the unit's annualised investment cost.

Model Reference

Variables for investments

Variable NameIndicesDescription
units_invested_availableunit, s, tThe number of invested in units that are available at a given (s, t)
units_investedunit, s, tThe point-in-time investment decision corresponding to the number of units invested in at (s,t)
units_mothballedunit, s, t"Instantaneous" decision variable to mothball a unit
connections_invested_availableconnection, s, tThe number of invested-in connections that are available at a given (s, t)
connections_investedconnection, s, tThe point-in-time investment decision corresponding to the number of connections invested in at (s,t)
connections_decommissionedconnection, s, t"Instantaneous" decision variable to decommission a connection
storages_invested_availablenode, s, tThe number of invested-in storages that are available at a given (s, t)
storages_investednode, s, tThe point-in-time investment decision corresponding to the number of storages invested in at (s,t)
storages_decommissionednode, s, t"instantaneous" decision variable to decommission a storage

Relationships for investments

Relationship NameRelated Object Class ListDescription
model__default_investment_temporal_blockmodel, temporal_blockDefault temporal resolution for investment decisions effective if unit__investment_temporal_block is not specified
model__default_investment_stochastic_structuremodel, stochastic_structureDefault stochastic structure for investment decisions effective if unit__investmentstochasticstructure is not specified
unit__investment_temporal_blockunit, temporal_blockSet temporal resolution of investment decisions - overrides model__default_investment_temporal_block
unit__investment_stochastic_structureunit, stochastic_structureSet stochastic structure for investment decisions - overrides model__default_investment_stochastic_structure

Parameters for investments

Parameter NameObject Class ListDescription
investment_count_max_cumulativeunitThe number of additional units of this type that can be invested in
unit_investment_costunitThe total overnight investment cost per candidate unit over the model horizon
lifetime_technicalunitThe investment lifetime of the unit - once invested-in, a unit must exist for at least this amount of time
investment_variable_typeunitWhether the units_invested_available variable is linear, integer or binary
investment_count_fix_newunitFix the value of units_invested
investment_count_fix_cumulativeunitFix the value of units_invested_available
investment_count_max_cumulativeconnectionThe number of additional connections of this type that can be invested in
connection_investment_costconnectionThe total overnight investment cost per candidate connection over the model horizon
lifetime_technicalconnectionThe investment lifetime of the connection - once invested-in, a connection must exist for at least this amount of time
investment_variable_typeconnectionWhether the connections_invested_available variable is linear, integer or binary
investment_count_fix_newconnectionFix the value of connections_invested
investment_count_fix_cumulativeconnectionFix the value of connection_invested_available
storage_investment_count_max_cumulativenodeThe number of additional storages of this type that can be invested in at node
storage_investment_costnodeThe total overnight investment cost per candidate storage over the model horizon
storage_lifetime_technicalnodeThe investment lifetime of the storage - once invested-in, a storage must exist for at least this amount of time
storage_investment_variable_typenodeWhether the storages_invested_available variable is linear, integer or binary
storage_investment_count_fix_newnodeFix the value of storages_invested
storage_investment_count_fix_cumulativenodeFix the value of storages_invested_available
FilenameRelative PathDescription
constraintunitsinvested_available.jl\constraintsconstrains units_invested_available to be less than investment_count_max_cumulative
constraintunitsinvested_transition.jl\constraintsdefines the relationship between units_invested_available, units_invested and units_mothballed. Analogous to units_on(@ref varunitson), units_started_up and units_shut_down
constraintunitlifetime.jl\constraintsonce a unit is invested-in, it must remain in existence for at least lifetime_technical - analogous to min_up_time.
constraintunitsavailable.jl\constraintsEnforces units_available is the sum of existing_units and units_invested_available
constraintconnectionsinvested_available.jl\constraintsconstrains connections_invested_available to be less than investment_count_max_cumulative
constraintconnectionsinvested_transition.jl\constraintsdefines the relationship between connections_invested_available, connections_invested and connections_decommissioned. Analogous to units_on(@ref varunitson), units_started_up and units_shut_down
constraintconnectionlifetime.jl\constraintsonce a connection is invested-in, it must remain in existence for at least lifetime_technical - analogous to min_up_time.
constraintstoragesinvested_available.jl\constraintsconstrains storages_invested_available to be less than storage_investment_count_max_cumulative
constraintstoragesinvested_transition.jl\constraintsdefines the relationship between storages_invested_available, storages_invested and storages_decommissioned. Analogous to units_on(@ref varunitson), units_started_up and units_shut_down
constraintstoragelifetime.jl\constraintsonce a storage is invested-in, it must remain in existence for at least storage_lifetime_technical - analogous to min_up_time.