Learn R Programming

prioritizr (version 4.1.5)

solve: Solve

Description

Solve a conservation planning problem.

Arguments

b

Solver-class object. Not used if a is an ConservationProblem-class object.

...

arguments passed to compile.

run_checks

logical flag indicating whether presolve checks should be run prior solving the problem. These checks are performed using the presolve_check function. Defaults to TRUE. Skipping these checks may reduce run time for large problems.

force

logical flag indicating if an attempt to should be made to solve the problem even if potential issues were detected during the presolve checks. Defaults to FALSE.

Value

A numeric, matrix, RasterLayer-class, or Spatial-class object containing the solution to the problem. Additionally, the returned object will have the following additional attributes: "objective" containing the solution's objective, "runtime" denoting the number of seconds that elapsed while solving the problem, and "status" describing the status of the solution (e.g. "OPTIMAL" indicates that the optimal solution was found).

Details

The object returned from this function depends on the argument to a. If the argument to a is an OptimizationProblem-class object, then the solution is returned as a logical vector showing the status of each planning unit in each zone. On the other hand, if the argument to a is an ConservationProblem-class object, then the type of object returned depends on the number of solutions generated and the type data used to represent planning unit costs in the argument to a.

numeric

vector containing the solution. Here, Each element corresponds to a different planning unit. If multiple solutions are generated, then the solution is returned as a list of numeric vectors.

matrix

containing numeric values for the solution. Here, rows correspond to different planning units, and fields (columns) correspond to different management zones. If multiple solutions are generated, then the solution is returned as a list of matrix objects.

Raster-class

object containing the solution in pixel values. If the argument to x contains a single management zone, then a RasterLayer object will be returned. Otherwise, if the argument to x contains multiple zones, then a RasterStack-class object will be returned containing a different layer for each management zone. If multiple solutions are generated, then the solution is returned as a list of Raster objects.

Spatial-class or data.frame

containing the solution in fields (columns). Here, each row corresponds to a different planning unit. If the argument to x contains a single zone, the fields containing solutions are named "solution_XXX" where "XXX" corresponds to the solution number. If the argument to x contains multiple zones, the fields containing solutions are named "solution_XXX_YYY" where "XXX" corresponds to the solution and "YYY" is the name of the management zone.

Since this function returns an object that specifies how much of each planning unit is allocated to each management zone, it may be useful to use the category_layer function to reformat the output for problems containing multiple zones.

See Also

feature_representation, problem, solvers, category_layer, presolve_check.

Examples

Run this code
# NOT RUN {
# set seed for reproducibility
set.seed(500)

# load data
data(sim_pu_raster, sim_pu_polygons, sim_features, sim_pu_zones_stack,
     sim_pu_zones_polygons, sim_features_zones)

# build minimal conservation problem with raster data
p1 <- problem(sim_pu_raster, sim_features) %>%
      add_min_set_objective() %>%
      add_relative_targets(0.1) %>%
      add_binary_decisions()
# }
# NOT RUN {
# solve the problem
s1 <- solve(p1)

# print solution
print(s1)

# print attributes describing the optimization process and the solution
print(attr(s1, "objective"))
print(attr(s1, "runtime"))
print(attr(s1, "status"))

# calculate feature representation in the solution
r1 <- feature_representation(p1, s1)
print(r1)

# plot solution
plot(s1, main = "solution", axes = FALSE, box = FALSE)
# }
# NOT RUN {
# build minimal conservation problem with spatial polygon data
p2 <- problem(sim_pu_polygons, sim_features, cost_column = "cost") %>%
      add_min_set_objective() %>%
      add_relative_targets(0.1) %>%
      add_binary_decisions()
# }
# NOT RUN {
# solve the problem
s2 <- solve(p2)

# print first six rows of the attribute table
print(head(s2))

# calculate feature representation in the solution
r2 <- feature_representation(p2, s2[, "solution_1"])
print(r2)

# plot solution
spplot(s2, zcol = "solution_1", main = "solution", axes = FALSE, box = FALSE)
# }
# NOT RUN {
# build multi-zone conservation problem with raster data
p3 <- problem(sim_pu_zones_stack, sim_features_zones) %>%
      add_min_set_objective() %>%
      add_relative_targets(matrix(runif(15, 0.1, 0.2), nrow = 5,
                                  ncol = 3)) %>%
      add_binary_decisions()
# }
# NOT RUN {
# solve the problem
s3 <- solve(p3)

# print solution
print(s3)

# calculate feature representation in the solution
r3 <- feature_representation(p3, s3)
print(r3)

# plot solution
plot(category_layer(s3), main = "solution", axes = FALSE, box = FALSE)
# }
# NOT RUN {
# build multi-zone conservation problem with spatial polygon data
p4 <- problem(sim_pu_zones_polygons, sim_features_zones,
              cost_column = c("cost_1", "cost_2", "cost_3")) %>%
      add_min_set_objective() %>%
      add_relative_targets(matrix(runif(15, 0.1, 0.2), nrow = 5,
                                  ncol = 3)) %>%
      add_binary_decisions()
# }
# NOT RUN {
# solve the problem
s4 <- solve(p4)

# print first six rows of the attribute table
print(head(s4))

# calculate feature representation in the solution
r4 <- feature_representation(p4, s4[, c("solution_1_zone_1",
                                        "solution_1_zone_2",
                                        "solution_1_zone_3")])
print(r4)

# create new column representing the zone id that each planning unit
# was allocated to in the solution
s4$solution <- category_vector(s4@data[, c("solution_1_zone_1",
                                           "solution_1_zone_2",
                                           "solution_1_zone_3")])
s4$solution <- factor(s4$solution)

# plot solution
spplot(s4, zcol = "solution", main = "solution", axes = FALSE, box = FALSE)
# }

Run the code above in your browser using DataLab