Conservation planning problems involve making decisions on how different planning units will be managed. These decisions might involve turning an entire planning unit into a protected area, turning part of a planning unit into a protected area, or allocating a planning unit to a specific management zone. If no decision is explicitly added to a problem, then binary decisions will be used by default.

Details

Only a single type of decision can be added to a conservation planning problem.If multiple decisions are added to problem, then the last one to be added will be used.

The following decisions can be added to a conservation planning problem:

add_binary_decisions

Add a binary decision to a conservation planning problem. This is the classic decision of either prioritizing or not prioritizing a planning unit. Typically, this decision has the assumed action of buying the planning unit to include in a protected area network. If no decision is added to a problem object then this decision class will be used by default.

add_proportion_decisions

Add a proportion decision to a conservation planning problem. This is a relaxed decision where a part of a planning unit can be prioritized, as opposed to the default of the entire planning unit. Typically, this decision has the assumed action of buying a fraction of a planning unit to include in a protected area network.

add_semicontinuous_decisions

Add a semi-continuous decision to a conservation planning problem. This decision is similar to add_proportion_decision except that it has an upper bound parameter. By default, the decision can range from prioritizing none (0 %) to all (100 %) of a planning unit. However, a upper bound can be specified to ensure that at most only a fraction (e.g. 80 %) of a planning unit can be preserved. This type of decision may be useful when it is not practical to conserve the entire area encompassed by any single planning unit.

See also

Examples

# load data data(sim_pu_raster, sim_features) # create basic problem and using the default decision types (binary) p1 <- problem(sim_pu_raster, sim_features) %>% add_min_set_objective() %>% add_relative_targets(0.1) # create problem with manually specified binary decisions p2 <- p1 %>% add_binary_decisions() # create problem with proportion decisions p3 <- p1 %>% add_proportion_decisions() # create problem with semicontinuous decisions p4 <- p1 %>% add_semicontinuous_decisions(upper_limit = 0.5)
# solve problem s <- stack(solve(p1), solve(p2), solve(p3), solve(p4))
#> 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 [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 1985.6818841 1931.58191 2.72% - 0s #> #> Explored 1 nodes (12 simplex iterations) in 0.00 seconds #> Thread count was 1 (of 4 available processors) #> #> Solution count 2: 1985.68 2337.96 #> #> Optimal solution found (tolerance 1.00e-01) #> Best objective 1.985681884076e+03, best bound 1.931581908865e+03, gap 2.7245% #> 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 [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 1985.6818841 1931.58191 2.72% - 0s #> #> Explored 1 nodes (12 simplex iterations) in 0.00 seconds #> Thread count was 1 (of 4 available processors) #> #> Solution count 2: 1985.68 2337.96 #> #> Optimal solution found (tolerance 1.00e-01) #> Best objective 1.985681884076e+03, best bound 1.931581908865e+03, gap 2.7245% #> Optimize a model with 5 rows, 90 columns and 450 nonzeros #> Coefficient statistics: #> Matrix range [2e-01, 9e-01] #> Objective range [2e+02, 2e+02] #> Bounds range [1e+00, 1e+00] #> RHS range [3e+00, 8e+00] #> Presolve time: 0.00s #> Presolved: 5 rows, 90 columns, 450 nonzeros #> #> Iteration Objective Primal Inf. Dual Inf. Time #> 0 0.0000000e+00 3.170407e+01 0.000000e+00 0s #> 12 1.9315819e+03 0.000000e+00 0.000000e+00 0s #> #> Solved in 12 iterations and 0.00 seconds #> Optimal objective 1.931581909e+03 #> Optimize a model with 5 rows, 90 columns and 450 nonzeros #> Coefficient statistics: #> Matrix range [2e-01, 9e-01] #> Objective range [2e+02, 2e+02] #> Bounds range [5e-01, 5e-01] #> RHS range [3e+00, 8e+00] #> Presolve time: 0.00s #> Presolved: 5 rows, 90 columns, 450 nonzeros #> #> Iteration Objective Primal Inf. Dual Inf. Time #> 0 0.0000000e+00 3.170407e+01 0.000000e+00 0s #> 12 1.9495280e+03 0.000000e+00 0.000000e+00 0s #> #> Solved in 12 iterations and 0.00 seconds #> Optimal objective 1.949528006e+03
# plot solutions plot(s, main = c("default (binary)", "binary", "proportion", "semicontinuous (upper = 0.5)"))