/
presolve_check.html
358 lines (331 loc) · 29.8 KB
/
presolve_check.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
<!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>Presolve check — presolve_check • 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="Presolve check — presolve_check"><meta property="og:description" content='Check a conservation planning problem() for potential issues
before trying to solve it. Specifically, problems are checked for (i) values
that are likely to result in "strange" solutions and (ii) values that are
likely to cause numerical instability issues and lead to unreasonably long
run times when solving it. Although these checks are provided to help
diagnose potential issues, please be aware that some detected issues may be
false positives. Please note that these checks will not be able to
verify if a problem has a feasible solution or not.'><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.6</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>Presolve check</h1>
<small class="dont-index">Source: <a href="https://github.com/prioritizr/prioritizr/blob/HEAD/R/presolve_check.R" class="external-link"><code>R/presolve_check.R</code></a></small>
<div class="hidden name"><code>presolve_check.Rd</code></div>
</div>
<div class="ref-description">
<p>Check a conservation planning <code><a href="problem.html">problem()</a></code> for potential issues
before trying to solve it. Specifically, problems are checked for (i) values
that are likely to result in "strange" solutions and (ii) values that are
likely to cause numerical instability issues and lead to unreasonably long
run times when solving it. Although these checks are provided to help
diagnose potential issues, please be aware that some detected issues may be
false positives. Please note that these checks will not be able to
verify if a problem has a feasible solution or not.</p>
</div>
<div id="ref-usage">
<div class="sourceCode"><pre class="sourceCode r"><code><span><span class="fu">presolve_check</span><span class="op">(</span><span class="va">x</span><span class="op">)</span></span>
<span></span>
<span><span class="co"># S3 method for ConservationProblem</span></span>
<span><span class="fu">presolve_check</span><span class="op">(</span><span class="va">x</span><span class="op">)</span></span>
<span></span>
<span><span class="co"># S3 method for OptimizationProblem</span></span>
<span><span class="fu">presolve_check</span><span class="op">(</span><span class="va">x</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>) or
<code><a href="OptimizationProblem-class.html">OptimizationProblem</a></code> object.</p></dd>
</dl></div>
<div id="value">
<h2>Value</h2>
<p><code>logical</code> value indicating if all checks are passed
successfully.</p>
</div>
<div id="details">
<h2>Details</h2>
<p>This function checks for issues that are likely to result in
"strange" solutions. Specifically, it checks if (i) all planning units are
locked in, (ii) all planning units are locked out, and (iii) all
planning units have negative cost values (after applying penalties if any
were specified). Although such conservation planning problems
are mathematically valid, they are generally the result of a coding mistake
when building the problem (e.g., using an absurdly high
penalty value or using the wrong dataset to lock in planning units).
Thus such issues, if they are indeed issues and not false positives, can
be fixed by carefully checking the code, data, and parameters used to build
the conservation planning problem.</p>
<p>This function then checks for values that may lead to numerical instability
issues when solving the problem. Specifically, it checks if the range of
values in certain components of the optimization problem are over a
certain threshold (i.e., \(1 \times 10 ^9\)) or if the values
themselves exceed a certain threshold
(i.e., \(1 \times 10^{10}\)).
In most cases, such issues will simply cause an exact
algorithm solver to take a very long time to generate a solution. In rare
cases, such issues can cause incorrect calculations which can lead
to exact algorithm solvers returning infeasible solutions
(e.g., a solution to the minimum set problem where not all targets are met)
or solutions that exceed the specified optimality gap (e.g., a suboptimal
solution when a zero optimality gap is specified).</p>
<p>What can you do if a conservation planning problem fails to pass these
checks? Well, this function will have thrown some warning messages
describing the source of these issues, so read them carefully. For
instance, a common issue is when a relatively large penalty value is
specified for boundary (<code><a href="add_boundary_penalties.html">add_boundary_penalties()</a></code>) or
connectivity penalties (<code><a href="add_connectivity_penalties.html">add_connectivity_penalties()</a></code>). This
can be fixed by trying a smaller penalty value. In such cases, the
original penalty value supplied was so high that the optimal solution
would just have selected every single planning unit in the solution---and
this may not be especially helpful anyway (see below for example). Another
common issue is that the
planning unit cost values are too large. For example, if you express the
costs of the planning units in terms of USD then you might have
some planning units that cost over one billion dollars in large-scale
planning exercises. This can be fixed by rescaling the values so that they
are smaller (e.g., multiplying the values by a number smaller than one, or
expressing them as a fraction of the maximum cost). Let's consider another
common issue, let's pretend that you used habitat suitability models to
predict the amount of suitable habitat
in each planning unit for each feature. If you calculated the amount of
suitable habitat in each planning unit in square meters then this
could lead to very large numbers. You could fix this by converting
the units from square meters to square kilometers or thousands of square
kilometers. Alternatively, you could calculate the percentage of each
planning unit that is occupied by suitable habitat, which will yield
values between zero and one hundred.</p>
<p>But what can you do if you can't fix these issues by simply changing
the penalty values or rescaling data? You will need to apply some creative
thinking. Let's run through a couple of scenarios.
Let's pretend that you have a few planning units that
cost a billion times more than any other planning
unit so you can't fix this by rescaling the cost values. In this case, it's
extremely unlikely that these planning units will
be selected in the optimal solution so just set the costs to zero and lock
them out. If this procedure yields a problem with no feasible solution,
because one (or several) of the planning units that you manually locked out
contains critical habitat for a feature, then find out which planning
unit(s) is causing this infeasibility and set its cost to zero. After
solving the problem, you will need to manually recalculate the cost
of the solutions but at least now you can be confident that you have the
optimal solution. Now let's pretend that you are using the maximum features
objective (i.e., <code><a href="add_max_features_objective.html">add_max_features_objective()</a></code>) and assigned some
really high weights to the targets for some features to ensure that their
targets were met in the optimal solution. If you set the weights for
these features to one billion then you will probably run into numerical
instability issues. Instead, you can calculate minimum weight needed to
guarantee that these features will be represented in the optimal solution
and use this value instead of one billion. This minimum weight value
can be calculated as the sum of the weight values for the other features
and adding a small number to it (e.g., 1). Finally, if you're running out
of ideas for addressing numerical stability issues you have one remaining
option: you can use the <code>numeric_focus</code> argument in the
<code><a href="add_gurobi_solver.html">add_gurobi_solver()</a></code> function to tell the solver to pay extra
attention to numerical instability issues. This is not a free lunch,
however, because telling the solver to pay extra attention to numerical
issues can substantially increase run time. So, if you have problems that
are already taking an unreasonable time to solve, then this will not help
at all.</p>
</div>
<div id="see-also">
<h2>See also</h2>
<div class="dont-index"><p><code><a href="problem.html">problem()</a></code>, <code><a href="solve.html">solve()</a></code>, <a href="https://www.gurobi.com/documentation/9.5/refman/numerics_gurobi_guidelines.html" class="external-link">https://www.gurobi.com/documentation/9.5/refman/numerics_gurobi_guidelines.html</a>.</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"># 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">500</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_raster</span>, <span class="va">sim_features</span><span class="op">)</span></span></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># create minimal problem with no issues</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_raster</span>, <span class="va">sim_features</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.1</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></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># run presolve checks</span></span></span>
<span class="r-in"><span><span class="co"># note that no warning is thrown which suggests that we should not</span></span></span>
<span class="r-in"><span><span class="co"># encounter any numerical stability issues when trying to solve the problem</span></span></span>
<span class="r-in"><span><span class="fu"><a href="print.html">print</a></span><span class="op">(</span><span class="fu">presolve_check</span><span class="op">(</span><span class="va">p1</span><span class="op">)</span><span class="op">)</span></span></span>
<span class="r-out co"><span class="r-pr">#></span> [1] TRUE</span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># create a minimal problem, containing cost values that are really</span></span></span>
<span class="r-in"><span><span class="co"># high so that they could cause numerical instability issues when trying</span></span></span>
<span class="r-in"><span><span class="co"># to solve it</span></span></span>
<span class="r-in"><span><span class="va">sim_pu_raster2</span> <span class="op"><-</span> <span class="va">sim_pu_raster</span></span></span>
<span class="r-in"><span><span class="va">sim_pu_raster2</span><span class="op">[</span><span class="fl">1</span><span class="op">]</span> <span class="op"><-</span> <span class="fl">1e+15</span></span></span>
<span class="r-in"><span><span class="va">p2</span> <span class="op"><-</span> <span class="fu"><a href="problem.html">problem</a></span><span class="op">(</span><span class="va">sim_pu_raster2</span>, <span class="va">sim_features</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.1</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></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># run presolve checks</span></span></span>
<span class="r-in"><span><span class="co"># note that a warning is thrown which suggests that we might encounter</span></span></span>
<span class="r-in"><span><span class="co"># some issues, such as long solve time or suboptimal solutions, when</span></span></span>
<span class="r-in"><span><span class="co"># trying to solve the problem</span></span></span>
<span class="r-in"><span><span class="fu"><a href="print.html">print</a></span><span class="op">(</span><span class="fu">presolve_check</span><span class="op">(</span><span class="va">p2</span><span class="op">)</span><span class="op">)</span></span></span>
<span class="r-wrn co"><span class="r-pr">#></span> <span class="warning">Warning: </span>planning units with very high costs (> 1e+06), please consider re-scaling the values to avoid numerical issues (e.g., convert units from USD to millions of USD)</span>
<span class="r-out co"><span class="r-pr">#></span> [1] FALSE</span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># create a minimal problem with connectivity penalties values that have</span></span></span>
<span class="r-in"><span><span class="co"># a really high penalty value that is likely to cause numerical instability</span></span></span>
<span class="r-in"><span><span class="co"># issues when trying to solve the it</span></span></span>
<span class="r-in"><span><span class="va">cm</span> <span class="op"><-</span> <span class="fu"><a href="adjacency_matrix.html">adjacency_matrix</a></span><span class="op">(</span><span class="va">sim_pu_raster</span><span class="op">)</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_raster</span>, <span class="va">sim_features</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.1</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_connectivity_penalties.html">add_connectivity_penalties</a></span><span class="op">(</span><span class="fl">1e+15</span>, data <span class="op">=</span> <span class="va">cm</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></span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># run presolve checks</span></span></span>
<span class="r-in"><span><span class="co"># note that a warning is thrown which suggests that we might encounter</span></span></span>
<span class="r-in"><span><span class="co"># some numerical instability issues when trying to solve the problem</span></span></span>
<span class="r-in"><span><span class="fu"><a href="print.html">print</a></span><span class="op">(</span><span class="fu">presolve_check</span><span class="op">(</span><span class="va">p3</span><span class="op">)</span><span class="op">)</span></span></span>
<span class="r-wrn co"><span class="r-pr">#></span> <span class="warning">Warning: </span>penalty multiplied connectivity values are very high (> 1e+06), try using a smaller penalty value in add_connectivity_penalties()</span>
<span class="r-out co"><span class="r-pr">#></span> [1] FALSE</span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># let's forcibly solve the problem using Gurobi and tell it to</span></span></span>
<span class="r-in"><span><span class="co"># be extra careful about numerical instability problems</span></span></span>
<span class="r-in"><span><span class="va">s3</span> <span class="op"><-</span> <span class="va">p3</span> <span class="op"><a href="pipe.html">%>%</a></span></span></span>
<span class="r-in"><span> <span class="fu"><a href="add_gurobi_solver.html">add_gurobi_solver</a></span><span class="op">(</span>numeric_focus <span class="op">=</span> <span class="cn">TRUE</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="solve.html">solve</a></span><span class="op">(</span>force <span class="op">=</span> <span class="cn">TRUE</span><span class="op">)</span></span></span>
<span class="r-wrn co"><span class="r-pr">#></span> <span class="warning">Warning: </span>penalty multiplied connectivity values are very high (> 1e+06), try using a smaller penalty value in add_connectivity_penalties()</span>
<span class="r-out co"><span class="r-pr">#></span> Gurobi Optimizer version 9.5.2 build v9.5.2rc0 (linux64)</span>
<span class="r-out co"><span class="r-pr">#></span> Thread count: 4 physical cores, 8 logical processors, using up to 1 threads</span>
<span class="r-out co"><span class="r-pr">#></span> Optimize a model with 293 rows, 234 columns and 1026 nonzeros</span>
<span class="r-out co"><span class="r-pr">#></span> Model fingerprint: 0x91dcff5b</span>
<span class="r-out co"><span class="r-pr">#></span> Variable types: 0 continuous, 234 integer (234 binary)</span>
<span class="r-out co"><span class="r-pr">#></span> Coefficient statistics:</span>
<span class="r-out co"><span class="r-pr">#></span> Matrix range [2e-01, 1e+00]</span>
<span class="r-out co"><span class="r-pr">#></span> Objective range [2e+02, 1e+15]</span>
<span class="r-out co"><span class="r-pr">#></span> Bounds range [1e+00, 1e+00]</span>
<span class="r-out co"><span class="r-pr">#></span> RHS range [3e+00, 8e+00]</span>
<span class="r-out co"><span class="r-pr">#></span> Warning: Model contains large objective coefficients</span>
<span class="r-out co"><span class="r-pr">#></span> Found heuristic solution: objective -1.44000e+17</span>
<span class="r-out co"><span class="r-pr">#></span> </span>
<span class="r-out co"><span class="r-pr">#></span> Explored 0 nodes (0 simplex iterations) in 0.00 seconds (0.00 work units)</span>
<span class="r-out co"><span class="r-pr">#></span> Thread count was 1 (of 8 available processors)</span>
<span class="r-out co"><span class="r-pr">#></span> </span>
<span class="r-out co"><span class="r-pr">#></span> Solution count 1: -1.44e+17 </span>
<span class="r-out co"><span class="r-pr">#></span> No other solutions better than -1.44e+17</span>
<span class="r-out co"><span class="r-pr">#></span> </span>
<span class="r-out co"><span class="r-pr">#></span> Optimal solution found (tolerance 1.00e-01)</span>
<span class="r-out co"><span class="r-pr">#></span> Best objective -1.440000000000e+17, best bound -1.440000000000e+17, gap 0.0000%</span>
<span class="r-in"><span></span></span>
<span class="r-in"><span><span class="co"># plot solution</span></span></span>
<span class="r-in"><span><span class="co"># we can see that all planning units were selected because the connectivity</span></span></span>
<span class="r-in"><span><span class="co"># penalty is so high that cost becomes irrelevant, so we should try using</span></span></span>
<span class="r-in"><span><span class="co"># a much lower penalty value</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">s3</span>, main <span class="op">=</span> <span class="st">"solution"</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="presolve_check-1.png" alt="" width="700" height="433"></span>
<span class="r-in"><span><span class="co"># }</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>