-
Notifications
You must be signed in to change notification settings - Fork 25
/
add_boundary_penalties.html
509 lines (429 loc) · 36.5 KB
/
add_boundary_penalties.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
<!-- Generated by pkgdown: do not edit by hand -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Add boundary penalties — add_boundary_penalties • prioritizr</title>
<!-- favicons -->
<link rel="icon" type="image/png" sizes="16x16" href="../favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="../favicon-32x32.png">
<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="../apple-touch-icon.png" />
<link rel="apple-touch-icon" type="image/png" sizes="120x120" href="../apple-touch-icon-120x120.png" />
<link rel="apple-touch-icon" type="image/png" sizes="76x76" href="../apple-touch-icon-76x76.png" />
<link rel="apple-touch-icon" type="image/png" sizes="60x60" href="../apple-touch-icon-60x60.png" />
<!-- jquery -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
<!-- Bootstrap -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.4.0/flatly/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha256-nuL8/2cJ5NDSSwnKD8VqreErSWHtnEP9E7AySL+1ev4=" crossorigin="anonymous"></script>
<!-- bootstrap-toc -->
<link rel="stylesheet" href="../bootstrap-toc.css">
<script src="../bootstrap-toc.js"></script>
<!-- Font Awesome icons -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/all.min.css" integrity="sha256-mmgLkCYLUQbXn0B1SRqzHar6dCnv9oZFPEC1g1cwlkk=" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.12.1/css/v4-shims.min.css" integrity="sha256-wZjR52fzng1pJHwx4aV2AO3yyTOXrcDW7jBpJtTwVxw=" crossorigin="anonymous" />
<!-- clipboard.js -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js" integrity="sha256-inc5kl9MA1hkeYUt+EC3BhlIgyp/2jDIyBLS6k3UxPI=" crossorigin="anonymous"></script>
<!-- headroom.js -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/headroom.min.js" integrity="sha256-AsUX4SJE1+yuDu5+mAVzJbuYNPHj/WroHuZ8Ir/CkE0=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/headroom/0.11.0/jQuery.headroom.min.js" integrity="sha256-ZX/yNShbjqsohH1k95liqY9Gd8uOiE1S4vZc+9KQ1K4=" crossorigin="anonymous"></script>
<!-- pkgdown -->
<link href="../pkgdown.css" rel="stylesheet">
<script src="../pkgdown.js"></script>
<!-- docsearch -->
<script src="../docsearch.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/docsearch.js/2.6.3/docsearch.min.css" integrity="sha256-QOSRU/ra9ActyXkIBbiIB144aDBdtvXBcNc3OTNuX/Q=" crossorigin="anonymous" />
<link href="../docsearch.css" rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/mark.js/8.11.1/jquery.mark.min.js" integrity="sha256-4HLtjeVgH0eIB3aZ9mLYF6E8oU5chNdjU6p6rrXpl9U=" crossorigin="anonymous"></script>
<link href="../extra.css" rel="stylesheet">
<meta property="og:title" content="Add boundary penalties — add_boundary_penalties" />
<meta property="og:description" content="Add penalties to a conservation planning problem() to favor solutions
that spatially clump planning units together based on the overall
boundary length (perimeter)." />
<meta property="og:image" content="https://prioritizr.net/logo.png" />
<!-- mathjax -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js" integrity="sha256-nvJJv9wWKEm88qvoQl9ekL2J+k/RWIsaSScxxlsrv8k=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/config/TeX-AMS-MML_HTMLorMML.js" integrity="sha256-84DKXVJXs0/F8OTMzX4UR909+jtl4G7SPypPavF+GfA=" crossorigin="anonymous"></script>
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-70466840-4"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-70466840-4');
</script>
</head>
<body data-spy="scroll" data-target="#toc">
<div class="container template-reference-topic">
<header>
<div class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<span class="navbar-brand">
<a class="navbar-link" href="../index.html">prioritizr</a>
<span class="version label label-default" data-toggle="tooltip" data-placement="bottom" title="Released version">7.1.0.2</span>
</span>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>
<a href="../articles/prioritizr.html">Get started</a>
</li>
<li>
<a href="../reference/index.html">Reference</a>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
Articles
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li>
<a href="../articles/gurobi_installation.html">Gurobi Installation Guide</a>
</li>
<li>
<a href="../articles/publication_record.html">Publication Record</a>
</li>
<li>
<a href="../articles/saltspring.html">Salt Spring Island Tutorial</a>
</li>
<li>
<a href="../articles/solver_benchmark.html">Solver Benchmarks</a>
</li>
<li>
<a href="../articles/tasmania.html">Tasmania Tutorial</a>
</li>
<li>
<a href="../articles/zones.html">Management Zones</a>
</li>
</ul>
</li>
<li>
<a href="../news/index.html">Changelog</a>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li>
<a href="https://github.com/prioritizr/prioritizr/">
<span class="fab fa-github fa-lg"></span>
</a>
</li>
</ul>
<form class="navbar-form navbar-right hidden-xs hidden-sm" role="search">
<div class="form-group">
<input type="search" class="form-control" name="search-input" id="search-input" placeholder="Search..." aria-label="Search for..." autocomplete="off">
</div>
</form>
</div><!--/.nav-collapse -->
</div><!--/.container -->
</div><!--/.navbar -->
</header>
<div class="row">
<div class="col-md-9 contents">
<div class="page-header">
<h1>Add boundary penalties</h1>
<small class="dont-index">Source: <a href='https://github.com/prioritizr/prioritizr/blob/master/R/add_boundary_penalties.R'><code>R/add_boundary_penalties.R</code></a></small>
<div class="hidden name"><code>add_boundary_penalties.Rd</code></div>
</div>
<div class="ref-description">
<p>Add penalties to a conservation planning <code><a href='problem.html'>problem()</a></code> to favor solutions
that spatially clump planning units together based on the overall
boundary length (perimeter).</p>
</div>
<div class="ref-usage sourceCode"><pre class='sourceCode r'><code><span class='fu'>add_boundary_penalties</span><span class='op'>(</span>
<span class='va'>x</span>,
<span class='va'>penalty</span>,
edge_factor <span class='op'>=</span> <span class='fu'><a href='https://rdrr.io/r/base/rep.html'>rep</a></span><span class='op'>(</span><span class='fl'>0.5</span>, <span class='fu'><a href='number_of_zones.html'>number_of_zones</a></span><span class='op'>(</span><span class='va'>x</span><span class='op'>)</span><span class='op'>)</span>,
zones <span class='op'>=</span> <span class='fu'><a href='https://rdrr.io/r/base/diag.html'>diag</a></span><span class='op'>(</span><span class='fu'><a href='number_of_zones.html'>number_of_zones</a></span><span class='op'>(</span><span class='va'>x</span><span class='op'>)</span><span class='op'>)</span>,
data <span class='op'>=</span> <span class='cn'>NULL</span>
<span class='op'>)</span></code></pre></div>
<h2 class="hasAnchor" id="arguments"><a class="anchor" href="#arguments"></a>Arguments</h2>
<table class="ref-arguments">
<colgroup><col class="name" /><col class="desc" /></colgroup>
<tr>
<th>x</th>
<td><p><code><a href='problem.html'>problem()</a></code> (i.e. <code><a href='ConservationProblem-class.html'>ConservationProblem</a></code>) object.</p></td>
</tr>
<tr>
<th>penalty</th>
<td><p><code>numeric</code> penalty that is used to scale the importance
of selecting planning units that are spatially clumped together compared
to the main problem objective (e.g. solution cost when the argument to
<code>x</code> has a minimum set objective per <code><a href='add_min_set_objective.html'>add_min_set_objective()</a></code>).
Higher <code>penalty</code> values prefer solutions with a higher degree of spatial
clumping, and smaller <code>penalty</code> values prefer solutions with a smaller
degree of clumping. Note that negative <code>penalty</code> values prefer
solutions that are more spread out. This parameter is equivalent to
the boundary length modifier (BLM)
parameter in <a href='https://marxansolutions.org/'><em>Marxan</em></a>.</p></td>
</tr>
<tr>
<th>edge_factor</th>
<td><p><code>numeric</code> proportion to scale
planning unit edges (borders) that do not have any neighboring planning
units. For example, an edge factor of <code>0.5</code> is commonly used to
avoid overly penalizing planning units along a coastline.
Note that this argument must have an element for each zone in the argument
to <code>x</code>.</p></td>
</tr>
<tr>
<th>zones</th>
<td><p><code>matrix</code> or <code>Matrix</code> object describing the
clumping scheme for different zones. Each row and column corresponds to a
different zone in the argument to <code>x</code>, and cell values indicate the
relative importance of clumping planning units that are allocated to
a combination of zones. Cell values along the diagonal of the matrix
represent the relative importance of clumping planning units that are
allocated to the same zone. Cell values must range between 1 and -1, where
negative values favor solutions that spread out planning units. The default
argument to <code>zones</code> is an identity
matrix (i.e. a matrix with ones along the matrix diagonal and zeros
elsewhere), so that penalties are incurred when neighboring planning units
are not assigned to the same zone. If the cells along
the matrix diagonal contain markedly smaller values than those found
elsewhere in the matrix, then solutions are preferred that surround
planning units with those allocated to different zones
(i.e. greater spatial fragmentation).</p></td>
</tr>
<tr>
<th>data</th>
<td><p><code>NULL</code>, <code>data.frame</code>, <code>matrix</code>, or <code>Matrix</code>
object containing the boundary data. These data describe the total
amount of boundary (perimeter) length for each planning unit,
and the amount of boundary (perimeter) length shared between different
planning units (i.e. planning units that are adjacent to each other).
See the Data format section for more information.</p></td>
</tr>
</table>
<h2 class="hasAnchor" id="value"><a class="anchor" href="#value"></a>Value</h2>
<p>Object (i.e. <code><a href='ConservationProblem-class.html'>ConservationProblem</a></code>) with the penalties
added to it.</p>
<h2 class="hasAnchor" id="details"><a class="anchor" href="#details"></a>Details</h2>
<p>This function adds penalties to a conservation planning problem
to penalize fragmented solutions. It was is inspired by Ball <em>et al.</em>
(2009) and Beyer <em>et al.</em> (2016). The <code>penalty</code> argument is
equivalent to the boundary length modifier (<code>BLM</code>) used in
<a href='https://marxansolutions.org'><em>Marxan</em></a>.
Note that this function can only
be used to represent symmetric relationships between planning units. If
asymmetric relationships are required, use the
<code><a href='add_connectivity_penalties.html'>add_connectivity_penalties()</a></code> function.</p>
<h2 class="hasAnchor" id="data-format"><a class="anchor" href="#data-format"></a>Data format</h2>
<p>The argument to <code>data</code> can be specified using the following formats.
Note that boundary data must always describe symmetric relationships
between planning units.</p>
<dl>
<dt><code>data</code> as a <code>NULL</code> value</dt><dd><p>indicating that the data should be
automatically calculated using the <code><a href='boundary_matrix.html'>boundary_matrix()</a></code> function.
This argument is the default.
Note that the boundary data must be supplied
using one of the other formats below if the planning unit data
in the argument to <code>x</code> do not explicitly contain spatial information
(e.g. planning unit data are a <code>data.frame</code> or <code>numeric</code> class).</p></dd>
<dt><code>data</code> as a <code>matrix</code>/<code>Matrix</code> object</dt><dd><p>where rows and columns represent
different planning units and the value of each cell represents the
amount of shared boundary length between two different planning units.
Cells that occur along the matrix diagonal represent the amount of
exposed boundary associated with each planning unit that has
no neighbor (e.g. these value might pertain to boundaries along a
coastline).</p></dd>
<dt><code>data</code> as a <code>data.frame</code> object</dt><dd><p>with the columns <code>"id1"</code>,
<code>"id2"</code>, and <code>"boundary"</code>. The <code>"id1"</code> and <code>"id2"</code> columns contain
identifiers (indices) for a pair of planning units, and the <code>"boundary"</code>
column contains the amount of shared boundary length between these
two planning units.
This format follows the the standard <em>Marxan</em> format for boundary
data (i.e. per the "bound.dat" file).</p></dd>
</dl>
<h2 class="hasAnchor" id="mathematical-formulation"><a class="anchor" href="#mathematical-formulation"></a>Mathematical formulation</h2>
<p>The boundary penalties are implemented using the following equations. Let
\(I\) represent the set of planning units
(indexed by \(i\) or \(j\)), \(Z\) represent
the set of management zones (indexed by \(z\) or \(y\)), and
\(X_{iz}\) represent the decision
variable for planning unit \(i\) for in zone \(z\) (e.g. with binary
values one indicating if planning unit is allocated or not). Also, let
\(p\) represent the argument to <code>penalty</code>, \(E_z\) represent the
argument to <code>edge_factor</code>, \(B_{ij}\) represent the matrix argument
to <code>data</code> (e.g. generated using <code><a href='boundary_matrix.html'>boundary_matrix()</a></code>), and
\(W_{zz}\) represent the matrix argument to <code>zones</code>.</p>
<p>$$
\sum_{i}^{I} \sum_{j}^{I} \sum_{z}^{Z} (\mathit{ifelse}(i == j, E_z, 1)
\times p \times W_{zz} B_{ij}) + \sum_{i}^{I} \sum_{j}^{I} \sum_{z}^{Z}
\sum_{y}^{Z} (-2 \times p \times X_{iz} \times X_{jy} \times W_{zy} \times
B_{ij})$$</p>
<p>Note that when the problem objective is to maximize some measure of
benefit and not minimize some measure of cost, the term \(p\) is
replaced with \(-p\).</p>
<h2 class="hasAnchor" id="references"><a class="anchor" href="#references"></a>References</h2>
<p>Ball IR, Possingham HP, and Watts M (2009) <em>Marxan and relatives:
Software for spatial conservation prioritisation</em> in Spatial conservation
prioritisation: Quantitative methods and computational tools. Eds Moilanen
A, Wilson KA, and Possingham HP. Oxford University Press, Oxford, UK.</p>
<p>Beyer HL, Dujardin Y, Watts ME, and Possingham HP (2016) Solving
conservation planning problems with integer linear programming.
<em>Ecological Modelling</em>, 228: 14--22.</p>
<h2 class="hasAnchor" id="see-also"><a class="anchor" href="#see-also"></a>See also</h2>
<div class='dont-index'><p>See <a href='penalties.html'>penalties</a> for an overview of all functions for adding penalties.</p>
<p>Other penalties:
<code><a href='add_connectivity_penalties.html'>add_connectivity_penalties</a>()</code>,
<code><a href='add_feature_weights.html'>add_feature_weights</a>()</code>,
<code><a href='add_linear_penalties.html'>add_linear_penalties</a>()</code></p></div>
<h2 class="hasAnchor" id="examples"><a class="anchor" href="#examples"></a>Examples</h2>
<div class="ref-examples sourceCode"><pre class='sourceCode r'><code><span class='r-in'><span class='co'># set seed for reproducibility</span></span>
<span class='r-in'><span class='fu'><a href='https://rdrr.io/r/base/Random.html'>set.seed</a></span><span class='op'>(</span><span class='fl'>500</span><span class='op'>)</span></span>
<span class='r-in'></span>
<span class='r-in'><span class='co'># load data</span></span>
<span class='r-in'><span class='fu'><a href='https://rdrr.io/r/utils/data.html'>data</a></span><span class='op'>(</span><span class='va'>sim_pu_raster</span>, <span class='va'>sim_features</span>, <span class='va'>sim_pu_zones_stack</span>, <span class='va'>sim_features_zones</span><span class='op'>)</span></span>
<span class='r-in'></span>
<span class='r-in'><span class='co'># create minimal problem</span></span>
<span class='r-in'><span class='va'>p1</span> <span class='op'><-</span> <span class='fu'><a href='problem.html'>problem</a></span><span class='op'>(</span><span class='va'>sim_pu_raster</span>, <span class='va'>sim_features</span><span class='op'>)</span> <span class='op'><a href='pipe.html'>%>%</a></span></span>
<span class='r-in'> <span class='fu'><a href='add_min_set_objective.html'>add_min_set_objective</a></span><span class='op'>(</span><span class='op'>)</span> <span class='op'><a href='pipe.html'>%>%</a></span></span>
<span class='r-in'> <span class='fu'><a href='add_relative_targets.html'>add_relative_targets</a></span><span class='op'>(</span><span class='fl'>0.2</span><span class='op'>)</span> <span class='op'><a href='pipe.html'>%>%</a></span></span>
<span class='r-in'> <span class='fu'><a href='add_binary_decisions.html'>add_binary_decisions</a></span><span class='op'>(</span><span class='op'>)</span> <span class='op'><a href='pipe.html'>%>%</a></span></span>
<span class='r-in'> <span class='fu'><a href='add_default_solver.html'>add_default_solver</a></span><span class='op'>(</span>verbose <span class='op'>=</span> <span class='cn'>FALSE</span><span class='op'>)</span></span>
<span class='r-in'></span>
<span class='r-in'><span class='co'># create problem with low boundary penalties</span></span>
<span class='r-in'><span class='va'>p2</span> <span class='op'><-</span> <span class='va'>p1</span> <span class='op'><a href='pipe.html'>%>%</a></span> <span class='fu'>add_boundary_penalties</span><span class='op'>(</span><span class='fl'>50</span>, <span class='fl'>1</span><span class='op'>)</span></span>
<span class='r-in'></span>
<span class='r-in'><span class='co'># create problem with high boundary penalties but outer edges receive</span></span>
<span class='r-in'><span class='co'># half the penalty as inner edges</span></span>
<span class='r-in'><span class='va'>p3</span> <span class='op'><-</span> <span class='va'>p1</span> <span class='op'><a href='pipe.html'>%>%</a></span> <span class='fu'>add_boundary_penalties</span><span class='op'>(</span><span class='fl'>500</span>, <span class='fl'>0.5</span><span class='op'>)</span></span>
<span class='r-in'></span>
<span class='r-in'><span class='co'># create a problem using precomputed boundary data</span></span>
<span class='r-in'><span class='va'>bmat</span> <span class='op'><-</span> <span class='fu'><a href='boundary_matrix.html'>boundary_matrix</a></span><span class='op'>(</span><span class='va'>sim_pu_raster</span><span class='op'>)</span></span>
<span class='r-in'><span class='va'>p4</span> <span class='op'><-</span> <span class='va'>p1</span> <span class='op'><a href='pipe.html'>%>%</a></span> <span class='fu'>add_boundary_penalties</span><span class='op'>(</span><span class='fl'>50</span>, <span class='fl'>1</span>, data <span class='op'>=</span> <span class='va'>bmat</span><span class='op'>)</span></span>
<span class='r-in'></span>
<span class='r-in'><span class='co'># \dontrun{</span></span>
<span class='r-in'><span class='co'># solve problems</span></span>
<span class='r-in'><span class='va'>s</span> <span class='op'><-</span> <span class='fu'><a href='https://rdrr.io/pkg/raster/man/stack.html'>stack</a></span><span class='op'>(</span><span class='fu'><a href='solve.html'>solve</a></span><span class='op'>(</span><span class='va'>p1</span><span class='op'>)</span>, <span class='fu'><a href='solve.html'>solve</a></span><span class='op'>(</span><span class='va'>p2</span><span class='op'>)</span>, <span class='fu'><a href='solve.html'>solve</a></span><span class='op'>(</span><span class='va'>p3</span><span class='op'>)</span>, <span class='fu'><a href='solve.html'>solve</a></span><span class='op'>(</span><span class='va'>p4</span><span class='op'>)</span><span class='op'>)</span></span>
<span class='r-in'></span>
<span class='r-in'><span class='co'># plot solutions</span></span>
<span class='r-in'><span class='fu'><a href='https://rdrr.io/pkg/raster/man/plot.html'>plot</a></span><span class='op'>(</span><span class='va'>s</span>, main <span class='op'>=</span> <span class='fu'><a href='https://rdrr.io/r/base/c.html'>c</a></span><span class='op'>(</span><span class='st'>"basic solution"</span>, <span class='st'>"small penalties"</span>, <span class='st'>"high penalties"</span>,</span>
<span class='r-in'> <span class='st'>"precomputed data"</span><span class='op'>)</span>, axes <span class='op'>=</span> <span class='cn'>FALSE</span>, box <span class='op'>=</span> <span class='cn'>FALSE</span><span class='op'>)</span></span>
<span class='r-plt'><img src='add_boundary_penalties-1.png' alt='' width='700' height='433' /></span>
<span class='r-in'><span class='co'># }</span></span>
<span class='r-in'><span class='co'># create minimal problem with multiple zones and limit the run-time for</span></span>
<span class='r-in'><span class='co'># solver to 10 seconds so this example doesn't take too long</span></span>
<span class='r-in'><span class='va'>p5</span> <span class='op'><-</span> <span class='fu'><a href='problem.html'>problem</a></span><span class='op'>(</span><span class='va'>sim_pu_zones_stack</span>, <span class='va'>sim_features_zones</span><span class='op'>)</span> <span class='op'><a href='pipe.html'>%>%</a></span></span>
<span class='r-in'> <span class='fu'><a href='add_min_set_objective.html'>add_min_set_objective</a></span><span class='op'>(</span><span class='op'>)</span> <span class='op'><a href='pipe.html'>%>%</a></span></span>
<span class='r-in'> <span class='fu'><a href='add_relative_targets.html'>add_relative_targets</a></span><span class='op'>(</span><span class='fu'><a href='https://rdrr.io/r/base/matrix.html'>matrix</a></span><span class='op'>(</span><span class='fl'>0.2</span>, nrow <span class='op'>=</span> <span class='fl'>5</span>, ncol <span class='op'>=</span> <span class='fl'>3</span><span class='op'>)</span><span class='op'>)</span> <span class='op'><a href='pipe.html'>%>%</a></span></span>
<span class='r-in'> <span class='fu'><a href='add_binary_decisions.html'>add_binary_decisions</a></span><span class='op'>(</span><span class='op'>)</span> <span class='op'><a href='pipe.html'>%>%</a></span></span>
<span class='r-in'> <span class='fu'><a href='add_default_solver.html'>add_default_solver</a></span><span class='op'>(</span>time_limit <span class='op'>=</span> <span class='fl'>10</span>, verbose <span class='op'>=</span> <span class='cn'>FALSE</span><span class='op'>)</span></span>
<span class='r-in'></span>
<span class='r-in'><span class='co'># create zone matrix which favors clumping planning units that are</span></span>
<span class='r-in'><span class='co'># allocated to the same zone together - note that this is the default</span></span>
<span class='r-in'><span class='va'>zm6</span> <span class='op'><-</span> <span class='fu'><a href='https://rdrr.io/r/base/diag.html'>diag</a></span><span class='op'>(</span><span class='fl'>3</span><span class='op'>)</span></span>
<span class='r-in'><span class='fu'><a href='print.html'>print</a></span><span class='op'>(</span><span class='va'>zm6</span><span class='op'>)</span></span>
<span class='r-out co'><span class='r-pr'>#></span> [,1] [,2] [,3]</span>
<span class='r-out co'><span class='r-pr'>#></span> [1,] 1 0 0</span>
<span class='r-out co'><span class='r-pr'>#></span> [2,] 0 1 0</span>
<span class='r-out co'><span class='r-pr'>#></span> [3,] 0 0 1</span>
<span class='r-in'></span>
<span class='r-in'><span class='co'># create problem with the zone matrix and low penalties</span></span>
<span class='r-in'><span class='va'>p6</span> <span class='op'><-</span> <span class='va'>p5</span> <span class='op'><a href='pipe.html'>%>%</a></span> <span class='fu'>add_boundary_penalties</span><span class='op'>(</span><span class='fl'>50</span>, zone <span class='op'>=</span> <span class='va'>zm6</span><span class='op'>)</span></span>
<span class='r-in'></span>
<span class='r-in'><span class='co'># create another problem with the same zone matrix and higher penalties</span></span>
<span class='r-in'><span class='va'>p7</span> <span class='op'><-</span> <span class='va'>p5</span> <span class='op'><a href='pipe.html'>%>%</a></span> <span class='fu'>add_boundary_penalties</span><span class='op'>(</span><span class='fl'>500</span>, zone <span class='op'>=</span> <span class='va'>zm6</span><span class='op'>)</span></span>
<span class='r-in'></span>
<span class='r-in'><span class='co'># create zone matrix which favors clumping units that are allocated to</span></span>
<span class='r-in'><span class='co'># different zones together</span></span>
<span class='r-in'><span class='va'>zm8</span> <span class='op'><-</span> <span class='fu'><a href='https://rdrr.io/r/base/matrix.html'>matrix</a></span><span class='op'>(</span><span class='fl'>1</span>, ncol <span class='op'>=</span> <span class='fl'>3</span>, nrow <span class='op'>=</span> <span class='fl'>3</span><span class='op'>)</span></span>
<span class='r-in'><span class='fu'><a href='https://rdrr.io/r/base/diag.html'>diag</a></span><span class='op'>(</span><span class='va'>zm8</span><span class='op'>)</span> <span class='op'><-</span> <span class='fl'>0</span></span>
<span class='r-in'><span class='fu'><a href='print.html'>print</a></span><span class='op'>(</span><span class='va'>zm8</span><span class='op'>)</span></span>
<span class='r-out co'><span class='r-pr'>#></span> [,1] [,2] [,3]</span>
<span class='r-out co'><span class='r-pr'>#></span> [1,] 0 1 1</span>
<span class='r-out co'><span class='r-pr'>#></span> [2,] 1 0 1</span>
<span class='r-out co'><span class='r-pr'>#></span> [3,] 1 1 0</span>
<span class='r-in'></span>
<span class='r-in'><span class='co'># create problem with the zone matrix</span></span>
<span class='r-in'><span class='va'>p8</span> <span class='op'><-</span> <span class='va'>p5</span> <span class='op'><a href='pipe.html'>%>%</a></span> <span class='fu'>add_boundary_penalties</span><span class='op'>(</span><span class='fl'>500</span>, zone <span class='op'>=</span> <span class='va'>zm8</span><span class='op'>)</span></span>
<span class='r-in'></span>
<span class='r-in'><span class='co'># create zone matrix which strongly favors clumping units</span></span>
<span class='r-in'><span class='co'># that are allocated to the same zone together. It will also prefer</span></span>
<span class='r-in'><span class='co'># clumping planning units in zones 1 and 2 together over having</span></span>
<span class='r-in'><span class='co'># these planning units with no neighbors in the solution</span></span>
<span class='r-in'><span class='va'>zm9</span> <span class='op'><-</span> <span class='fu'><a href='https://rdrr.io/r/base/diag.html'>diag</a></span><span class='op'>(</span><span class='fl'>3</span><span class='op'>)</span></span>
<span class='r-in'><span class='va'>zm9</span><span class='op'>[</span><span class='fu'><a href='https://rdrr.io/r/base/lower.tri.html'>upper.tri</a></span><span class='op'>(</span><span class='va'>zm9</span><span class='op'>)</span><span class='op'>]</span> <span class='op'><-</span> <span class='fu'><a href='https://rdrr.io/r/base/c.html'>c</a></span><span class='op'>(</span><span class='fl'>0.3</span>, <span class='fl'>0</span>, <span class='fl'>0</span><span class='op'>)</span></span>
<span class='r-in'><span class='va'>zm9</span><span class='op'>[</span><span class='fu'><a href='https://rdrr.io/r/base/lower.tri.html'>lower.tri</a></span><span class='op'>(</span><span class='va'>zm9</span><span class='op'>)</span><span class='op'>]</span> <span class='op'><-</span> <span class='va'>zm9</span><span class='op'>[</span><span class='fu'><a href='https://rdrr.io/r/base/lower.tri.html'>upper.tri</a></span><span class='op'>(</span><span class='va'>zm9</span><span class='op'>)</span><span class='op'>]</span></span>
<span class='r-in'><span class='fu'><a href='print.html'>print</a></span><span class='op'>(</span><span class='va'>zm9</span><span class='op'>)</span></span>
<span class='r-out co'><span class='r-pr'>#></span> [,1] [,2] [,3]</span>
<span class='r-out co'><span class='r-pr'>#></span> [1,] 1.0 0.3 0</span>
<span class='r-out co'><span class='r-pr'>#></span> [2,] 0.3 1.0 0</span>
<span class='r-out co'><span class='r-pr'>#></span> [3,] 0.0 0.0 1</span>
<span class='r-in'></span>
<span class='r-in'><span class='co'># create problem with the zone matrix</span></span>
<span class='r-in'><span class='va'>p9</span> <span class='op'><-</span> <span class='va'>p5</span> <span class='op'><a href='pipe.html'>%>%</a></span> <span class='fu'>add_boundary_penalties</span><span class='op'>(</span><span class='fl'>500</span>, zone <span class='op'>=</span> <span class='va'>zm9</span><span class='op'>)</span></span>
<span class='r-in'></span>
<span class='r-in'><span class='co'># create zone matrix which favors clumping planning units in zones 1 and 2</span></span>
<span class='r-in'><span class='co'># together, and favors planning units in zone 3 being spread out</span></span>
<span class='r-in'><span class='co'># (i.e. negative clumping)</span></span>
<span class='r-in'><span class='va'>zm10</span> <span class='op'><-</span> <span class='fu'><a href='https://rdrr.io/r/base/diag.html'>diag</a></span><span class='op'>(</span><span class='fl'>3</span><span class='op'>)</span></span>
<span class='r-in'><span class='va'>zm10</span><span class='op'>[</span><span class='fl'>3</span>, <span class='fl'>3</span><span class='op'>]</span> <span class='op'><-</span> <span class='op'>-</span><span class='fl'>1</span></span>
<span class='r-in'><span class='fu'><a href='print.html'>print</a></span><span class='op'>(</span><span class='va'>zm10</span><span class='op'>)</span></span>
<span class='r-out co'><span class='r-pr'>#></span> [,1] [,2] [,3]</span>
<span class='r-out co'><span class='r-pr'>#></span> [1,] 1 0 0</span>
<span class='r-out co'><span class='r-pr'>#></span> [2,] 0 1 0</span>
<span class='r-out co'><span class='r-pr'>#></span> [3,] 0 0 -1</span>
<span class='r-in'></span>
<span class='r-in'><span class='co'># create problem with the zone matrix</span></span>
<span class='r-in'><span class='va'>p10</span> <span class='op'><-</span> <span class='va'>p5</span> <span class='op'><a href='pipe.html'>%>%</a></span> <span class='fu'>add_boundary_penalties</span><span class='op'>(</span><span class='fl'>500</span>, zone <span class='op'>=</span> <span class='va'>zm10</span><span class='op'>)</span></span>
<span class='r-in'></span>
<span class='r-in'><span class='co'># \dontrun{</span></span>
<span class='r-in'><span class='co'># solve problems</span></span>
<span class='r-in'><span class='va'>s2</span> <span class='op'><-</span> <span class='fu'><a href='https://rdrr.io/pkg/raster/man/stack.html'>stack</a></span><span class='op'>(</span><span class='fu'><a href='category_layer.html'>category_layer</a></span><span class='op'>(</span><span class='fu'><a href='solve.html'>solve</a></span><span class='op'>(</span><span class='va'>p5</span><span class='op'>)</span><span class='op'>)</span>, <span class='fu'><a href='category_layer.html'>category_layer</a></span><span class='op'>(</span><span class='fu'><a href='solve.html'>solve</a></span><span class='op'>(</span><span class='va'>p6</span><span class='op'>)</span><span class='op'>)</span>,</span>
<span class='r-in'> <span class='fu'><a href='category_layer.html'>category_layer</a></span><span class='op'>(</span><span class='fu'><a href='solve.html'>solve</a></span><span class='op'>(</span><span class='va'>p7</span><span class='op'>)</span><span class='op'>)</span>, <span class='fu'><a href='category_layer.html'>category_layer</a></span><span class='op'>(</span><span class='fu'><a href='solve.html'>solve</a></span><span class='op'>(</span><span class='va'>p8</span><span class='op'>)</span><span class='op'>)</span>,</span>
<span class='r-in'> <span class='fu'><a href='category_layer.html'>category_layer</a></span><span class='op'>(</span><span class='fu'><a href='solve.html'>solve</a></span><span class='op'>(</span><span class='va'>p9</span><span class='op'>)</span><span class='op'>)</span>, <span class='fu'><a href='category_layer.html'>category_layer</a></span><span class='op'>(</span><span class='fu'><a href='solve.html'>solve</a></span><span class='op'>(</span><span class='va'>p10</span><span class='op'>)</span><span class='op'>)</span><span class='op'>)</span></span>
<span class='r-in'></span>
<span class='r-in'><span class='co'># plot solutions</span></span>
<span class='r-in'><span class='fu'><a href='https://rdrr.io/pkg/raster/man/plot.html'>plot</a></span><span class='op'>(</span><span class='va'>s2</span>, main <span class='op'>=</span> <span class='fu'><a href='https://rdrr.io/r/base/c.html'>c</a></span><span class='op'>(</span><span class='st'>"basic solution"</span>, <span class='st'>"within zone clumping (low)"</span>,</span>
<span class='r-in'> <span class='st'>"within zone clumping (high)"</span>, <span class='st'>"between zone clumping"</span>,</span>
<span class='r-in'> <span class='st'>"within + between clumping"</span>, <span class='st'>"negative clumping"</span><span class='op'>)</span>,</span>
<span class='r-in'> axes <span class='op'>=</span> <span class='cn'>FALSE</span>, box <span class='op'>=</span> <span class='cn'>FALSE</span><span class='op'>)</span></span>
<span class='r-plt'><img src='add_boundary_penalties-2.png' alt='' width='700' height='433' /></span>
<span class='r-in'><span class='co'># }</span></span>
</code></pre></div>
</div>
<div class="col-md-3 hidden-xs hidden-sm" id="pkgdown-sidebar">
<nav id="toc" data-toggle="toc" class="sticky-top">
<h2 data-toc-skip>Contents</h2>
</nav>
</div>
</div>
<footer>
<div class="copyright">
<p><p>Developed by <a href="https://jeffrey-hanson.com" class="external-link">Jeffrey O Hanson</a>, <a href="http://www.richard-schuster.com" class="external-link">Richard Schuster</a>, Nina Morrell, <a href="http://strimas.com" class="external-link">Matthew Strimas-Mackey</a>, Matthew E Watts, <a href="https://arcese.forestry.ubc.ca" class="external-link">Peter Arcese</a>, <a href="https://josephrbennett.wordpress.com" class="external-link">Joseph Bennett</a>, <a href="http://www.possinghamlab.org" class="external-link">Hugh P Possingham</a>.</p></p>
</div>
<div class="pkgdown">
<p><p>Site built with <a href="https://pkgdown.r-lib.org/" class="external-link">pkgdown</a> 1.6.1.9001.</p></p>
</div>
</footer>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/docsearch.js/2.6.1/docsearch.min.js" integrity="sha256-GKvGqXDznoRYHCwKXGnuchvKSwmx9SRMrZOTh2g4Sb0=" crossorigin="anonymous"></script>
<script>
docsearch({
apiKey: '486efa122ea6783724263412c5f28ab3',
indexName: 'prioritizr',
inputSelector: 'input#search-input.form-control',
transformData: function(hits) {
return hits.map(function (hit) {
hit.url = updateHitURL(hit);
return hit;
});
}
});
</script>
</body>
</html>