Add targets to a conservation planning problem by log-linearly interpolating the targets between thresholds based on the total amount of each feature in the study area (Rodrigues et al. 2004). Additionally, caps can be applied to targets to prevent features with massive distributions from being over-represented in solutions (Butchart et al. 2015). Note that the behavior of this function has changed substantially from versions prior to 5.0.0.

add_loglinear_targets(x, lower_bound_amount, lower_bound_target,
  upper_bound_amount, upper_bound_target, cap_amount = NULL,
  cap_target = NULL, abundances = feature_abundances(x, na.rm =
  FALSE)$absolute_abundance)

Arguments

x

ConservationProblem-class object.

lower_bound_amount

numeric threshold.

lower_bound_target

numeric relative target that should be applied to features with a total amount that is less than or equal to lower_bound_amount.

upper_bound_amount

numeric threshold.

upper_bound_target

numeric relative target that should be applied to features with a total amount that is greater than or equal to upper_bound_amount.

cap_amount

numeric total amount at which targets should be capped. Defaults to NULL so that targets are not capped.

cap_target

numeric amount-based target to apply to features which have a total amount greater than argument to cap_amount. Defaults to NULL so that targets are not capped.

abundances

numeric total amount of each feature to use when calculating the targets. Defaults to the feature abundances in the #' study area (calculated using the feature_abundances function.

Value

ConservationProblem-class object with the targets added to it.

Details

Targets are used to specify the minimum amount or proportion of a feature's distribution that needs to be protected. All conservation planning problems require adding targets with the exception of the maximum cover problem (see add_max_cover_objective), which maximizes all features in the solution and therefore does not require targets.

Seven parameters are used to calculate the targets: lower_bound_amount specifies the first range size threshold, lower_bound_target specifies the relative target required for species with a range size equal to or less than the first threshold, upper_bound_amount specifies the second range size threshold, upper_bound_target specifies the relative target required for species with a range size equal to or greater than the second threshold, cap_amount specifies the third range size threshold, cap_target specifies the absolute target that is uniformly applied to species with a range size larger than that third threshold, and finally abundances specifies the range size for each feature that should be used when calculating the targets.

Note that the target calculations do not account for the size of each planning unit. Therefore, the feature data should account for the size of each planning unit if this is important (e.g. pixel values in the argument to features in the function problem could correspond to amount of land occupied by the feature in \(km^2\) units).

This function can only be applied to ConservationProblem-class objects that are associated with a single zone.

References

Rodrigues ASL, Akcakaya HR, Andelman SJ, Bakarr MI, Boitani L, Brooks TM, Chanson JS, Fishpool LDC, da Fonseca GAB, Gaston KJ, and others (2004) Global gap analysis: priority regions for expanding the global protected-area network. BioScience, 54: 1092--1100.

Butchart SHM, Clarke M, Smith RJ, Sykes RE, Scharlemann JPW, Harfoot M, Buchanan, GM, Angulo A, Balmford A, Bertzky B, and others (2015) Shortfalls and solutions for meeting national and global conservation area targets. Conservation Letters, 8: 329--337.

See also

Examples

# load data data(sim_pu_raster, sim_features) # create problem using loglinear targets p <- problem(sim_pu_raster, sim_features) %>% add_min_set_objective() %>% add_loglinear_targets(10, 0.9, 100, 0.2) %>% add_binary_decisions()
# solve problem s <- solve(p)
#> Optimize a model with 5 rows, 90 columns and 450 nonzeros #> Variable types: 0 continuous, 90 integer (90 binary) #> Coefficient statistics: #> Matrix range [2e-01, 9e-01] #> Objective range [2e+02, 2e+02] #> Bounds range [1e+00, 1e+00] #> RHS range [2e+01, 2e+01] #> Found heuristic solution: objective 11939.016941 #> Presolve removed 4 rows and 0 columns #> Presolve time: 0.00s #> Presolved: 1 rows, 90 columns, 90 nonzeros #> Variable types: 0 continuous, 90 integer (90 binary) #> Presolved: 1 rows, 90 columns, 90 nonzeros #> #> #> Root relaxation: objective 1.047148e+04, 1 iterations, 0.00 seconds #> #> Nodes | Current Node | Objective Bounds | Work #> Expl Unexpl | Obj Depth IntInf | Incumbent BestBd Gap | It/Node Time #> #> 0 0 10471.4792 0 1 11939.0169 10471.4792 12.3% - 0s #> H 0 0 10532.505579 10471.4792 0.58% - 0s #> #> Explored 1 nodes (1 simplex iterations) in 0.00 seconds #> Thread count was 1 (of 4 available processors) #> #> Solution count 2: 10532.5 11939 #> #> Optimal solution found (tolerance 1.00e-01) #> Best objective 1.053250557899e+04, best bound 1.047147921397e+04, gap 0.5794%
# plot solution plot(s, main = "solution", axes = FALSE, box = FALSE)