Add maximum coverage objective
Set the objective of a conservation planning problem()
to
represent at least one instance of as many features as possible within a
given budget. This type of objective does not use targets, and feature
weights should be used instead to increase the representation of different
features in solutions.
add_max_cover_objective(x, budget)
x |
|
budget |
|
A problem objective is used to specify the overall goal of the conservation planning problem. Please note that all conservation planning problems formulated in the prioritizr package require the addition of objectives—failing to do so will return an error message when attempting to solve problem.
The maximum coverage objective seeks to find the set of planning units that
maximizes the number of represented features, while keeping cost within a
fixed budget. Here, features are treated as being represented if
the reserve system contains at least a single instance of a feature
(i.e. an amount greater than 1). This formulation has often been
used in conservation planning problems dealing with binary biodiversity
data that indicate the presence/absence of suitable habitat
(e.g. Church & Velle 1974). Additionally, weights can be used to favor the
representation of certain features over other features (see
add_feature_weights()
). Check out the
add_max_features_objective()
for a more
generalized formulation which can accommodate user-specified representation
targets.
This formulation is based on the historical maximum coverage reserve selection formulation (Church & Velle 1974; Church et al. 1996). The maximum coverage objective for the reserve design problem can be expressed mathematically for a set of planning units (I indexed by i) and a set of features (J indexed by j) as:
Maximize sum_i^I (-s * ci * xi) + sum_j^J (yj * wj) subject to sum_i^I (xi * rij) >= (yj * 1) for all j in J & sum_i^I (xi * ci) <= B
Here, xi is the decisions variable (e.g.
specifying whether planning unit i has been selected (1) or not
(0)), rij is the amount of feature j in planning
unit i, yj indicates if the solution has meet
the target tj for feature j, and wj is the
weight for feature j (defaults to 1 for all features; see
add_feature_weights()
to specify weights). Additionally,
B is the budget allocated for the solution, ci is the
cost of planning unit i, and s is a scaling factor used
to shrink the costs so that the problem will return a cheapest solution
when there are multiple solutions that represent the same amount of all
features within the budget.
Object (i.e. ConservationProblem
) with the objective
added to it.
In early versions (< 3.0.0.0), the mathematical formulation
underpinning this function was very different. Specifically,
as described above, the function now follows the formulations outlined in
Church et al. (1996). The old formulation is now provided by the
add_max_utility_objective()
function.
Church RL and Velle CR (1974) The maximum covering location problem. Regional Science, 32: 101–118.
Church RL, Stoms DM, and Davis FW (1996) Reserve selection as a maximum covering location problem. Biological Conservation, 76: 105–112.
# load data data(sim_pu_raster, sim_pu_zones_stack, sim_features, sim_features_zones) # threshold the feature data to generate binary biodiversity data sim_binary_features <- sim_features thresholds <- raster::quantile(sim_features, probs = 0.95, names = FALSE, na.rm = TRUE) for (i in seq_len(raster::nlayers(sim_features))) sim_binary_features[[i]] <- as.numeric(raster::values(sim_features[[i]]) > thresholds[[i]]) # create problem with maximum utility objective p1 <- problem(sim_pu_raster, sim_binary_features) %>% add_max_cover_objective(500) %>% add_binary_decisions() %>% add_default_solver(verbose = FALSE) ## Not run: # solve problem s1 <- solve(p1) # plot solution plot(s1, main = "solution", axes = FALSE, box = FALSE) ## End(Not run) # threshold the multi-zone feature data to generate binary biodiversity data sim_binary_features_zones <- sim_features_zones for (z in number_of_zones(sim_features_zones)) { thresholds <- raster::quantile(sim_features_zones[[z]], probs = 0.95, names = FALSE, na.rm = TRUE) for (i in seq_len(number_of_features(sim_features_zones))) { sim_binary_features_zones[[z]][[i]] <- as.numeric( raster::values(sim_features_zones[[z]][[i]]) > thresholds[[i]]) } } # create multi-zone problem with maximum utility objective that # has a single budget for all zones p2 <- problem(sim_pu_zones_stack, sim_binary_features_zones) %>% add_max_cover_objective(800) %>% add_binary_decisions() %>% add_default_solver(verbose = FALSE) ## Not run: # solve problem s2 <- solve(p2) # plot solution plot(category_layer(s2), main = "solution", axes = FALSE, box = FALSE) ## End(Not run) # create multi-zone problem with maximum utility objective that # has separate budgets for each zone p3 <- problem(sim_pu_zones_stack, sim_binary_features_zones) %>% add_max_cover_objective(c(400, 400, 400)) %>% add_binary_decisions() %>% add_default_solver(verbose = FALSE) ## Not run: # solve problem s3 <- solve(p3) # plot solution plot(category_layer(s3), main = "solution", axes = FALSE, box = FALSE) ## End(Not run)
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.