Provides the connectivity penalty value for all actions and planning units in a solution.

getConnectivityPenalty(x)

Arguments

x

solution or portfolio object.

Details

The connectivity penalty among is calculated as the sum of all connectivity penalties by each action and planning unit in the solution. This can be expressed mathematically for a set of planning units $$I$$ indexed by $$i$$ and $$j$$, and a set of threats $$K$$ indexed by $$k$$ as:

$$\sum_{k \in K}\sum_{i \in I_k}\sum_{j \in I_k} x_{ik} (1 - x_{jk})cv_{ij}$$

Where, $$x_{ik}$$ is the decisions variable that specify whether an action has been selected to abate threat $$k$$ in planning unit $$i$$ (1) or not (0), $$cv_{ij}$$ is the connectivity penalty that applies when a solution contains planning unit $$i$$ but not $$j$$ o viceversa.

Note that there is an action per threat, so it is assumed that the index of the threat coincides with the index of the action used to abate it.

Examples

# \donttest{
# set seed for reproducibility
set.seed(14)

data(sim_pu_data, sim_features_data, sim_dist_features_data,
sim_threats_data, sim_dist_threats_data, sim_sensitivity_data,
sim_boundary_data)

## Create data instance
problem_data <- inputData(
pu = sim_pu_data, features = sim_features_data, dist_features = sim_dist_features_data,
threats = sim_threats_data, dist_threats = sim_dist_threats_data,
sensitivity = sim_sensitivity_data, boundary = sim_boundary_data
)

## Create optimization model
problem_model <- problem(x = problem_data, blm = 0.03)
#> Warning: Some blm_actions argument were set to 0, so the boundary data has no effect for these cases

## Solve the optimization model
s <- solve(a = problem_model, time_limit = 2, output_file = FALSE, cores = 2)
#> Gurobi Optimizer version 10.0.0 build v10.0.0rc2 (linux64)
#>
#> CPU model: 12th Gen Intel(R) Core(TM) i5-1240P, instruction set [SSE2|AVX|AVX2]
#> Thread count: 16 physical cores, 16 logical processors, using up to 2 threads
#>
#> Optimize a model with 29984 rows, 10296 columns and 70085 nonzeros
#> Model fingerprint: 0x197c5e8d
#> Variable types: 176 continuous, 10120 integer (10120 binary)
#> Coefficient statistics:
#>   Matrix range     [5e-01, 2e+00]
#>   Objective range  [3e-02, 3e+01]
#>   Bounds range     [1e+00, 1e+00]
#>   RHS range        [1e+00, 5e+01]
#> Found heuristic solution: objective 964.0000000
#> Presolve removed 19990 rows and 5131 columns
#> Presolve time: 0.14s
#> Presolved: 9994 rows, 5165 columns, 20209 nonzeros
#> Variable types: 0 continuous, 5165 integer (5160 binary)
#> Found heuristic solution: objective 868.0000000
#>
#> Root relaxation: objective 8.477969e+02, 6685 iterations, 0.42 seconds (0.96 work units)
#>
#>     Nodes    |    Current Node    |     Objective Bounds      |     Work
#>  Expl Unexpl |  Obj  Depth IntInf | Incumbent    BestBd   Gap | It/Node Time
#>
#>      0     0  847.79688    0 5133  868.00000  847.79688  2.33%     -    0s
#> H    0     0                     867.0000000  847.79688  2.21%     -    0s
#>      0     0  852.59894    0 5154  867.00000  852.59894  1.66%     -    0s
#> H    0     0                     865.0000000  852.59894  1.43%     -    0s
#>      0     0  852.71808    0 5153  865.00000  852.71808  1.42%     -    1s
#>      0     0  852.71808    0 5153  865.00000  852.71808  1.42%     -    1s
#> H    0     0                     863.0000000  852.71808  1.19%     -    1s
#>
#> Cutting planes:
#>   Gomory: 2
#>   Cover: 24
#>   Zero half: 1
#>
#> Explored 1 nodes (7888 simplex iterations) in 2.00 seconds (4.53 work units)
#> Thread count was 2 (of 16 available processors)
#>
#> Solution count 5: 863 865 867 ... 964
#>
#> Time limit reached
#> Best objective 8.630000000000e+02, best bound 8.527180805001e+02, gap 1.1914%

# get connectivity penalty values
getConnectivityPenalty(s)
#>   solution_name units threat_1 threat_2
#> 1           sol     0 2861.172 1319.892
# }