Set targets as a proportion (between 0 and 1) of the maximum level of
representation of features in the study area. Please note that proportions
are scaled according to the features' total abundances in the study area
(including any locked out planning units, or planning units with NA
cost data) using the feature_abundances
function.
add_relative_targets(x, targets) # S4 method for ConservationProblem,numeric add_relative_targets(x, targets) # S4 method for ConservationProblem,matrix add_relative_targets(x, targets) # S4 method for ConservationProblem,character add_relative_targets(x, targets)
x 


targets  Object that specifies the targets for each feature. See the Details section for more information. 
ConservationProblemclass
object with the targets added
to it.
Targets are used to specify the minimum amount or proportion of a
feature's distribution that needs to be protected. Most conservation
planning problems require targets with the exception of the maximum cover
(see add_max_cover_objective
) and maximum utility
(see add_max_utility_objective
) problems. Attempting to solve
problems with objectives that require targets without specifying targets
will throw an error.
The targets for a problem can be specified in several different ways:
numeric
vector
of target values for each feature.
Additionally, for convenience, this type of argument can be a single
value to assign the same target to each feature. Note that this type of
argument cannot be used to specify targets for problems with multiple
zones.
matrix
containing a target for each feature in each zone.
Here, each row corresponds to a different feature in argument to
x
, each column corresponds to a different zone in argument to
x
, and each cell contains the target value for a given feature
that the solution needs to secure in a given zone.
character
containing the names of fields (columns) in the
feature data associated with the argument to x
that contain
targets. This type of argument can only be used when the
feature data associated with x
is a data.frame
.
This argument must contain a field (column) name for each zone.
For problems associated with multiple management zones, this function can
be used to set targets that each pertain to a single feature and a single
zone. To set targets which can be met through allocating different
planning units to multiple zones, see the add_manual_targets
function. An example of a target that could be met through allocations
to multiple zones might be where each management zone is expected to
result in a different amount of a feature and the target requires that
the total amount of the feature in all zones must exceed a certain
threshold. In other words, the target does not require that any single
zone secure a specific amount of the feature, but the total amount held
in all zones must secure a specific amount. Thus the target could,
potentially, be met through allocating all planning units to any specific
management zone, or through allocating the planning units to different
combinations of management zones.
# set seed for reproducibility set.seed(500) # load data data(sim_pu_raster, sim_features) # create base problem p < problem(sim_pu_raster, sim_features) %>% add_min_set_objective() %>% add_binary_decisions() # create problem with 10 % targets p1 < p %>% add_relative_targets(0.1) # create problem with varying targets for each feature targets < c(0.1, 0.2, 0.3, 0.4, 0.5) p2 < p %>% add_relative_targets(targets) # \donttest{ # solve problem s < stack(solve(p1), solve(p2))#> Gurobi Optimizer version 9.0.1 build v9.0.1rc0 (linux64) #> Optimize a model with 5 rows, 90 columns and 450 nonzeros #> Model fingerprint: 0x6442bf6e #> Variable types: 0 continuous, 90 integer (90 binary) #> Coefficient statistics: #> Matrix range [2e01, 9e01] #> Objective range [2e+02, 2e+02] #> Bounds range [1e+00, 1e+00] #> RHS range [3e+00, 8e+00] #> Found heuristic solution: objective 2337.9617505 #> Presolve time: 0.00s #> Presolved: 5 rows, 90 columns, 450 nonzeros #> Variable types: 0 continuous, 90 integer (90 binary) #> Presolved: 5 rows, 90 columns, 450 nonzeros #> #> #> Root relaxation: objective 1.931582e+03, 12 iterations, 0.00 seconds #> #> Nodes  Current Node  Objective Bounds  Work #> Expl Unexpl  Obj Depth IntInf  Incumbent BestBd Gap  It/Node Time #> #> 0 0 1931.58191 0 4 2337.96175 1931.58191 17.4%  0s #> H 0 0 1987.3985265 1931.58191 2.81%  0s #> #> Explored 1 nodes (12 simplex iterations) in 0.00 seconds #> Thread count was 1 (of 4 available processors) #> #> Solution count 2: 1987.4 2337.96 #> #> Optimal solution found (tolerance 1.00e01) #> Best objective 1.987398526526e+03, best bound 1.931581908865e+03, gap 2.8085% #> Gurobi Optimizer version 9.0.1 build v9.0.1rc0 (linux64) #> Optimize a model with 5 rows, 90 columns and 450 nonzeros #> Model fingerprint: 0x7b37a531 #> Variable types: 0 continuous, 90 integer (90 binary) #> Coefficient statistics: #> Matrix range [2e01, 9e01] #> Objective range [2e+02, 2e+02] #> Bounds range [1e+00, 1e+00] #> RHS range [6e+00, 3e+01] #> Found heuristic solution: objective 9439.1408525 #> 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 9.190939e+03, 1 iterations, 0.00 seconds #> #> Nodes  Current Node  Objective Bounds  Work #> Expl Unexpl  Obj Depth IntInf  Incumbent BestBd Gap  It/Node Time #> #> 0 0 9190.93869 0 1 9439.14085 9190.93869 2.63%  0s #> #> Explored 0 nodes (1 simplex iterations) in 0.00 seconds #> Thread count was 1 (of 4 available processors) #> #> Solution count 1: 9439.14 #> #> Optimal solution found (tolerance 1.00e01) #> Best objective 9.439140852480e+03, best bound 9.190938685954e+03, gap 2.6295%# } # create a problem with multiple management zones p3 < problem(sim_pu_zones_stack, sim_features_zones) %>% add_min_set_objective() %>% add_binary_decisions() # create a problem with targets that specify an equal amount of each feature # to be represented in each zone p4_targets < matrix(0.1, nrow = 5, ncol = 3, dimnames = list(feature_names(sim_features_zones), zone_names(sim_features_zones))) print(p4_targets)#> zone_1 zone_2 zone_3 #> feature_1 0.1 0.1 0.1 #> feature_2 0.1 0.1 0.1 #> feature_3 0.1 0.1 0.1 #> feature_4 0.1 0.1 0.1 #> feature_5 0.1 0.1 0.1p4 < p3 %>% add_relative_targets(p4_targets) # solve problem # \donttest{ # solve problem s4 < solve(p4)#> Gurobi Optimizer version 9.0.1 build v9.0.1rc0 (linux64) #> Optimize a model with 105 rows, 270 columns and 1620 nonzeros #> Model fingerprint: 0x60594edc #> Variable types: 0 continuous, 270 integer (270 binary) #> Coefficient statistics: #> Matrix range [2e01, 1e+00] #> Objective range [2e+02, 2e+02] #> Bounds range [1e+00, 1e+00] #> RHS range [1e+00, 8e+00] #> Found heuristic solution: objective 7019.1222763 #> Presolve time: 0.00s #> Presolved: 105 rows, 270 columns, 1620 nonzeros #> Variable types: 0 continuous, 270 integer (270 binary) #> Presolved: 105 rows, 270 columns, 1620 nonzeros #> #> #> Root relaxation: objective 5.935429e+03, 100 iterations, 0.00 seconds #> #> Nodes  Current Node  Objective Bounds  Work #> Expl Unexpl  Obj Depth IntInf  Incumbent BestBd Gap  It/Node Time #> #> 0 0 5935.42867 0 13 7019.12228 5935.42867 15.4%  0s #> H 0 0 6082.2792264 5935.42867 2.41%  0s #> #> Explored 1 nodes (100 simplex iterations) in 0.01 seconds #> Thread count was 1 (of 4 available processors) #> #> Solution count 2: 6082.28 7019.12 #> #> Optimal solution found (tolerance 1.00e01) #> Best objective 6.082279226435e+03, best bound 5.935428674960e+03, gap 2.4144%# plot solution (pixel values correspond to zone identifiers) plot(category_layer(s4), main = c("equal targets"))# } # create a problem with targets that require a varying amount of each # feature to be represented in each zone p5_targets < matrix(runif(15, 0.01, 0.2), nrow = 5, ncol = 3, dimnames = list(feature_names(sim_features_zones), zone_names(sim_features_zones))) print(p5_targets)#> zone_1 zone_2 zone_3 #> feature_1 0.16838399 0.04908221 0.06359158 #> feature_2 0.14775224 0.10731456 0.17964011 #> feature_3 0.19530969 0.18583855 0.15529418 #> feature_4 0.09884473 0.16747797 0.04122594 #> feature_5 0.16433284 0.14519964 0.14909414p5 < p3 %>% add_relative_targets(p4_targets) # solve problem # \donttest{ # solve problem s5 < solve(p5)#> Gurobi Optimizer version 9.0.1 build v9.0.1rc0 (linux64) #> Optimize a model with 105 rows, 270 columns and 1620 nonzeros #> Model fingerprint: 0x60594edc #> Variable types: 0 continuous, 270 integer (270 binary) #> Coefficient statistics: #> Matrix range [2e01, 1e+00] #> Objective range [2e+02, 2e+02] #> Bounds range [1e+00, 1e+00] #> RHS range [1e+00, 8e+00] #> Found heuristic solution: objective 7019.1222763 #> Presolve time: 0.00s #> Presolved: 105 rows, 270 columns, 1620 nonzeros #> Variable types: 0 continuous, 270 integer (270 binary) #> Presolved: 105 rows, 270 columns, 1620 nonzeros #> #> #> Root relaxation: objective 5.935429e+03, 100 iterations, 0.00 seconds #> #> Nodes  Current Node  Objective Bounds  Work #> Expl Unexpl  Obj Depth IntInf  Incumbent BestBd Gap  It/Node Time #> #> 0 0 5935.42867 0 13 7019.12228 5935.42867 15.4%  0s #> H 0 0 6082.2792264 5935.42867 2.41%  0s #> #> Explored 1 nodes (100 simplex iterations) in 0.01 seconds #> Thread count was 1 (of 4 available processors) #> #> Solution count 2: 6082.28 7019.12 #> #> Optimal solution found (tolerance 1.00e01) #> Best objective 6.082279226435e+03, best bound 5.935428674960e+03, gap 2.4144%# plot solution (pixel values correspond to zone identifiers) plot(category_layer(s5), main = c("varying targets"))# }