/
add_asym_connectivity_penalties.html
447 lines (403 loc) · 44.5 KB
/
add_asym_connectivity_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
<!DOCTYPE html>
<!-- Generated by pkgdown: do not edit by hand --><html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><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 asymmetric connectivity penalties — add_asym_connectivity_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 asymmetric connectivity penalties — add_asym_connectivity_penalties"><meta property="og:description" content="Add penalties to a conservation planning problem() to account for
asymmetric connectivity between planning units.
Asymmetric connectivity data describe connectivity information that is
directional.
For example, asymmetric connectivity data could describe
the strength of rivers flowing between different planning units. Since
river flow is directional, the level of connectivity
from an upstream planning unit to a downstream planning unit would
be higher than that from a downstream planning unit to an upstream planning
unit."><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="">7.2.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" data-bs-toggle="dropdown" aria-expanded="false">
Articles
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu"><li>
<a href="../articles/package_overview.html">Package overview</a>
</li>
<li>
<a href="../articles/gurobi_installation_guide.html">Gurobi installation guide</a>
</li>
<li>
<a href="../articles/solver_benchmarks.html">Solver benchmarks</a>
</li>
<li>
<a href="../articles/publication_record.html">Publication record</a>
</li>
</ul></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
Tutorials
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu"><li>
<a href="../articles/connectivity_tutorial.html">Connectivity</a>
</li>
<li>
<a href="../articles/calibrating_trade-offs_tutorial.html">Calibrating trade-offs</a>
</li>
<li>
<a href="../articles/management_zones_tutorial.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/" class="external-link">
<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 asymmetric connectivity penalties</h1>
<small class="dont-index">Source: <a href="https://github.com/prioritizr/prioritizr/blob/HEAD/R/add_asym_connectivity_penalties.R" class="external-link"><code>R/add_asym_connectivity_penalties.R</code></a></small>
<div class="hidden name"><code>add_asym_connectivity_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 account for
asymmetric connectivity between planning units.
Asymmetric connectivity data describe connectivity information that is
directional.
For example, asymmetric connectivity data could describe
the strength of rivers flowing between different planning units. Since
river flow is directional, the level of connectivity
from an upstream planning unit to a downstream planning unit would
be higher than that from a downstream planning unit to an upstream planning
unit.</p>
</div>
<div id="ref-usage">
<div class="sourceCode"><pre class="sourceCode r"><code><span><span class="co"># S4 method for ConservationProblem,ANY,ANY,matrix</span></span>
<span><span class="fu">add_asym_connectivity_penalties</span><span class="op">(</span><span class="va">x</span>, <span class="va">penalty</span>, <span class="va">zones</span>, <span class="va">data</span><span class="op">)</span></span>
<span></span>
<span><span class="co"># S4 method for ConservationProblem,ANY,ANY,Matrix</span></span>
<span><span class="fu">add_asym_connectivity_penalties</span><span class="op">(</span><span class="va">x</span>, <span class="va">penalty</span>, <span class="va">zones</span>, <span class="va">data</span><span class="op">)</span></span>
<span></span>
<span><span class="co"># S4 method for ConservationProblem,ANY,ANY,data.frame</span></span>
<span><span class="fu">add_asym_connectivity_penalties</span><span class="op">(</span><span class="va">x</span>, <span class="va">penalty</span>, <span class="va">zones</span>, <span class="va">data</span><span class="op">)</span></span>
<span></span>
<span><span class="co"># S4 method for ConservationProblem,ANY,ANY,dgCMatrix</span></span>
<span><span class="fu">add_asym_connectivity_penalties</span><span class="op">(</span><span class="va">x</span>, <span class="va">penalty</span>, <span class="va">zones</span>, <span class="va">data</span><span class="op">)</span></span>
<span></span>
<span><span class="co"># S4 method for ConservationProblem,ANY,ANY,array</span></span>
<span><span class="fu">add_asym_connectivity_penalties</span><span class="op">(</span><span class="va">x</span>, <span class="va">penalty</span>, <span class="va">zones</span>, <span class="va">data</span><span class="op">)</span></span></code></pre></div>
</div>
<div id="arguments">
<h2>Arguments</h2>
<dl><dt>x</dt>
<dd><p><code><a href="problem.html">problem()</a></code> (i.e., <code><a href="ConservationProblem-class.html">ConservationProblem</a></code>) object.</p></dd>
<dt>penalty</dt>
<dd><p><code>numeric</code> penalty that is used to scale the importance
of selecting planning units with strong connectivity between them compared
to the main problem objective (e.g., solution cost when the argument to
<code>x</code> has a minimum set objective set using
<code><a href="add_min_set_objective.html">add_min_set_objective()</a></code>). Higher <code>penalty</code> values
can be used to obtain solutions with a high degree of connectivity,
and smaller <code>penalty</code> values can be used to obtain solutions with a
small degree of connectivity. Note that negative <code>penalty</code> values can
be used to obtain solutions that have very little connectivity.</p></dd>
<dt>zones</dt>
<dd><p><code>matrix</code> or <code>Matrix</code> object describing the
level of connectivity between different zones. Each row and column
corresponds to a different zone in the argument to <code>x</code>, and cell
values indicate the level of connectivity between each combination
of zones. Cell values along the diagonal of the matrix represent
the level of connectivity between planning units allocated to the
same zone. Cell values must lay between 1 and -1, where negative
values favor solutions with weak connectivity. 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 planning units are
only considered to be connected when they are allocated to the same zone.
This argument is required when working with multiple zones and the
argument to <code>data</code> is a <code>matrix</code> or <code>Matrix</code> object.
If the argument to <code>data</code> is an <code>array</code> or <code>data.frame</code> with data for
multiple zones (e.g., using the <code>"zone1"</code> and <code>"zone2"</code> column names),
this argument must explicitly be set to <code>NULL</code> otherwise an error will be
thrown.</p></dd>
<dt>data</dt>
<dd><p><code>matrix</code>, <code>Matrix</code>, <code>data.frame</code>, or
<code>array</code> object containing connectivity data. The connectivity values
correspond to the strength of connectivity between
different planning units. Thus connections between planning units
that are associated with higher values are more favorable in the solution.
See the Data format section for more information.</p></dd>
</dl></div>
<div id="value">
<h2>Value</h2>
<p>Object (i.e., <code><a href="ConservationProblem-class.html">ConservationProblem</a></code>) with the penalties
added to it.</p>
</div>
<div id="details">
<h2>Details</h2>
<p>This function adds penalties to conservation planning problem to penalize
solutions that have low connectivity.
Specifically, it penalizes solutions that select planning units that
share high connectivity values with other planning units that are
not selected by the solution (based on Beger <em>et al.</em> 2010).</p>
</div>
<div id="mathematical-formulation">
<h2>Mathematical formulation</h2>
<p>The connectivity 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>, \(D\) represent the
argument to <code>data</code>, and \(W\) represent the argument
to <code>zones</code>.</p>
<p>If the argument to <code>data</code> is supplied as a <code>matrix</code> or
<code>Matrix</code> object, then the penalties are calculated as:</p>
<p>$$
\sum_{i}^{I} \sum_{j}^{I} \sum_{z}^{Z} \sum_{y}^{Z}
(p \times X_{iz} \times D_{ij} \times W_{zy}) -
\sum_{i}^{I} \sum_{j}^{I} \sum_{z}^{Z} \sum_{y}^{Z}
(p \times X_{iz} \times X_{jy} \times D_{ij} \times W_{zy})$$</p>
<p>Otherwise, if the argument to <code>data</code> is supplied as an
<code>array</code> object, then the penalties are
calculated as:</p>
<p>$$
\sum_{i}^{I} \sum_{j}^{I} \sum_{z}^{Z} \sum_{y}^{Z}
(p \times X_{iz} \times D_{ijzy}) -
\sum_{i}^{I} \sum_{j}^{I} \sum_{z}^{Z} \sum_{y}^{Z}
(p \times X_{iz} \times X_{jy} \times D_{ijzy})$$</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>
</div>
<div id="data-format">
<h2>Data format</h2>
<p>The argument to <code>data</code> can be specified using several different formats.</p>
<dl><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
strength of connectivity between two different planning units. Cells
that occur along the matrix diagonal are treated as weights which
indicate that planning units are more desirable in the solution.
The argument to <code>zones</code> can be used to control
the strength of connectivity between planning units in different zones.
The default argument for <code>zones</code> is to treat planning units
allocated to different zones as having zero connectivity.</p></dd>
<dt><code>data</code> as a <code>data.frame</code> object</dt>
<dd><p>containing the fields (columns)
<code>"id1"</code>, <code>"id2"</code>, and <code>"boundary"</code>. Here, each row
denotes the connectivity between a pair of planning units
(per values in the <code>"id1"</code> and <code>"id2"</code> columns) following the
<em>Marxan</em> format.
If the argument to <code>x</code> contains multiple zones, then the columns
<code>"zone1"</code> and <code>"zone2"</code> can optionally be provided to manually
specify the connectivity values between planning units when they are
allocated to specific zones. If the columns <code>"zone1"</code> and
<code>"zone2"</code> are present, then the argument to <code>zones</code> must be
<code>NULL</code>.</p></dd>
<dt><code>data</code> as an <code>array</code> object</dt>
<dd><p>containing four-dimensions where cell values
indicate the strength of connectivity between planning units
when they are assigned to specific management zones. The first two
dimensions (i.e., rows and columns) indicate the strength of
connectivity between different planning units and the second two
dimensions indicate the different management zones. Thus
the <code>data[1, 2, 3, 4]</code> indicates the strength of
connectivity between planning unit 1 and planning unit 2 when planning
unit 1 is assigned to zone 3 and planning unit 2 is assigned to zone 4.</p></dd>
</dl></div>
<div id="references">
<h2>References</h2>
<p>Beger M, Linke S, Watts M, Game E, Treml E, Ball I, and Possingham, HP (2010)
Incorporating asymmetric connectivity into spatial decision making for
conservation, <em>Conservation Letters</em>, 3: 359--368.</p>
</div>
<div id="see-also">
<h2>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_boundary_penalties.html">add_boundary_penalties</a>()</code>,
<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>
</div>
<div id="ref-examples">
<h2>Examples</h2>
<div class="sourceCode"><pre class="sourceCode r"><code><span class="r-in"><span><span class="co"># \dontrun{</span></span></span>
<span class="r-in"><span><span class="co"># load package</span></span></span>
<span class="r-in"><span><span class="kw"><a href="https://rdrr.io/r/base/library.html" class="external-link">library</a></span><span class="op">(</span><span class="va"><a href="https://Matrix.R-forge.R-project.org/" class="external-link">Matrix</a></span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># set seed for reproducibility</span></span></span>
<span class="r-in"><span><span class="fu"><a href="https://rdrr.io/r/base/Random.html" class="external-link">set.seed</a></span><span class="op">(</span><span class="fl">600</span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># load data</span></span></span>
<span class="r-in"><span><span class="fu"><a href="https://rdrr.io/r/utils/data.html" class="external-link">data</a></span><span class="op">(</span><span class="va">sim_pu_sf</span>, <span class="va">sim_pu_zones_stack</span>, <span class="va">sim_features</span>, <span class="va">sim_features_zones</span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># define function to rescale values between zero and one so that we</span></span></span>
<span class="r-in"><span><span class="co"># can compare solutions from different connectivity matrices</span></span></span>
<span class="r-in"><span><span class="va">rescale</span> <span class="op"><-</span> <span class="kw">function</span><span class="op">(</span><span class="va">x</span>, <span class="va">to</span> <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/c.html" class="external-link">c</a></span><span class="op">(</span><span class="fl">0</span>, <span class="fl">1</span><span class="op">)</span>, <span class="va">from</span> <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/range.html" class="external-link">range</a></span><span class="op">(</span><span class="va">x</span>, na.rm <span class="op">=</span> <span class="cn">TRUE</span><span class="op">)</span><span class="op">)</span> <span class="op">{</span></span></span>
<span class="r-in"><span> <span class="op">(</span><span class="va">x</span> <span class="op">-</span> <span class="va">from</span><span class="op">[</span><span class="fl">1</span><span class="op">]</span><span class="op">)</span> <span class="op">/</span> <span class="fu"><a href="https://rdrr.io/r/base/diff.html" class="external-link">diff</a></span><span class="op">(</span><span class="va">from</span><span class="op">)</span> <span class="op">*</span> <span class="fu"><a href="https://rdrr.io/r/base/diff.html" class="external-link">diff</a></span><span class="op">(</span><span class="va">to</span><span class="op">)</span> <span class="op">+</span> <span class="va">to</span><span class="op">[</span><span class="fl">1</span><span class="op">]</span></span></span>
<span class="r-in"><span><span class="op">}</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># create basic problem</span></span></span>
<span class="r-in"><span><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_sf</span>, <span class="va">sim_features</span>, <span class="st">"cost"</span><span class="op">)</span> <span class="op"><a href="pipe.html">%>%</a></span></span></span>
<span class="r-in"><span> <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>
<span class="r-in"><span> <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>
<span class="r-in"><span> <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>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># create an asymmetric connectivity matrix. Here, connectivity occurs between</span></span></span>
<span class="r-in"><span><span class="co"># adjacent planning units and, due to rivers flowing southwards</span></span></span>
<span class="r-in"><span><span class="co"># through the study area, connectivity from northern planning units to</span></span></span>
<span class="r-in"><span><span class="co"># southern planning units is ten times stronger than the reverse.</span></span></span>
<span class="r-in"><span><span class="va">acm1</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/matrix.html" class="external-link">matrix</a></span><span class="op">(</span><span class="fl">0</span>, <span class="fu"><a href="OptimizationProblem-methods.html">nrow</a></span><span class="op">(</span><span class="va">sim_pu_sf</span><span class="op">)</span>, <span class="fu"><a href="OptimizationProblem-methods.html">nrow</a></span><span class="op">(</span><span class="va">sim_pu_sf</span><span class="op">)</span><span class="op">)</span></span></span>
<span class="r-in"><span><span class="va">acm1</span> <span class="op"><-</span> <span class="fu"><a href="as.html">as</a></span><span class="op">(</span><span class="va">acm1</span>, <span class="st">"Matrix"</span><span class="op">)</span></span></span>
<span class="r-in"><span><span class="va">centroids</span> <span class="op"><-</span> <span class="fu">sf</span><span class="fu">::</span><span class="fu"><a href="https://r-spatial.github.io/sf/reference/st_coordinates.html" class="external-link">st_coordinates</a></span><span class="op">(</span><span class="fu"><a href="https://rdrr.io/r/base/warning.html" class="external-link">suppressWarnings</a></span><span class="op">(</span><span class="fu">sf</span><span class="fu">::</span><span class="fu"><a href="https://r-spatial.github.io/sf/reference/geos_unary.html" class="external-link">st_centroid</a></span><span class="op">(</span><span class="va">sim_pu_sf</span><span class="op">)</span><span class="op">)</span><span class="op">)</span></span></span>
<span class="r-in"><span><span class="va">adjacent_units</span> <span class="op"><-</span> <span class="fu">sf</span><span class="fu">::</span><span class="fu"><a href="https://r-spatial.github.io/sf/reference/geos_binary_pred.html" class="external-link">st_intersects</a></span><span class="op">(</span><span class="va">sim_pu_sf</span>, sparse <span class="op">=</span> <span class="cn">FALSE</span><span class="op">)</span></span></span>
<span class="r-in"><span><span class="kw">for</span> <span class="op">(</span><span class="va">i</span> <span class="kw">in</span> <span class="fu"><a href="https://rdrr.io/r/base/seq.html" class="external-link">seq_len</a></span><span class="op">(</span><span class="fu"><a href="OptimizationProblem-methods.html">nrow</a></span><span class="op">(</span><span class="va">sim_pu_sf</span><span class="op">)</span><span class="op">)</span><span class="op">)</span> <span class="op">{</span></span></span>
<span class="r-in"><span> <span class="kw">for</span> <span class="op">(</span><span class="va">j</span> <span class="kw">in</span> <span class="fu"><a href="https://rdrr.io/r/base/seq.html" class="external-link">seq_len</a></span><span class="op">(</span><span class="fu"><a href="OptimizationProblem-methods.html">nrow</a></span><span class="op">(</span><span class="va">sim_pu_sf</span><span class="op">)</span><span class="op">)</span><span class="op">)</span> <span class="op">{</span></span></span>
<span class="r-in"><span> <span class="co"># find if planning units are adjacent</span></span></span>
<span class="r-in"><span> <span class="kw">if</span> <span class="op">(</span><span class="va">adjacent_units</span><span class="op">[</span><span class="va">i</span>, <span class="va">j</span><span class="op">]</span><span class="op">)</span> <span class="op">{</span></span></span>
<span class="r-in"><span> <span class="co"># find if planning units lay north and south of each other</span></span></span>
<span class="r-in"><span> <span class="co"># i.e., they have the same x-coordinate</span></span></span>
<span class="r-in"><span> <span class="kw">if</span> <span class="op">(</span><span class="va">centroids</span><span class="op">[</span><span class="va">i</span>, <span class="fl">1</span><span class="op">]</span> <span class="op">==</span> <span class="va">centroids</span><span class="op">[</span><span class="va">j</span>, <span class="fl">1</span><span class="op">]</span><span class="op">)</span> <span class="op">{</span></span></span>
<span class="r-in"><span> <span class="kw">if</span> <span class="op">(</span><span class="va">centroids</span><span class="op">[</span><span class="va">i</span>, <span class="fl">2</span><span class="op">]</span> <span class="op">></span> <span class="va">centroids</span><span class="op">[</span><span class="va">j</span>, <span class="fl">2</span><span class="op">]</span><span class="op">)</span> <span class="op">{</span></span></span>
<span class="r-in"><span> <span class="co"># if i is north of j add 10 units of connectivity</span></span></span>
<span class="r-in"><span> <span class="va">acm1</span><span class="op">[</span><span class="va">i</span>, <span class="va">j</span><span class="op">]</span> <span class="op"><-</span> <span class="va">acm1</span><span class="op">[</span><span class="va">i</span>, <span class="va">j</span><span class="op">]</span> <span class="op">+</span> <span class="fl">10</span></span></span>
<span class="r-in"><span> <span class="op">}</span> <span class="kw">else</span> <span class="kw">if</span> <span class="op">(</span><span class="va">centroids</span><span class="op">[</span><span class="va">i</span>, <span class="fl">2</span><span class="op">]</span> <span class="op"><</span> <span class="va">centroids</span><span class="op">[</span><span class="va">j</span>, <span class="fl">2</span><span class="op">]</span><span class="op">)</span> <span class="op">{</span></span></span>
<span class="r-in"><span> <span class="co"># if i is south of j add 1 unit of connectivity</span></span></span>
<span class="r-in"><span> <span class="va">acm1</span><span class="op">[</span><span class="va">i</span>, <span class="va">j</span><span class="op">]</span> <span class="op"><-</span> <span class="va">acm1</span><span class="op">[</span><span class="va">i</span>, <span class="va">j</span><span class="op">]</span> <span class="op">+</span> <span class="fl">1</span></span></span>
<span class="r-in"><span> <span class="op">}</span></span></span>
<span class="r-in"><span> <span class="op">}</span></span></span>
<span class="r-in"><span> <span class="op">}</span></span></span>
<span class="r-in"><span> <span class="op">}</span></span></span>
<span class="r-in"><span><span class="op">}</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># linearly re-scale matrix values to range between zero and one</span></span></span>
<span class="r-in"><span><span class="va">acm1</span><span class="op">[</span><span class="op">]</span> <span class="op"><-</span> <span class="fu">rescale</span><span class="op">(</span><span class="va">acm1</span><span class="op">[</span><span class="op">]</span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># visualize asymmetric connectivity matrix</span></span></span>
<span class="r-in"><span><span class="fu"><a href="https://rdrr.io/r/graphics/image.html" class="external-link">image</a></span><span class="op">(</span><span class="va">acm1</span><span class="op">)</span></span></span>
<span class="r-plt img"><img src="add_asym_connectivity_penalties-1.png" alt="" width="700" height="433"></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># create penalties</span></span></span>
<span class="r-in"><span><span class="va">penalties</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/c.html" class="external-link">c</a></span><span class="op">(</span><span class="fl">1</span>, <span class="fl">50</span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># create problems using the different penalties</span></span></span>
<span class="r-in"><span><span class="va">p2</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html" class="external-link">list</a></span><span class="op">(</span></span></span>
<span class="r-in"><span> <span class="va">p1</span>,</span></span>
<span class="r-in"><span> <span class="va">p1</span> <span class="op"><a href="pipe.html">%>%</a></span> <span class="fu">add_asym_connectivity_penalties</span><span class="op">(</span><span class="va">penalties</span><span class="op">[</span><span class="fl">1</span><span class="op">]</span>, data <span class="op">=</span> <span class="va">acm1</span><span class="op">)</span>,</span></span>
<span class="r-in"><span> <span class="va">p1</span> <span class="op"><a href="pipe.html">%>%</a></span> <span class="fu">add_asym_connectivity_penalties</span><span class="op">(</span><span class="va">penalties</span><span class="op">[</span><span class="fl">2</span><span class="op">]</span>, data <span class="op">=</span> <span class="va">acm1</span><span class="op">)</span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># assign names to the problems</span></span></span>
<span class="r-in"><span><span class="fu"><a href="https://rdrr.io/r/base/names.html" class="external-link">names</a></span><span class="op">(</span><span class="va">p2</span><span class="op">)</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/c.html" class="external-link">c</a></span><span class="op">(</span><span class="st">"basic problem"</span>, <span class="fu"><a href="https://rdrr.io/r/base/paste.html" class="external-link">paste0</a></span><span class="op">(</span><span class="st">"acm1 ("</span>, <span class="va">penalties</span>,<span class="st">")"</span><span class="op">)</span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># solve problems</span></span></span>
<span class="r-in"><span><span class="va">s2</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/lapply.html" class="external-link">lapply</a></span><span class="op">(</span><span class="va">p2</span>, <span class="va">solve</span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># plot solutions</span></span></span>
<span class="r-in"><span><span class="fu"><a href="https://rdrr.io/r/graphics/par.html" class="external-link">par</a></span><span class="op">(</span>mfrow <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/c.html" class="external-link">c</a></span><span class="op">(</span><span class="fl">1</span>, <span class="fl">3</span><span class="op">)</span><span class="op">)</span></span></span>
<span class="r-in"><span><span class="kw">for</span> <span class="op">(</span><span class="va">i</span> <span class="kw">in</span> <span class="fu"><a href="https://rdrr.io/r/base/seq.html" class="external-link">seq_along</a></span><span class="op">(</span><span class="va">s2</span><span class="op">)</span><span class="op">)</span> <span class="op">{</span></span></span>
<span class="r-in"><span> <span class="fu"><a href="https://rdrr.io/r/base/plot.html" class="external-link">plot</a></span><span class="op">(</span><span class="va">s2</span><span class="op">[[</span><span class="va">i</span><span class="op">]</span><span class="op">]</span>, main <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/names.html" class="external-link">names</a></span><span class="op">(</span><span class="va">p2</span><span class="op">)</span><span class="op">[</span><span class="va">i</span><span class="op">]</span>, cex <span class="op">=</span> <span class="fl">1.5</span>, col <span class="op">=</span> <span class="st">"white"</span><span class="op">)</span></span></span>
<span class="r-in"><span> <span class="fu"><a href="https://rdrr.io/r/base/plot.html" class="external-link">plot</a></span><span class="op">(</span><span class="va">s2</span><span class="op">[[</span><span class="va">i</span><span class="op">]</span><span class="op">]</span><span class="op">[</span><span class="va">s2</span><span class="op">[[</span><span class="va">i</span><span class="op">]</span><span class="op">]</span><span class="op">$</span><span class="va">solution_1</span> <span class="op">==</span> <span class="fl">1</span>, <span class="op">]</span>, col <span class="op">=</span> <span class="st">"darkgreen"</span>, add <span class="op">=</span> <span class="cn">TRUE</span><span class="op">)</span></span></span>
<span class="r-in"><span><span class="op">}</span></span></span>
<span class="r-wrn co"><span class="r-pr">#></span> <span class="warning">Warning: </span>ignoring all but the first attribute</span>
<span class="r-plt img"><img src="add_asym_connectivity_penalties-2.png" alt="" width="700" height="433"></span>
<span class="r-wrn co"><span class="r-pr">#></span> <span class="warning">Warning: </span>ignoring all but the first attribute</span>
<span class="r-plt img"><img src="add_asym_connectivity_penalties-3.png" alt="" width="700" height="433"></span>
<span class="r-wrn co"><span class="r-pr">#></span> <span class="warning">Warning: </span>ignoring all but the first attribute</span>
<span class="r-plt img"><img src="add_asym_connectivity_penalties-4.png" alt="" width="700" height="433"></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># create minimal multi-zone problem and limit solver to one minute</span></span></span>
<span class="r-in"><span><span class="co"># to obtain solutions in a short period of time</span></span></span>
<span class="r-in"><span><span class="va">p3</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>
<span class="r-in"><span> <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>
<span class="r-in"><span> <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" class="external-link">matrix</a></span><span class="op">(</span><span class="fl">0.15</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>
<span class="r-in"><span> <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>
<span class="r-in"><span> <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">60</span>, verbose <span class="op">=</span> <span class="cn">FALSE</span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># crate asymmetric connectivity data by randomly simulating values</span></span></span>
<span class="r-in"><span><span class="va">acm2</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/matrix.html" class="external-link">matrix</a></span><span class="op">(</span><span class="fu"><a href="https://rdrr.io/r/stats/Uniform.html" class="external-link">runif</a></span><span class="op">(</span><span class="fu"><a href="OptimizationProblem-methods.html">ncell</a></span><span class="op">(</span><span class="va">sim_pu_zones_stack</span><span class="op">)</span> <span class="op">^</span> <span class="fl">2</span><span class="op">)</span>,</span></span>
<span class="r-in"><span> nrow <span class="op">=</span> <span class="fu"><a href="OptimizationProblem-methods.html">ncell</a></span><span class="op">(</span><span class="va">sim_pu_zones_stack</span><span class="op">)</span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># create multi-zone problems using the penalties</span></span></span>
<span class="r-in"><span><span class="va">p4</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/list.html" class="external-link">list</a></span><span class="op">(</span></span></span>
<span class="r-in"><span> <span class="va">p3</span>,</span></span>
<span class="r-in"><span> <span class="va">p3</span> <span class="op"><a href="pipe.html">%>%</a></span> <span class="fu">add_asym_connectivity_penalties</span><span class="op">(</span><span class="va">penalties</span><span class="op">[</span><span class="fl">1</span><span class="op">]</span>, data <span class="op">=</span> <span class="va">acm2</span><span class="op">)</span>,</span></span>
<span class="r-in"><span> <span class="va">p3</span> <span class="op"><a href="pipe.html">%>%</a></span> <span class="fu">add_asym_connectivity_penalties</span><span class="op">(</span><span class="va">penalties</span><span class="op">[</span><span class="fl">2</span><span class="op">]</span>, data <span class="op">=</span> <span class="va">acm2</span><span class="op">)</span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># assign names to the problems</span></span></span>
<span class="r-in"><span><span class="fu"><a href="https://rdrr.io/r/base/names.html" class="external-link">names</a></span><span class="op">(</span><span class="va">p4</span><span class="op">)</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/c.html" class="external-link">c</a></span><span class="op">(</span><span class="st">"basic problem"</span>, <span class="fu"><a href="https://rdrr.io/r/base/paste.html" class="external-link">paste0</a></span><span class="op">(</span><span class="st">"acm2 ("</span>, <span class="va">penalties</span>,<span class="st">")"</span><span class="op">)</span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># solve problems</span></span></span>
<span class="r-in"><span><span class="va">s4</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/lapply.html" class="external-link">lapply</a></span><span class="op">(</span><span class="va">p4</span>, <span class="va">solve</span><span class="op">)</span></span></span>
<span class="r-in"><span><span class="va">s4</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/r/base/lapply.html" class="external-link">lapply</a></span><span class="op">(</span><span class="va">s4</span>, <span class="va">category_layer</span><span class="op">)</span></span></span>
<span class="r-in"><span><span class="va">s4</span> <span class="op"><-</span> <span class="fu"><a href="https://rdrr.io/pkg/raster/man/stack.html" class="external-link">stack</a></span><span class="op">(</span><span class="va">s4</span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># plot solutions</span></span></span>
<span class="r-in"><span><span class="fu"><a href="https://rdrr.io/r/base/plot.html" class="external-link">plot</a></span><span class="op">(</span><span class="va">s4</span>, main <span class="op">=</span> <span class="fu"><a href="https://rdrr.io/r/base/names.html" class="external-link">names</a></span><span class="op">(</span><span class="va">p4</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>
<span class="r-plt img"><img src="add_asym_connectivity_penalties-5.png" alt="" width="700" height="433"></span>
<span class="r-in"><span><span class="co"># }</span></span></span>
<span class="r-in"><span></span></span>
</code></pre></div>
</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><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>, Brandon P M Edwards, 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>
</div>
<div class="pkgdown">
<p></p><p>Site built with <a href="https://pkgdown.r-lib.org/" class="external-link">pkgdown</a> 2.0.6.</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>