7257 lines
1.5 MiB
7257 lines
1.5 MiB
<!-- HTML header for doxygen 1.8.18-->
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
|
<meta name="generator" content="Doxygen 1.9.2"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
<title>OR-Tools: routing.cc Source File</title>
|
|
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="jquery.js"></script>
|
|
<script type="text/javascript" src="dynsections.js"></script>
|
|
<link href="navtree.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="resize.js"></script>
|
|
<script type="text/javascript" src="navtreedata.js"></script>
|
|
<script type="text/javascript" src="navtree.js"></script>
|
|
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="search/searchdata.js"></script>
|
|
<script type="text/javascript" src="search/search.js"></script>
|
|
<link href="doxygen.css" rel="stylesheet" type="text/css" />
|
|
<link href="styleSheet.tmp.css" rel="stylesheet" type="text/css"/>
|
|
</head>
|
|
<body>
|
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
|
<div id="titlearea">
|
|
<table cellspacing="0" cellpadding="0">
|
|
<tbody>
|
|
<tr style="height: 56px;">
|
|
<td id="projectlogo"><img alt="Logo" src="orLogo.png"/></td>
|
|
<td id="projectalign" style="padding-left: 0.5em;">
|
|
<div id="projectname">OR-Tools
|
|
 <span id="projectnumber">9.1</span>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<!-- end header part -->
|
|
<!-- Generated by Doxygen 1.9.2 -->
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
|
|
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
|
|
/* @license-end */
|
|
</script>
|
|
<script type="text/javascript" src="menudata.js"></script>
|
|
<script type="text/javascript" src="menu.js"></script>
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
|
|
$(function() {
|
|
initMenu('',true,false,'search.php','Search');
|
|
$(document).ready(function() { init_search(); });
|
|
});
|
|
/* @license-end */
|
|
</script>
|
|
<div id="main-nav"></div>
|
|
</div><!-- top -->
|
|
<div id="side-nav" class="ui-resizable side-nav-resizable">
|
|
<div id="nav-tree">
|
|
<div id="nav-tree-contents">
|
|
<div id="nav-sync" class="sync"></div>
|
|
</div>
|
|
</div>
|
|
<div id="splitbar" style="-moz-user-select:none;"
|
|
class="ui-resizable-handle">
|
|
</div>
|
|
</div>
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
|
|
$(document).ready(function(){initNavTree('routing_8cc_source.html',''); initResizable(); });
|
|
/* @license-end */
|
|
</script>
|
|
<div id="doc-content">
|
|
<!-- window showing the filter options -->
|
|
<div id="MSearchSelectWindow"
|
|
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
|
</div>
|
|
|
|
<!-- iframe showing the search results (closed by default) -->
|
|
<div id="MSearchResultsWindow">
|
|
<iframe src="javascript:void(0)" frameborder="0"
|
|
name="MSearchResults" id="MSearchResults">
|
|
</iframe>
|
|
</div>
|
|
|
|
<div class="header">
|
|
<div class="headertitle"><div class="title">routing.cc</div></div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
<a href="routing_8cc.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">// Copyright 2010-2021 Google LLC</span></div>
|
|
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment">// Licensed under the Apache License, Version 2.0 (the "License");</span></div>
|
|
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">// you may not use this file except in compliance with the License.</span></div>
|
|
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment">// You may obtain a copy of the License at</span></div>
|
|
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">//</span></div>
|
|
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment">// http://www.apache.org/licenses/LICENSE-2.0</span></div>
|
|
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">//</span></div>
|
|
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment">// Unless required by applicable law or agreed to in writing, software</span></div>
|
|
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">// distributed under the License is distributed on an "AS IS" BASIS,</span></div>
|
|
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment">// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span></div>
|
|
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment">// See the License for the specific language governing permissions and</span></div>
|
|
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment">// limitations under the License.</span></div>
|
|
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> </div>
|
|
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="preprocessor">#include "<a class="code" href="routing_8h.html">ortools/constraint_solver/routing.h</a>"</span></div>
|
|
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
|
|
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#include <limits.h></span></div>
|
|
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> </div>
|
|
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#include <algorithm></span></div>
|
|
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#include <cmath></span></div>
|
|
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#include <cstddef></span></div>
|
|
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#include <cstdint></span></div>
|
|
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#include <cstring></span></div>
|
|
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#include <deque></span></div>
|
|
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#include <functional></span></div>
|
|
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="preprocessor">#include <iterator></span></div>
|
|
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="preprocessor">#include <limits></span></div>
|
|
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="preprocessor">#include <map></span></div>
|
|
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="preprocessor">#include <memory></span></div>
|
|
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="preprocessor">#include <set></span></div>
|
|
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="preprocessor">#include <string></span></div>
|
|
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="preprocessor">#include <tuple></span></div>
|
|
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="preprocessor">#include <type_traits></span></div>
|
|
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="preprocessor">#include <utility></span></div>
|
|
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span><span class="preprocessor">#include <vector></span></div>
|
|
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> </div>
|
|
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span><span class="preprocessor">#include "absl/container/flat_hash_map.h"</span></div>
|
|
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span><span class="preprocessor">#include "absl/container/flat_hash_set.h"</span></div>
|
|
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span><span class="preprocessor">#include "absl/flags/flag.h"</span></div>
|
|
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span><span class="preprocessor">#include "absl/functional/bind_front.h"</span></div>
|
|
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span><span class="preprocessor">#include "absl/memory/memory.h"</span></div>
|
|
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span><span class="preprocessor">#include "absl/meta/type_traits.h"</span></div>
|
|
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span><span class="preprocessor">#include "absl/status/statusor.h"</span></div>
|
|
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span><span class="preprocessor">#include "absl/strings/str_cat.h"</span></div>
|
|
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span><span class="preprocessor">#include "absl/strings/str_format.h"</span></div>
|
|
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span><span class="preprocessor">#include "absl/strings/string_view.h"</span></div>
|
|
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span><span class="preprocessor">#include "absl/time/time.h"</span></div>
|
|
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span><span class="preprocessor">#include "<a class="code" href="int__type_8h.html">ortools/base/int_type.h</a>"</span></div>
|
|
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span><span class="preprocessor">#include "<a class="code" href="integral__types_8h.html">ortools/base/integral_types.h</a>"</span></div>
|
|
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span><span class="preprocessor">#include "<a class="code" href="base_2logging_8h.html">ortools/base/logging.h</a>"</span></div>
|
|
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span><span class="preprocessor">#include "<a class="code" href="map__util_8h.html">ortools/base/map_util.h</a>"</span></div>
|
|
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span><span class="preprocessor">#include "<a class="code" href="mathutil_8h.html">ortools/base/mathutil.h</a>"</span></div>
|
|
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span><span class="preprocessor">#include "<a class="code" href="protoutil_8h.html">ortools/base/protoutil.h</a>"</span></div>
|
|
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span><span class="preprocessor">#include "<a class="code" href="stl__util_8h.html">ortools/base/stl_util.h</a>"</span></div>
|
|
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span><span class="preprocessor">#include "<a class="code" href="strong__vector_8h.html">ortools/base/strong_vector.h</a>"</span></div>
|
|
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span><span class="preprocessor">#include "<a class="code" href="thorough__hash_8h.html">ortools/base/thorough_hash.h</a>"</span></div>
|
|
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span><span class="preprocessor">#include "<a class="code" href="constraint__solver_8h.html">ortools/constraint_solver/constraint_solver.h</a>"</span></div>
|
|
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span><span class="preprocessor">#include "<a class="code" href="constraint__solveri_8h.html">ortools/constraint_solver/constraint_solveri.h</a>"</span></div>
|
|
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span><span class="preprocessor">#include "<a class="code" href="routing__enums_8pb_8h.html">ortools/constraint_solver/routing_enums.pb.h</a>"</span></div>
|
|
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span><span class="preprocessor">#include "<a class="code" href="routing__filters_8h.html">ortools/constraint_solver/routing_filters.h</a>"</span></div>
|
|
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span><span class="preprocessor">#include "<a class="code" href="routing__index__manager_8h.html">ortools/constraint_solver/routing_index_manager.h</a>"</span></div>
|
|
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span><span class="preprocessor">#include "<a class="code" href="routing__lp__scheduling_8h.html">ortools/constraint_solver/routing_lp_scheduling.h</a>"</span></div>
|
|
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span><span class="preprocessor">#include "<a class="code" href="routing__neighborhoods_8h.html">ortools/constraint_solver/routing_neighborhoods.h</a>"</span></div>
|
|
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span><span class="preprocessor">#include "<a class="code" href="routing__parameters_8h.html">ortools/constraint_solver/routing_parameters.h</a>"</span></div>
|
|
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span><span class="preprocessor">#include "<a class="code" href="routing__parameters_8pb_8h.html">ortools/constraint_solver/routing_parameters.pb.h</a>"</span></div>
|
|
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span><span class="preprocessor">#include "<a class="code" href="routing__search_8h.html">ortools/constraint_solver/routing_search.h</a>"</span></div>
|
|
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span><span class="preprocessor">#include "<a class="code" href="routing__types_8h.html">ortools/constraint_solver/routing_types.h</a>"</span></div>
|
|
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span><span class="preprocessor">#include "<a class="code" href="solver__parameters_8pb_8h.html">ortools/constraint_solver/solver_parameters.pb.h</a>"</span></div>
|
|
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span><span class="preprocessor">#include "<a class="code" href="connected__components_8h.html">ortools/graph/connected_components.h</a>"</span></div>
|
|
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span><span class="preprocessor">#include "<a class="code" href="ebert__graph_8h.html">ortools/graph/ebert_graph.h</a>"</span></div>
|
|
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span><span class="preprocessor">#include "<a class="code" href="graph_8h.html">ortools/graph/graph.h</a>"</span></div>
|
|
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span><span class="preprocessor">#include "<a class="code" href="linear__assignment_8h.html">ortools/graph/linear_assignment.h</a>"</span></div>
|
|
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span><span class="preprocessor">#include "<a class="code" href="bitset_8h.html">ortools/util/bitset.h</a>"</span></div>
|
|
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span><span class="preprocessor">#include "<a class="code" href="optional__boolean_8pb_8h.html">ortools/util/optional_boolean.pb.h</a>"</span></div>
|
|
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span><span class="preprocessor">#include "<a class="code" href="piecewise__linear__function_8h.html">ortools/util/piecewise_linear_function.h</a>"</span></div>
|
|
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span><span class="preprocessor">#include "<a class="code" href="range__query__function_8h.html">ortools/util/range_query_function.h</a>"</span></div>
|
|
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span><span class="preprocessor">#include "<a class="code" href="saturated__arithmetic_8h.html">ortools/util/saturated_arithmetic.h</a>"</span></div>
|
|
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span><span class="preprocessor">#include "<a class="code" href="sorted__interval__list_8h.html">ortools/util/sorted_interval_list.h</a>"</span></div>
|
|
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span><span class="preprocessor">#include "<a class="code" href="stats_8h.html">ortools/util/stats.h</a>"</span></div>
|
|
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> </div>
|
|
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceoperations__research.html">operations_research</a> {</div>
|
|
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span><span class="keyword">class </span>Cross;</div>
|
|
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span><span class="keyword">class </span>Exchange;</div>
|
|
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span><span class="keyword">class </span>ExtendedSwapActiveOperator;</div>
|
|
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span><span class="keyword">class </span>LocalSearchPhaseParameters;</div>
|
|
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span><span class="keyword">class </span>MakeActiveAndRelocate;</div>
|
|
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span><span class="keyword">class </span>MakeActiveOperator;</div>
|
|
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span><span class="keyword">class </span>MakeChainInactiveOperator;</div>
|
|
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span><span class="keyword">class </span>MakeInactiveOperator;</div>
|
|
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span><span class="keyword">class </span>Relocate;</div>
|
|
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span><span class="keyword">class </span>RelocateAndMakeActiveOperator;</div>
|
|
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span><span class="keyword">class </span>SwapActiveOperator;</div>
|
|
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span><span class="keyword">class </span>TwoOpt;</div>
|
|
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span>} <span class="comment">// namespace operations_research</span></div>
|
|
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> </div>
|
|
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span><span class="comment">// Trace settings</span></div>
|
|
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> </div>
|
|
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span><span class="comment">// TODO(user): Move most of the following settings to a model parameter</span></div>
|
|
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span><span class="comment">// proto.</span></div>
|
|
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> </div>
|
|
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespaceoperations__research.html">operations_research</a> {</div>
|
|
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> </div>
|
|
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span><span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span><span class="keyword">using</span> ResourceGroup = RoutingModel::ResourceGroup;</div>
|
|
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> </div>
|
|
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span><span class="comment">// A decision builder which tries to assign values to variables as close as</span></div>
|
|
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span><span class="comment">// possible to target values first.</span></div>
|
|
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span><span class="comment">// TODO(user): Move to CP solver.</span></div>
|
|
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span><span class="keyword">class </span>SetValuesFromTargets : <span class="keyword">public</span> DecisionBuilder {</div>
|
|
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> <span class="keyword">public</span>:</div>
|
|
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> SetValuesFromTargets(std::vector<IntVar*> variables,</div>
|
|
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> std::vector<int64_t> targets)</div>
|
|
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> : variables_(<a class="code hl_namespace" href="namespacestd.html">std</a>::move(variables)),</div>
|
|
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> targets_(<a class="code hl_namespace" href="namespacestd.html">std</a>::move(targets)),</div>
|
|
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> index_(0),</div>
|
|
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> steps_(variables_.size(), 0) {</div>
|
|
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> <a class="code hl_define" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(variables_.size(), targets_.size());</div>
|
|
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> }</div>
|
|
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> Decision* Next(Solver* <span class="keyword">const</span> solver)<span class="keyword"> override </span>{</div>
|
|
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> <span class="keywordtype">int</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = index_.Value();</div>
|
|
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> <span class="keywordflow">while</span> (<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < variables_.size() && variables_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>]->Bound()) {</div>
|
|
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> ++<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>;</div>
|
|
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> }</div>
|
|
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> index_.SetValue(solver, <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> >= variables_.size()) <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <span class="keyword">const</span> int64_t variable_min = variables_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>]->Min();</div>
|
|
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> <span class="keyword">const</span> int64_t variable_max = variables_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>]->Max();</div>
|
|
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> <span class="comment">// Target can be before, inside, or after the variable range.</span></div>
|
|
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> <span class="comment">// We do a trichotomy on this for clarity.</span></div>
|
|
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> <span class="keywordflow">if</span> (targets_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>] <= variable_min) {</div>
|
|
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> <span class="keywordflow">return</span> solver->MakeAssignVariableValue(variables_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>], variable_min);</div>
|
|
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (targets_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>] >= variable_max) {</div>
|
|
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> <span class="keywordflow">return</span> solver->MakeAssignVariableValue(variables_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>], variable_max);</div>
|
|
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> int64_t step = steps_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>];</div>
|
|
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> int64_t <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a> = <a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(targets_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>], step);</div>
|
|
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> <span class="comment">// If value is out of variable's range, we can remove the interval of</span></div>
|
|
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> <span class="comment">// values already explored (which can make the solver fail) and</span></div>
|
|
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> <span class="comment">// recall Next() to get back into the trichotomy above.</span></div>
|
|
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a> < variable_min || variable_max < <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>) {</div>
|
|
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> step = GetNextStep(step);</div>
|
|
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a> = <a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(targets_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>], step);</div>
|
|
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <span class="keywordflow">if</span> (step > 0) {</div>
|
|
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <span class="comment">// Values in [variable_min, value) were already explored.</span></div>
|
|
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> variables_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>]->SetMin(<a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>);</div>
|
|
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> <span class="comment">// Values in (value, variable_max] were already explored.</span></div>
|
|
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> variables_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>]->SetMax(<a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>);</div>
|
|
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> }</div>
|
|
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> <span class="keywordflow">return</span> Next(solver);</div>
|
|
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> }</div>
|
|
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> steps_.SetValue(solver, <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>, GetNextStep(step));</div>
|
|
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="keywordflow">return</span> solver->MakeAssignVariableValueOrDoNothing(variables_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>],</div>
|
|
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>);</div>
|
|
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> }</div>
|
|
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> }</div>
|
|
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> </div>
|
|
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> <span class="keyword">private</span>:</div>
|
|
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> int64_t GetNextStep(int64_t step)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> <span class="keywordflow">return</span> (step > 0) ? -step : <a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(1, step);</div>
|
|
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> }</div>
|
|
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> <span class="keyword">const</span> std::vector<IntVar*> variables_;</div>
|
|
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> <span class="keyword">const</span> std::vector<int64_t> targets_;</div>
|
|
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> Rev<int> index_;</div>
|
|
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> RevArray<int64_t> steps_;</div>
|
|
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span>};</div>
|
|
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> </div>
|
|
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span>} <span class="comment">// namespace</span></div>
|
|
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> </div>
|
|
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"><a class="line" href="namespaceoperations__research.html#a7f3c7082ef5ac88b70d3488d5886812a"> 169</a></span><a class="code hl_class" href="classoperations__research_1_1_decision_builder.html">DecisionBuilder</a>* <a class="code hl_function" href="namespaceoperations__research.html#a7f3c7082ef5ac88b70d3488d5886812a">MakeSetValuesFromTargets</a>(<a class="code hl_class" href="classoperations__research_1_1_solver.html">Solver</a>* solver,</div>
|
|
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> std::vector<IntVar*> variables,</div>
|
|
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> std::vector<int64_t> targets) {</div>
|
|
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> <span class="keywordflow">return</span> solver-><a class="code hl_function" href="classoperations__research_1_1_solver.html#af5a1f8b1ea0ab0796c8667b9e2ef0ce7">RevAlloc</a>(</div>
|
|
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> <span class="keyword">new</span> SetValuesFromTargets(std::move(variables), std::move(targets)));</div>
|
|
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span>}</div>
|
|
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> </div>
|
|
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span><span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> </div>
|
|
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span><span class="keywordtype">bool</span> DimensionFixedTransitsEqualTransitEvaluatorForVehicle(</div>
|
|
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> <span class="keyword">const</span> RoutingDimension& dimension, <span class="keywordtype">int</span> vehicle) {</div>
|
|
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> <span class="keyword">const</span> RoutingModel* <span class="keyword">const</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a> = dimension.model();</div>
|
|
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> <span class="keywordtype">int</span> node = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->Start(vehicle);</div>
|
|
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> <span class="keywordflow">while</span> (!<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->IsEnd(node)) {</div>
|
|
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> <span class="keywordflow">if</span> (!<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->NextVar(node)->Bound()) {</div>
|
|
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> }</div>
|
|
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code hl_variable" href="constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599">next</a> = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->NextVar(node)->Value();</div>
|
|
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> <span class="keywordflow">if</span> (dimension.transit_evaluator(vehicle)(node, <a class="code hl_variable" href="constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599">next</a>) !=</div>
|
|
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> dimension.FixedTransitVar(node)->Value()) {</div>
|
|
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> }</div>
|
|
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> node = <a class="code hl_variable" href="constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599">next</a>;</div>
|
|
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> }</div>
|
|
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span>}</div>
|
|
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> </div>
|
|
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span><span class="keywordtype">bool</span> DimensionFixedTransitsEqualTransitEvaluators(</div>
|
|
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> <span class="keyword">const</span> RoutingDimension& dimension) {</div>
|
|
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < dimension.model()->vehicles(); vehicle++) {</div>
|
|
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> <span class="keywordflow">if</span> (!DimensionFixedTransitsEqualTransitEvaluatorForVehicle(dimension,</div>
|
|
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> vehicle)) {</div>
|
|
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> }</div>
|
|
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> }</div>
|
|
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span>}</div>
|
|
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> </div>
|
|
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span><span class="keyword">class </span>SetCumulsFromLocalDimensionCosts : <span class="keyword">public</span> DecisionBuilder {</div>
|
|
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> <span class="keyword">public</span>:</div>
|
|
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> SetCumulsFromLocalDimensionCosts(</div>
|
|
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> <span class="keyword">const</span> std::vector<std::unique_ptr<LocalDimensionCumulOptimizer>>*</div>
|
|
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> local_optimizers,</div>
|
|
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> <span class="keyword">const</span> std::vector<std::unique_ptr<LocalDimensionCumulOptimizer>>*</div>
|
|
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> local_mp_optimizers,</div>
|
|
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> SearchMonitor* monitor, <span class="keywordtype">bool</span> optimize_and_pack = <span class="keyword">false</span>)</div>
|
|
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> : local_optimizers_(*local_optimizers),</div>
|
|
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> local_mp_optimizers_(*local_mp_optimizers),</div>
|
|
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> monitor_(monitor),</div>
|
|
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> optimize_and_pack_(optimize_and_pack) {}</div>
|
|
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> Decision* Next(Solver* <span class="keyword">const</span> solver)<span class="keyword"> override </span>{</div>
|
|
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> <span class="comment">// The following boolean variable indicates if the solver should fail, in</span></div>
|
|
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> <span class="comment">// order to postpone the Fail() call until after the internal for loop, so</span></div>
|
|
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> <span class="comment">// there are no memory leaks related to the cumul_values vector.</span></div>
|
|
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> <span class="keywordtype">bool</span> should_fail = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < local_optimizers_.size(); ++i) {</div>
|
|
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> <span class="keyword">const</span> <span class="keyword">auto</span>& local_optimizer = local_optimizers_[i];</div>
|
|
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> <span class="keyword">const</span> RoutingDimension* <span class="keyword">const</span> dimension = local_optimizer->dimension();</div>
|
|
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> RoutingModel* <span class="keyword">const</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a> = dimension->model();</div>
|
|
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> <span class="keyword">const</span> <span class="keyword">auto</span> <a class="code hl_variable" href="constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599">next</a> = [<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>](int64_t i) {</div>
|
|
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->NextVar(i)->Value();</div>
|
|
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> };</div>
|
|
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> <span class="keyword">const</span> <span class="keyword">auto</span> compute_cumul_values =</div>
|
|
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> [<span class="keyword">this</span>, &<a class="code hl_variable" href="constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599">next</a>](LocalDimensionCumulOptimizer* optimizer, <span class="keywordtype">int</span> vehicle,</div>
|
|
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> std::vector<int64_t>* cumul_values,</div>
|
|
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> std::vector<int64_t>* break_start_end_values) {</div>
|
|
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> <span class="keywordflow">if</span> (optimize_and_pack_) {</div>
|
|
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> <span class="keywordflow">return</span> optimizer->ComputePackedRouteCumuls(</div>
|
|
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> vehicle, <a class="code hl_variable" href="constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599">next</a>, cumul_values, break_start_end_values);</div>
|
|
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> <span class="keywordflow">return</span> optimizer->ComputeRouteCumuls(vehicle, <a class="code hl_variable" href="constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599">next</a>, cumul_values,</div>
|
|
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> break_start_end_values);</div>
|
|
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> }</div>
|
|
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> };</div>
|
|
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->vehicles(); ++vehicle) {</div>
|
|
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> <span class="comment">// TODO(user): Investigate if we should skip unused vehicles.</span></div>
|
|
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(DimensionFixedTransitsEqualTransitEvaluatorForVehicle(*dimension,</div>
|
|
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> vehicle));</div>
|
|
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> vehicle_has_break_constraint =</div>
|
|
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span> dimension->HasBreakConstraints() &&</div>
|
|
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> !dimension->GetBreakIntervalsOfVehicle(vehicle).empty();</div>
|
|
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> LocalDimensionCumulOptimizer* <span class="keyword">const</span> optimizer =</div>
|
|
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> vehicle_has_break_constraint ? local_mp_optimizers_[i].get()</div>
|
|
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> : local_optimizer.get();</div>
|
|
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(optimizer != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> std::vector<int64_t> cumul_values;</div>
|
|
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> std::vector<int64_t> break_start_end_values;</div>
|
|
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> <span class="keyword">const</span> <a class="code hl_enumeration" href="namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8">DimensionSchedulingStatus</a> status = compute_cumul_values(</div>
|
|
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> optimizer, vehicle, &cumul_values, &break_start_end_values);</div>
|
|
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> <span class="keywordflow">if</span> (status == <a class="code hl_enumvalue" href="namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8a6faaca695f728b47f47dd389f31e4a93">DimensionSchedulingStatus::INFEASIBLE</a>) {</div>
|
|
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> should_fail = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> }</div>
|
|
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> <span class="comment">// If relaxation is not feasible, try the MILP optimizer.</span></div>
|
|
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> <span class="keywordflow">if</span> (status == <a class="code hl_enumvalue" href="namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8af8cfb2115ef7ab822bca8edd1edac285">DimensionSchedulingStatus::RELAXED_OPTIMAL_ONLY</a>) {</div>
|
|
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> cumul_values.clear();</div>
|
|
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> break_start_end_values.clear();</div>
|
|
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(local_mp_optimizers_[i] != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> <span class="keywordflow">if</span> (compute_cumul_values(local_mp_optimizers_[i].get(), vehicle,</div>
|
|
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> &cumul_values, &break_start_end_values) ==</div>
|
|
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> <a class="code hl_enumvalue" href="namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8a6faaca695f728b47f47dd389f31e4a93">DimensionSchedulingStatus::INFEASIBLE</a>) {</div>
|
|
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> should_fail = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> }</div>
|
|
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(status == <a class="code hl_enumvalue" href="namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8af00c8dbdd6e1f11bdae06be94277d293">DimensionSchedulingStatus::OPTIMAL</a>);</div>
|
|
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> }</div>
|
|
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> <span class="comment">// Concatenate cumul_values and break_start_end_values into cp_values,</span></div>
|
|
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> <span class="comment">// generate corresponding cp_variables vector.</span></div>
|
|
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> std::vector<IntVar*> cp_variables;</div>
|
|
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> std::vector<int64_t> cp_values;</div>
|
|
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> <a class="code hl_function" href="namespaceoperations__research_1_1math__opt.html#a5de89a1f6e3f80a49a0d76136d8044e2">std::swap</a>(cp_values, cumul_values);</div>
|
|
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> {</div>
|
|
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> <span class="keywordtype">int</span> current = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->Start(vehicle);</div>
|
|
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> <span class="keywordflow">while</span> (<span class="keyword">true</span>) {</div>
|
|
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> cp_variables.push_back(dimension->CumulVar(current));</div>
|
|
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> <span class="keywordflow">if</span> (!<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->IsEnd(current)) {</div>
|
|
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> current = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->NextVar(current)->Value();</div>
|
|
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> }</div>
|
|
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> }</div>
|
|
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span> }</div>
|
|
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> <span class="comment">// Setting the cumuls of path start/end first is more efficient than</span></div>
|
|
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> <span class="comment">// setting the cumuls in order of path appearance, because setting start</span></div>
|
|
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> <span class="comment">// and end cumuls gives an opportunity to fix all cumuls with two</span></div>
|
|
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> <span class="comment">// decisions instead of |path| decisions.</span></div>
|
|
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span> <span class="comment">// To this effect, we put end cumul just after the start cumul.</span></div>
|
|
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span> <a class="code hl_function" href="namespaceoperations__research_1_1math__opt.html#a5de89a1f6e3f80a49a0d76136d8044e2">std::swap</a>(cp_variables[1], cp_variables.back());</div>
|
|
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span> <a class="code hl_function" href="namespaceoperations__research_1_1math__opt.html#a5de89a1f6e3f80a49a0d76136d8044e2">std::swap</a>(cp_values[1], cp_values.back());</div>
|
|
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span> <span class="keywordflow">if</span> (dimension->HasBreakConstraints()) {</div>
|
|
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span> <span class="keywordflow">for</span> (IntervalVar* <a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a> :</div>
|
|
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span> dimension->GetBreakIntervalsOfVehicle(vehicle)) {</div>
|
|
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span> cp_variables.push_back(<a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>->SafeStartExpr(0)->Var());</div>
|
|
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span> cp_variables.push_back(<a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>->SafeEndExpr(0)->Var());</div>
|
|
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span> }</div>
|
|
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> cp_values.insert(cp_values.end(), break_start_end_values.begin(),</div>
|
|
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> break_start_end_values.end());</div>
|
|
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> }</div>
|
|
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> <span class="comment">// Value kint64min signals an unoptimized variable, set to min instead.</span></div>
|
|
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < cp_values.size(); ++i) {</div>
|
|
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> <span class="keywordflow">if</span> (cp_values[i] == <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits<int64_t>::min</a>()) {</div>
|
|
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> cp_values[i] = cp_variables[i]->Min();</div>
|
|
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> }</div>
|
|
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> }</div>
|
|
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> <span class="keywordflow">if</span> (!solver->SolveAndCommit(</div>
|
|
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> <a class="code hl_function" href="namespaceoperations__research.html#a7f3c7082ef5ac88b70d3488d5886812a">MakeSetValuesFromTargets</a>(solver, std::move(cp_variables),</div>
|
|
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> std::move(cp_values)),</div>
|
|
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> monitor_)) {</div>
|
|
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> should_fail = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> }</div>
|
|
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> }</div>
|
|
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> <span class="keywordflow">if</span> (should_fail) {</div>
|
|
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> solver->Fail();</div>
|
|
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> }</div>
|
|
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> }</div>
|
|
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> }</div>
|
|
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> </div>
|
|
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> <span class="keyword">private</span>:</div>
|
|
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> <span class="keyword">const</span> std::vector<std::unique_ptr<LocalDimensionCumulOptimizer>>&</div>
|
|
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> local_optimizers_;</div>
|
|
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> <span class="keyword">const</span> std::vector<std::unique_ptr<LocalDimensionCumulOptimizer>>&</div>
|
|
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> local_mp_optimizers_;</div>
|
|
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> SearchMonitor* <span class="keyword">const</span> monitor_;</div>
|
|
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> optimize_and_pack_;</div>
|
|
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span>};</div>
|
|
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> </div>
|
|
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span><span class="keyword">class </span>SetCumulsFromGlobalDimensionCosts : <span class="keyword">public</span> DecisionBuilder {</div>
|
|
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> <span class="keyword">public</span>:</div>
|
|
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> SetCumulsFromGlobalDimensionCosts(</div>
|
|
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span> <span class="keyword">const</span> std::vector<std::unique_ptr<GlobalDimensionCumulOptimizer>>*</div>
|
|
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> global_optimizers,</div>
|
|
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span> <span class="keyword">const</span> std::vector<std::unique_ptr<GlobalDimensionCumulOptimizer>>*</div>
|
|
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> global_mp_optimizers,</div>
|
|
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> SearchMonitor* monitor, <span class="keywordtype">bool</span> optimize_and_pack = <span class="keyword">false</span>)</div>
|
|
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> : global_optimizers_(*global_optimizers),</div>
|
|
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span> global_mp_optimizers_(*global_mp_optimizers),</div>
|
|
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> monitor_(monitor),</div>
|
|
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span> optimize_and_pack_(optimize_and_pack) {}</div>
|
|
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span> Decision* Next(Solver* <span class="keyword">const</span> solver)<span class="keyword"> override </span>{</div>
|
|
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span> <span class="comment">// The following boolean variable indicates if the solver should fail, in</span></div>
|
|
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span> <span class="comment">// order to postpone the Fail() call until after the for loop, so there are</span></div>
|
|
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span> <span class="comment">// no memory leaks related to the cumul_values vector.</span></div>
|
|
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> <span class="keywordtype">bool</span> should_fail = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < global_optimizers_.size(); ++i) {</div>
|
|
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span> <span class="keyword">const</span> <span class="keyword">auto</span>& global_optimizer = global_optimizers_[i];</div>
|
|
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> <span class="keyword">const</span> RoutingDimension* dimension = global_optimizer->dimension();</div>
|
|
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span> RoutingModel* <span class="keyword">const</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a> = dimension->model();</div>
|
|
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span> </div>
|
|
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span> <span class="keyword">const</span> <span class="keyword">auto</span> <a class="code hl_variable" href="constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599">next</a> = [<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>](int64_t i) {</div>
|
|
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->NextVar(i)->Value();</div>
|
|
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span> };</div>
|
|
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span> </div>
|
|
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(DimensionFixedTransitsEqualTransitEvaluators(*dimension));</div>
|
|
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span> </div>
|
|
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span> std::vector<int64_t> cumul_values;</div>
|
|
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span> std::vector<int64_t> break_start_end_values;</div>
|
|
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"> 368</span> <span class="keyword">const</span> <a class="code hl_enumeration" href="namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8">DimensionSchedulingStatus</a> status =</div>
|
|
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"> 369</span> optimize_and_pack_</div>
|
|
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"> 370</span> ? global_optimizer->ComputePackedCumuls(<a class="code hl_variable" href="constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599">next</a>, &cumul_values,</div>
|
|
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno"> 371</span> &break_start_end_values)</div>
|
|
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"> 372</span> : global_optimizer->ComputeCumuls(<a class="code hl_variable" href="constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599">next</a>, &cumul_values,</div>
|
|
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"> 373</span> &break_start_end_values);</div>
|
|
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno"> 374</span> <span class="keywordflow">if</span> (status == <a class="code hl_enumvalue" href="namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8a6faaca695f728b47f47dd389f31e4a93">DimensionSchedulingStatus::INFEASIBLE</a>) {</div>
|
|
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"> 375</span> should_fail = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span> }</div>
|
|
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span> <span class="comment">// If relaxation is not feasible, try the MILP optimizer.</span></div>
|
|
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span> <span class="keywordflow">if</span> (status == <a class="code hl_enumvalue" href="namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8af8cfb2115ef7ab822bca8edd1edac285">DimensionSchedulingStatus::RELAXED_OPTIMAL_ONLY</a>) {</div>
|
|
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span> cumul_values.clear();</div>
|
|
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span> break_start_end_values.clear();</div>
|
|
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(global_mp_optimizers_[i] != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span> <span class="keyword">const</span> <a class="code hl_enumeration" href="namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8">DimensionSchedulingStatus</a> mp_status =</div>
|
|
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span> optimize_and_pack_</div>
|
|
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span> ? global_mp_optimizers_[i]->ComputePackedCumuls(</div>
|
|
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span> <a class="code hl_variable" href="constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599">next</a>, &cumul_values, &break_start_end_values)</div>
|
|
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span> : global_mp_optimizers_[i]->ComputeCumuls(</div>
|
|
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span> <a class="code hl_variable" href="constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599">next</a>, &cumul_values, &break_start_end_values);</div>
|
|
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span> <span class="keywordflow">if</span> (mp_status != <a class="code hl_enumvalue" href="namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8af00c8dbdd6e1f11bdae06be94277d293">DimensionSchedulingStatus::OPTIMAL</a>) {</div>
|
|
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span> should_fail = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l00392" name="l00392"></a><span class="lineno"> 392</span> }</div>
|
|
<div class="line"><a id="l00393" name="l00393"></a><span class="lineno"> 393</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l00394" name="l00394"></a><span class="lineno"> 394</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(status == <a class="code hl_enumvalue" href="namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8af00c8dbdd6e1f11bdae06be94277d293">DimensionSchedulingStatus::OPTIMAL</a>);</div>
|
|
<div class="line"><a id="l00395" name="l00395"></a><span class="lineno"> 395</span> }</div>
|
|
<div class="line"><a id="l00396" name="l00396"></a><span class="lineno"> 396</span> <span class="comment">// Concatenate cumul_values and break_start_end_values into cp_values,</span></div>
|
|
<div class="line"><a id="l00397" name="l00397"></a><span class="lineno"> 397</span> <span class="comment">// generate corresponding cp_variables vector.</span></div>
|
|
<div class="line"><a id="l00398" name="l00398"></a><span class="lineno"> 398</span> std::vector<IntVar*> cp_variables = dimension->cumuls();</div>
|
|
<div class="line"><a id="l00399" name="l00399"></a><span class="lineno"> 399</span> std::vector<int64_t> cp_values;</div>
|
|
<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"> 400</span> <a class="code hl_function" href="namespaceoperations__research_1_1math__opt.html#a5de89a1f6e3f80a49a0d76136d8044e2">std::swap</a>(cp_values, cumul_values);</div>
|
|
<div class="line"><a id="l00401" name="l00401"></a><span class="lineno"> 401</span> <span class="keywordflow">if</span> (dimension->HasBreakConstraints()) {</div>
|
|
<div class="line"><a id="l00402" name="l00402"></a><span class="lineno"> 402</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_vehicles = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->vehicles();</div>
|
|
<div class="line"><a id="l00403" name="l00403"></a><span class="lineno"> 403</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < num_vehicles; ++vehicle) {</div>
|
|
<div class="line"><a id="l00404" name="l00404"></a><span class="lineno"> 404</span> <span class="keywordflow">for</span> (IntervalVar* <a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a> :</div>
|
|
<div class="line"><a id="l00405" name="l00405"></a><span class="lineno"> 405</span> dimension->GetBreakIntervalsOfVehicle(vehicle)) {</div>
|
|
<div class="line"><a id="l00406" name="l00406"></a><span class="lineno"> 406</span> cp_variables.push_back(<a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>->SafeStartExpr(0)->Var());</div>
|
|
<div class="line"><a id="l00407" name="l00407"></a><span class="lineno"> 407</span> cp_variables.push_back(<a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>->SafeEndExpr(0)->Var());</div>
|
|
<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span> }</div>
|
|
<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"> 409</span> }</div>
|
|
<div class="line"><a id="l00410" name="l00410"></a><span class="lineno"> 410</span> cp_values.insert(cp_values.end(), break_start_end_values.begin(),</div>
|
|
<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"> 411</span> break_start_end_values.end());</div>
|
|
<div class="line"><a id="l00412" name="l00412"></a><span class="lineno"> 412</span> }</div>
|
|
<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"> 413</span> <span class="comment">// Value kint64min signals an unoptimized variable, set to min instead.</span></div>
|
|
<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"> 414</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < cp_values.size(); ++i) {</div>
|
|
<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span> <span class="keywordflow">if</span> (cp_values[i] == <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits<int64_t>::min</a>()) {</div>
|
|
<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"> 416</span> cp_values[i] = cp_variables[i]->Min();</div>
|
|
<div class="line"><a id="l00417" name="l00417"></a><span class="lineno"> 417</span> }</div>
|
|
<div class="line"><a id="l00418" name="l00418"></a><span class="lineno"> 418</span> }</div>
|
|
<div class="line"><a id="l00419" name="l00419"></a><span class="lineno"> 419</span> <span class="keywordflow">if</span> (!solver->SolveAndCommit(</div>
|
|
<div class="line"><a id="l00420" name="l00420"></a><span class="lineno"> 420</span> <a class="code hl_function" href="namespaceoperations__research.html#a7f3c7082ef5ac88b70d3488d5886812a">MakeSetValuesFromTargets</a>(solver, std::move(cp_variables),</div>
|
|
<div class="line"><a id="l00421" name="l00421"></a><span class="lineno"> 421</span> std::move(cp_values)),</div>
|
|
<div class="line"><a id="l00422" name="l00422"></a><span class="lineno"> 422</span> monitor_)) {</div>
|
|
<div class="line"><a id="l00423" name="l00423"></a><span class="lineno"> 423</span> should_fail = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"> 424</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l00425" name="l00425"></a><span class="lineno"> 425</span> }</div>
|
|
<div class="line"><a id="l00426" name="l00426"></a><span class="lineno"> 426</span> }</div>
|
|
<div class="line"><a id="l00427" name="l00427"></a><span class="lineno"> 427</span> <span class="keywordflow">if</span> (should_fail) {</div>
|
|
<div class="line"><a id="l00428" name="l00428"></a><span class="lineno"> 428</span> solver->Fail();</div>
|
|
<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"> 429</span> }</div>
|
|
<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"> 430</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span> }</div>
|
|
<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</span> </div>
|
|
<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"> 433</span> <span class="keyword">private</span>:</div>
|
|
<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"> 434</span> <span class="keyword">const</span> std::vector<std::unique_ptr<GlobalDimensionCumulOptimizer>>&</div>
|
|
<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"> 435</span> global_optimizers_;</div>
|
|
<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span> <span class="keyword">const</span> std::vector<std::unique_ptr<GlobalDimensionCumulOptimizer>>&</div>
|
|
<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span> global_mp_optimizers_;</div>
|
|
<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span> SearchMonitor* <span class="keyword">const</span> monitor_;</div>
|
|
<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> optimize_and_pack_;</div>
|
|
<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"> 440</span>};</div>
|
|
<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span> </div>
|
|
<div class="line"><a id="l00442" name="l00442"></a><span class="lineno"> 442</span>} <span class="comment">// namespace</span></div>
|
|
<div class="line"><a id="l00443" name="l00443"></a><span class="lineno"> 443</span> </div>
|
|
<div class="line"><a id="l00444" name="l00444"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a90c35f02b0901acc9822020297e313e7"> 444</a></span><span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a90c35f02b0901acc9822020297e313e7">RoutingModel::PackCumulsOfOptimizerDimensionsFromAssignment</a>(</div>
|
|
<div class="line"><a id="l00445" name="l00445"></a><span class="lineno"> 445</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* original_assignment, absl::Duration duration_limit) {</div>
|
|
<div class="line"><a id="l00446" name="l00446"></a><span class="lineno"> 446</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(closed_);</div>
|
|
<div class="line"><a id="l00447" name="l00447"></a><span class="lineno"> 447</span> <span class="keywordflow">if</span> (original_assignment == <span class="keyword">nullptr</span>) <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l00448" name="l00448"></a><span class="lineno"> 448</span> <span class="keywordflow">if</span> (duration_limit <= absl::ZeroDuration()) <span class="keywordflow">return</span> original_assignment;</div>
|
|
<div class="line"><a id="l00449" name="l00449"></a><span class="lineno"> 449</span> <span class="keywordflow">if</span> (global_dimension_optimizers_.empty() &&</div>
|
|
<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</span> local_dimension_optimizers_.empty()) {</div>
|
|
<div class="line"><a id="l00451" name="l00451"></a><span class="lineno"> 451</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(local_dimension_mp_optimizers_.empty());</div>
|
|
<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span> <span class="keywordflow">return</span> original_assignment;</div>
|
|
<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span> }</div>
|
|
<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span> <a class="code hl_class" href="classoperations__research_1_1_regular_limit.html">RegularLimit</a>* <span class="keyword">const</span> limit = GetOrCreateLimit();</div>
|
|
<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span> limit-><a class="code hl_function" href="classoperations__research_1_1_regular_limit.html#a31c8a0b81a7b1d7ebccff84666901671">UpdateLimits</a>(duration_limit, <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(),</div>
|
|
<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(),</div>
|
|
<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>());</div>
|
|
<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span> </div>
|
|
<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span> <span class="comment">// Initialize the packed_assignment with the Next values in the</span></div>
|
|
<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span> <span class="comment">// original_assignment.</span></div>
|
|
<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* packed_assignment = solver_->MakeAssignment();</div>
|
|
<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span> packed_assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb">Add</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a911482cb7495f22638a02066adf13c8b">Nexts</a>());</div>
|
|
<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"> 463</span> packed_assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#aad86dd69d5664ce8e16198be929fd941">CopyIntersection</a>(original_assignment);</div>
|
|
<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> </div>
|
|
<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"> 465</span> std::vector<DecisionBuilder*> decision_builders;</div>
|
|
<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span> decision_builders.push_back(solver_->MakeRestoreAssignment(preassignment_));</div>
|
|
<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span> decision_builders.push_back(</div>
|
|
<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"> 468</span> solver_->MakeRestoreAssignment(packed_assignment));</div>
|
|
<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span> decision_builders.push_back(</div>
|
|
<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span> solver_->RevAlloc(<span class="keyword">new</span> SetCumulsFromLocalDimensionCosts(</div>
|
|
<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"> 471</span> &local_dimension_optimizers_, &local_dimension_mp_optimizers_,</div>
|
|
<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span> GetOrCreateLargeNeighborhoodSearchLimit(),</div>
|
|
<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span> <span class="comment">/*optimize_and_pack=*/</span><span class="keyword">true</span>)));</div>
|
|
<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"> 474</span> decision_builders.push_back(</div>
|
|
<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span> solver_->RevAlloc(<span class="keyword">new</span> SetCumulsFromGlobalDimensionCosts(</div>
|
|
<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span> &global_dimension_optimizers_, &global_dimension_mp_optimizers_,</div>
|
|
<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span> GetOrCreateLargeNeighborhoodSearchLimit(),</div>
|
|
<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</span> <span class="comment">/*optimize_and_pack=*/</span><span class="keyword">true</span>)));</div>
|
|
<div class="line"><a id="l00479" name="l00479"></a><span class="lineno"> 479</span> decision_builders.push_back(</div>
|
|
<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"> 480</span> CreateFinalizerForMinimizedAndMaximizedVariables());</div>
|
|
<div class="line"><a id="l00481" name="l00481"></a><span class="lineno"> 481</span> </div>
|
|
<div class="line"><a id="l00482" name="l00482"></a><span class="lineno"> 482</span> <a class="code hl_class" href="classoperations__research_1_1_decision_builder.html">DecisionBuilder</a>* restore_pack_and_finalize =</div>
|
|
<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"> 483</span> solver_->Compose(decision_builders);</div>
|
|
<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"> 484</span> solver_->Solve(restore_pack_and_finalize,</div>
|
|
<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"> 485</span> packed_dimensions_assignment_collector_, limit);</div>
|
|
<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"> 486</span> </div>
|
|
<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"> 487</span> <span class="keywordflow">if</span> (packed_dimensions_assignment_collector_-><a class="code hl_function" href="classoperations__research_1_1_solution_collector.html#a5aeabb40e6e7550c805534764b3076fa">solution_count</a>() != 1) {</div>
|
|
<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"> 488</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67">ERROR</a>) << <span class="stringliteral">"The given assignment is not valid for this model, or cannot "</span></div>
|
|
<div class="line"><a id="l00489" name="l00489"></a><span class="lineno"> 489</span> <span class="stringliteral">"be packed."</span>;</div>
|
|
<div class="line"><a id="l00490" name="l00490"></a><span class="lineno"> 490</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"> 491</span> }</div>
|
|
<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"> 492</span> </div>
|
|
<div class="line"><a id="l00493" name="l00493"></a><span class="lineno"> 493</span> packed_assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#ac97eab84adb6cc33ae0124c944a4f8c7">Copy</a>(original_assignment);</div>
|
|
<div class="line"><a id="l00494" name="l00494"></a><span class="lineno"> 494</span> packed_assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#aad86dd69d5664ce8e16198be929fd941">CopyIntersection</a>(</div>
|
|
<div class="line"><a id="l00495" name="l00495"></a><span class="lineno"> 495</span> packed_dimensions_assignment_collector_-><a class="code hl_function" href="classoperations__research_1_1_solution_collector.html#a97be81e7520315f04f648537dd06bff5">solution</a>(0));</div>
|
|
<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span> </div>
|
|
<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"> 497</span> <span class="keywordflow">return</span> packed_assignment;</div>
|
|
<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"> 498</span>}</div>
|
|
<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"> 499</span> </div>
|
|
<div class="line"><a id="l00500" name="l00500"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a700982f228080c6278eb5a2f7f06f31d"> 500</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a700982f228080c6278eb5a2f7f06f31d">RoutingModel::SetSweepArranger</a>(<a class="code hl_class" href="classoperations__research_1_1_sweep_arranger.html">SweepArranger</a>* sweep_arranger) {</div>
|
|
<div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span> sweep_arranger_.reset(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a641eb9492d9e1682b05fd882635fcfd7">sweep_arranger</a>);</div>
|
|
<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span>}</div>
|
|
<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span> </div>
|
|
<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a641eb9492d9e1682b05fd882635fcfd7"> 504</a></span><a class="code hl_class" href="classoperations__research_1_1_sweep_arranger.html">SweepArranger</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a641eb9492d9e1682b05fd882635fcfd7">RoutingModel::sweep_arranger</a>()<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span> <span class="keywordflow">return</span> sweep_arranger_.get();</div>
|
|
<div class="line"><a id="l00506" name="l00506"></a><span class="lineno"> 506</span>}</div>
|
|
<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</span> </div>
|
|
<div class="line"><a id="l00508" name="l00508"></a><span class="lineno"> 508</span><span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span><span class="comment">// Constraint which ensures that var != values.</span></div>
|
|
<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span><span class="keyword">class </span>DifferentFromValues : <span class="keyword">public</span> <a class="code hl_class" href="classoperations__research_1_1_constraint.html">Constraint</a> {</div>
|
|
<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span> <span class="keyword">public</span>:</div>
|
|
<div class="line"><a id="l00512" name="l00512"></a><span class="lineno"> 512</span> DifferentFromValues(<a class="code hl_class" href="classoperations__research_1_1_solver.html">Solver</a>* solver, <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, std::vector<int64_t> values)</div>
|
|
<div class="line"><a id="l00513" name="l00513"></a><span class="lineno"> 513</span> : <a class="code hl_class" href="classoperations__research_1_1_constraint.html">Constraint</a>(solver), var_(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>), values_(<a class="code hl_namespace" href="namespacestd.html">std</a>::move(values)) {}</div>
|
|
<div class="line"><a id="l00514" name="l00514"></a><span class="lineno"> 514</span> <span class="keywordtype">void</span> Post()<span class="keyword"> override </span>{}</div>
|
|
<div class="line"><a id="l00515" name="l00515"></a><span class="lineno"> 515</span> <span class="keywordtype">void</span> InitialPropagate()<span class="keyword"> override </span>{ var_->RemoveValues(values_); }</div>
|
|
<div class="line"><a id="l00516" name="l00516"></a><span class="lineno"> 516</span> std::string DebugString()<span class="keyword"> const override </span>{ <span class="keywordflow">return</span> <span class="stringliteral">"DifferentFromValues"</span>; }</div>
|
|
<div class="line"><a id="l00517" name="l00517"></a><span class="lineno"> 517</span> <span class="keywordtype">void</span> Accept(ModelVisitor* <span class="keyword">const</span> visitor)<span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span> visitor->BeginVisitConstraint(<a class="code hl_variable" href="classoperations__research_1_1_routing_model_visitor.html#a22cceffdff8afb41f5d2422ed014d4d0">RoutingModelVisitor::kRemoveValues</a>, <span class="keyword">this</span>);</div>
|
|
<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"> 519</span> visitor->VisitIntegerVariableArrayArgument(<a class="code hl_variable" href="classoperations__research_1_1_model_visitor.html#aa9175e7f7c9d2598d26293435ecd89ce">ModelVisitor::kVarsArgument</a>,</div>
|
|
<div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span> {var_});</div>
|
|
<div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</span> visitor->VisitIntegerArrayArgument(<a class="code hl_variable" href="classoperations__research_1_1_model_visitor.html#adc9534f3f00f5aa6046609988d38967b">ModelVisitor::kValuesArgument</a>, values_);</div>
|
|
<div class="line"><a id="l00522" name="l00522"></a><span class="lineno"> 522</span> visitor->EndVisitConstraint(<a class="code hl_variable" href="classoperations__research_1_1_routing_model_visitor.html#a22cceffdff8afb41f5d2422ed014d4d0">RoutingModelVisitor::kRemoveValues</a>, <span class="keyword">this</span>);</div>
|
|
<div class="line"><a id="l00523" name="l00523"></a><span class="lineno"> 523</span> }</div>
|
|
<div class="line"><a id="l00524" name="l00524"></a><span class="lineno"> 524</span> </div>
|
|
<div class="line"><a id="l00525" name="l00525"></a><span class="lineno"> 525</span> <span class="keyword">private</span>:</div>
|
|
<div class="line"><a id="l00526" name="l00526"></a><span class="lineno"> 526</span> IntVar* <span class="keyword">const</span> var_;</div>
|
|
<div class="line"><a id="l00527" name="l00527"></a><span class="lineno"> 527</span> <span class="keyword">const</span> std::vector<int64_t> values_;</div>
|
|
<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"> 528</span>};</div>
|
|
<div class="line"><a id="l00529" name="l00529"></a><span class="lineno"> 529</span> </div>
|
|
<div class="line"><a id="l00530" name="l00530"></a><span class="lineno"> 530</span><span class="comment">// Set of "light" constraints, well-suited for use within Local Search.</span></div>
|
|
<div class="line"><a id="l00531" name="l00531"></a><span class="lineno"> 531</span><span class="comment">// These constraints are "checking" constraints, only triggered on WhenBound</span></div>
|
|
<div class="line"><a id="l00532" name="l00532"></a><span class="lineno"> 532</span><span class="comment">// events. The provide very little (or no) domain filtering.</span></div>
|
|
<div class="line"><a id="l00533" name="l00533"></a><span class="lineno"> 533</span><span class="comment">// TODO(user): Move to core constraintsolver library.</span></div>
|
|
<div class="line"><a id="l00534" name="l00534"></a><span class="lineno"> 534</span> </div>
|
|
<div class="line"><a id="l00535" name="l00535"></a><span class="lineno"> 535</span><span class="comment">// Light one-dimension function-based element constraint ensuring:</span></div>
|
|
<div class="line"><a id="l00536" name="l00536"></a><span class="lineno"> 536</span><span class="comment">// var == values(index).</span></div>
|
|
<div class="line"><a id="l00537" name="l00537"></a><span class="lineno"> 537</span><span class="comment">// Doesn't perform bound reduction of the resulting variable until the index</span></div>
|
|
<div class="line"><a id="l00538" name="l00538"></a><span class="lineno"> 538</span><span class="comment">// variable is bound.</span></div>
|
|
<div class="line"><a id="l00539" name="l00539"></a><span class="lineno"> 539</span><span class="comment">// If deep_serialize returns false, the model visitor will not extract all</span></div>
|
|
<div class="line"><a id="l00540" name="l00540"></a><span class="lineno"> 540</span><span class="comment">// possible values from the values function.</span></div>
|
|
<div class="line"><a id="l00541" name="l00541"></a><span class="lineno"> 541</span><span class="keyword">template</span> <<span class="keyword">typename</span> F></div>
|
|
<div class="line"><a id="l00542" name="l00542"></a><span class="lineno"> 542</span><span class="keyword">class </span>LightFunctionElementConstraint : <span class="keyword">public</span> Constraint {</div>
|
|
<div class="line"><a id="l00543" name="l00543"></a><span class="lineno"> 543</span> <span class="keyword">public</span>:</div>
|
|
<div class="line"><a id="l00544" name="l00544"></a><span class="lineno"> 544</span> LightFunctionElementConstraint(Solver* <span class="keyword">const</span> solver, IntVar* <span class="keyword">const</span> <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>,</div>
|
|
<div class="line"><a id="l00545" name="l00545"></a><span class="lineno"> 545</span> IntVar* <span class="keyword">const</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>, F values,</div>
|
|
<div class="line"><a id="l00546" name="l00546"></a><span class="lineno"> 546</span> std::function<<span class="keywordtype">bool</span>()> deep_serialize)</div>
|
|
<div class="line"><a id="l00547" name="l00547"></a><span class="lineno"> 547</span> : Constraint(solver),</div>
|
|
<div class="line"><a id="l00548" name="l00548"></a><span class="lineno"> 548</span> var_(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>),</div>
|
|
<div class="line"><a id="l00549" name="l00549"></a><span class="lineno"> 549</span> index_(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>),</div>
|
|
<div class="line"><a id="l00550" name="l00550"></a><span class="lineno"> 550</span> values_(<a class="code hl_namespace" href="namespacestd.html">std</a>::move(values)),</div>
|
|
<div class="line"><a id="l00551" name="l00551"></a><span class="lineno"> 551</span> deep_serialize_(<a class="code hl_namespace" href="namespacestd.html">std</a>::move(deep_serialize)) {}</div>
|
|
<div class="line"><a id="l00552" name="l00552"></a><span class="lineno"> 552</span> ~LightFunctionElementConstraint()<span class="keyword"> override </span>{}</div>
|
|
<div class="line"><a id="l00553" name="l00553"></a><span class="lineno"> 553</span> </div>
|
|
<div class="line"><a id="l00554" name="l00554"></a><span class="lineno"> 554</span> <span class="keywordtype">void</span> Post()<span class="keyword"> override </span>{</div>
|
|
<div class="line"><a id="l00555" name="l00555"></a><span class="lineno"> 555</span> Demon* demon = <a class="code hl_function" href="namespaceoperations__research.html#aa213d8f884283e0d72712243cbbefa7c">MakeConstraintDemon0</a>(</div>
|
|
<div class="line"><a id="l00556" name="l00556"></a><span class="lineno"> 556</span> solver(), <span class="keyword">this</span>, &LightFunctionElementConstraint::IndexBound,</div>
|
|
<div class="line"><a id="l00557" name="l00557"></a><span class="lineno"> 557</span> <span class="stringliteral">"IndexBound"</span>);</div>
|
|
<div class="line"><a id="l00558" name="l00558"></a><span class="lineno"> 558</span> index_->WhenBound(demon);</div>
|
|
<div class="line"><a id="l00559" name="l00559"></a><span class="lineno"> 559</span> }</div>
|
|
<div class="line"><a id="l00560" name="l00560"></a><span class="lineno"> 560</span> </div>
|
|
<div class="line"><a id="l00561" name="l00561"></a><span class="lineno"> 561</span> <span class="keywordtype">void</span> InitialPropagate()<span class="keyword"> override </span>{</div>
|
|
<div class="line"><a id="l00562" name="l00562"></a><span class="lineno"> 562</span> <span class="keywordflow">if</span> (index_->Bound()) {</div>
|
|
<div class="line"><a id="l00563" name="l00563"></a><span class="lineno"> 563</span> IndexBound();</div>
|
|
<div class="line"><a id="l00564" name="l00564"></a><span class="lineno"> 564</span> }</div>
|
|
<div class="line"><a id="l00565" name="l00565"></a><span class="lineno"> 565</span> }</div>
|
|
<div class="line"><a id="l00566" name="l00566"></a><span class="lineno"> 566</span> </div>
|
|
<div class="line"><a id="l00567" name="l00567"></a><span class="lineno"> 567</span> std::string DebugString()<span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a id="l00568" name="l00568"></a><span class="lineno"> 568</span> <span class="keywordflow">return</span> <span class="stringliteral">"LightFunctionElementConstraint"</span>;</div>
|
|
<div class="line"><a id="l00569" name="l00569"></a><span class="lineno"> 569</span> }</div>
|
|
<div class="line"><a id="l00570" name="l00570"></a><span class="lineno"> 570</span> </div>
|
|
<div class="line"><a id="l00571" name="l00571"></a><span class="lineno"> 571</span> <span class="keywordtype">void</span> Accept(ModelVisitor* <span class="keyword">const</span> visitor)<span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a id="l00572" name="l00572"></a><span class="lineno"> 572</span> visitor->BeginVisitConstraint(<a class="code hl_variable" href="classoperations__research_1_1_routing_model_visitor.html#a3408a1e02997042597b7499dad0cb343">RoutingModelVisitor::kLightElement</a>, <span class="keyword">this</span>);</div>
|
|
<div class="line"><a id="l00573" name="l00573"></a><span class="lineno"> 573</span> visitor->VisitIntegerExpressionArgument(<a class="code hl_variable" href="classoperations__research_1_1_model_visitor.html#a489f38dd601db8d045efae4d9ae7d754">ModelVisitor::kTargetArgument</a>,</div>
|
|
<div class="line"><a id="l00574" name="l00574"></a><span class="lineno"> 574</span> var_);</div>
|
|
<div class="line"><a id="l00575" name="l00575"></a><span class="lineno"> 575</span> visitor->VisitIntegerExpressionArgument(<a class="code hl_variable" href="classoperations__research_1_1_model_visitor.html#af490af7f25d4b57c9b088a61001f6a1e">ModelVisitor::kIndexArgument</a>,</div>
|
|
<div class="line"><a id="l00576" name="l00576"></a><span class="lineno"> 576</span> index_);</div>
|
|
<div class="line"><a id="l00577" name="l00577"></a><span class="lineno"> 577</span> <span class="comment">// Warning: This will expand all values into a vector.</span></div>
|
|
<div class="line"><a id="l00578" name="l00578"></a><span class="lineno"> 578</span> <span class="keywordflow">if</span> (deep_serialize_()) {</div>
|
|
<div class="line"><a id="l00579" name="l00579"></a><span class="lineno"> 579</span> visitor->VisitInt64ToInt64Extension(values_, index_->Min(),</div>
|
|
<div class="line"><a id="l00580" name="l00580"></a><span class="lineno"> 580</span> index_->Max());</div>
|
|
<div class="line"><a id="l00581" name="l00581"></a><span class="lineno"> 581</span> }</div>
|
|
<div class="line"><a id="l00582" name="l00582"></a><span class="lineno"> 582</span> visitor->EndVisitConstraint(<a class="code hl_variable" href="classoperations__research_1_1_routing_model_visitor.html#a3408a1e02997042597b7499dad0cb343">RoutingModelVisitor::kLightElement</a>, <span class="keyword">this</span>);</div>
|
|
<div class="line"><a id="l00583" name="l00583"></a><span class="lineno"> 583</span> }</div>
|
|
<div class="line"><a id="l00584" name="l00584"></a><span class="lineno"> 584</span> </div>
|
|
<div class="line"><a id="l00585" name="l00585"></a><span class="lineno"> 585</span> <span class="keyword">private</span>:</div>
|
|
<div class="line"><a id="l00586" name="l00586"></a><span class="lineno"> 586</span> <span class="keywordtype">void</span> IndexBound() { var_->SetValue(values_(index_->Min())); }</div>
|
|
<div class="line"><a id="l00587" name="l00587"></a><span class="lineno"> 587</span> </div>
|
|
<div class="line"><a id="l00588" name="l00588"></a><span class="lineno"> 588</span> IntVar* <span class="keyword">const</span> var_;</div>
|
|
<div class="line"><a id="l00589" name="l00589"></a><span class="lineno"> 589</span> IntVar* <span class="keyword">const</span> index_;</div>
|
|
<div class="line"><a id="l00590" name="l00590"></a><span class="lineno"> 590</span> F values_;</div>
|
|
<div class="line"><a id="l00591" name="l00591"></a><span class="lineno"> 591</span> std::function<bool()> deep_serialize_;</div>
|
|
<div class="line"><a id="l00592" name="l00592"></a><span class="lineno"> 592</span>};</div>
|
|
<div class="line"><a id="l00593" name="l00593"></a><span class="lineno"> 593</span> </div>
|
|
<div class="line"><a id="l00594" name="l00594"></a><span class="lineno"> 594</span><span class="keyword">template</span> <<span class="keyword">typename</span> F></div>
|
|
<div class="line"><a id="l00595" name="l00595"></a><span class="lineno"> 595</span>Constraint* MakeLightElement(Solver* <span class="keyword">const</span> solver, IntVar* <span class="keyword">const</span> <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>,</div>
|
|
<div class="line"><a id="l00596" name="l00596"></a><span class="lineno"> 596</span> IntVar* <span class="keyword">const</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>, F values,</div>
|
|
<div class="line"><a id="l00597" name="l00597"></a><span class="lineno"> 597</span> std::function<<span class="keywordtype">bool</span>()> deep_serialize) {</div>
|
|
<div class="line"><a id="l00598" name="l00598"></a><span class="lineno"> 598</span> <span class="keywordflow">return</span> solver->RevAlloc(<span class="keyword">new</span> LightFunctionElementConstraint<F>(</div>
|
|
<div class="line"><a id="l00599" name="l00599"></a><span class="lineno"> 599</span> solver, <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>, std::move(values), std::move(deep_serialize)));</div>
|
|
<div class="line"><a id="l00600" name="l00600"></a><span class="lineno"> 600</span>}</div>
|
|
<div class="line"><a id="l00601" name="l00601"></a><span class="lineno"> 601</span> </div>
|
|
<div class="line"><a id="l00602" name="l00602"></a><span class="lineno"> 602</span><span class="comment">// Light two-dimension function-based element constraint ensuring:</span></div>
|
|
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno"> 603</span><span class="comment">// var == values(index1, index2).</span></div>
|
|
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno"> 604</span><span class="comment">// Doesn't perform bound reduction of the resulting variable until the index</span></div>
|
|
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno"> 605</span><span class="comment">// variables are bound.</span></div>
|
|
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno"> 606</span><span class="comment">// Ownership of the 'values' callback is taken by the constraint.</span></div>
|
|
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno"> 607</span><span class="keyword">template</span> <<span class="keyword">typename</span> F></div>
|
|
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno"> 608</span><span class="keyword">class </span>LightFunctionElement2Constraint : <span class="keyword">public</span> Constraint {</div>
|
|
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno"> 609</span> <span class="keyword">public</span>:</div>
|
|
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno"> 610</span> LightFunctionElement2Constraint(Solver* <span class="keyword">const</span> solver, IntVar* <span class="keyword">const</span> <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>,</div>
|
|
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno"> 611</span> IntVar* <span class="keyword">const</span> index1, IntVar* <span class="keyword">const</span> index2,</div>
|
|
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno"> 612</span> F values,</div>
|
|
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno"> 613</span> std::function<<span class="keywordtype">bool</span>()> deep_serialize)</div>
|
|
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno"> 614</span> : Constraint(solver),</div>
|
|
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno"> 615</span> var_(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>),</div>
|
|
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno"> 616</span> index1_(index1),</div>
|
|
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno"> 617</span> index2_(index2),</div>
|
|
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno"> 618</span> values_(<a class="code hl_namespace" href="namespacestd.html">std</a>::move(values)),</div>
|
|
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno"> 619</span> deep_serialize_(<a class="code hl_namespace" href="namespacestd.html">std</a>::move(deep_serialize)) {}</div>
|
|
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno"> 620</span> ~LightFunctionElement2Constraint()<span class="keyword"> override </span>{}</div>
|
|
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno"> 621</span> <span class="keywordtype">void</span> Post()<span class="keyword"> override </span>{</div>
|
|
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno"> 622</span> Demon* demon = <a class="code hl_function" href="namespaceoperations__research.html#aa213d8f884283e0d72712243cbbefa7c">MakeConstraintDemon0</a>(</div>
|
|
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno"> 623</span> solver(), <span class="keyword">this</span>, &LightFunctionElement2Constraint::IndexBound,</div>
|
|
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno"> 624</span> <span class="stringliteral">"IndexBound"</span>);</div>
|
|
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno"> 625</span> index1_->WhenBound(demon);</div>
|
|
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno"> 626</span> index2_->WhenBound(demon);</div>
|
|
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno"> 627</span> }</div>
|
|
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno"> 628</span> <span class="keywordtype">void</span> InitialPropagate()<span class="keyword"> override </span>{ IndexBound(); }</div>
|
|
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno"> 629</span> </div>
|
|
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno"> 630</span> std::string DebugString()<span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno"> 631</span> <span class="keywordflow">return</span> <span class="stringliteral">"LightFunctionElement2Constraint"</span>;</div>
|
|
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno"> 632</span> }</div>
|
|
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno"> 633</span> </div>
|
|
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno"> 634</span> <span class="keywordtype">void</span> Accept(ModelVisitor* <span class="keyword">const</span> visitor)<span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno"> 635</span> visitor->BeginVisitConstraint(<a class="code hl_variable" href="classoperations__research_1_1_routing_model_visitor.html#a0ce138792ec79a561f17dd17b2c0610d">RoutingModelVisitor::kLightElement2</a>, <span class="keyword">this</span>);</div>
|
|
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno"> 636</span> visitor->VisitIntegerExpressionArgument(<a class="code hl_variable" href="classoperations__research_1_1_model_visitor.html#a489f38dd601db8d045efae4d9ae7d754">ModelVisitor::kTargetArgument</a>,</div>
|
|
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno"> 637</span> var_);</div>
|
|
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno"> 638</span> visitor->VisitIntegerExpressionArgument(<a class="code hl_variable" href="classoperations__research_1_1_model_visitor.html#af490af7f25d4b57c9b088a61001f6a1e">ModelVisitor::kIndexArgument</a>,</div>
|
|
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno"> 639</span> index1_);</div>
|
|
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno"> 640</span> visitor->VisitIntegerExpressionArgument(<a class="code hl_variable" href="classoperations__research_1_1_model_visitor.html#a18ba1952015fae2770ace40c811c2efb">ModelVisitor::kIndex2Argument</a>,</div>
|
|
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno"> 641</span> index2_);</div>
|
|
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno"> 642</span> <span class="comment">// Warning: This will expand all values into a vector.</span></div>
|
|
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno"> 643</span> <span class="keyword">const</span> int64_t index1_min = index1_->Min();</div>
|
|
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno"> 644</span> <span class="keyword">const</span> int64_t index1_max = index1_->Max();</div>
|
|
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno"> 645</span> visitor->VisitIntegerArgument(<a class="code hl_variable" href="classoperations__research_1_1_model_visitor.html#a1a1c411b20f73c324361e8eff94f12bd">ModelVisitor::kMinArgument</a>, index1_min);</div>
|
|
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno"> 646</span> visitor->VisitIntegerArgument(<a class="code hl_variable" href="classoperations__research_1_1_model_visitor.html#a5f9d5cd2badcf4361bfebd07c9cb63d8">ModelVisitor::kMaxArgument</a>, index1_max);</div>
|
|
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno"> 647</span> <span class="keywordflow">if</span> (deep_serialize_()) {</div>
|
|
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno"> 648</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = index1_min; i <= index1_max; ++i) {</div>
|
|
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno"> 649</span> visitor->VisitInt64ToInt64Extension(</div>
|
|
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno"> 650</span> [<span class="keyword">this</span>, i](int64_t j) { <span class="keywordflow">return</span> values_(i, j); }, index2_->Min(),</div>
|
|
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno"> 651</span> index2_->Max());</div>
|
|
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno"> 652</span> }</div>
|
|
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno"> 653</span> }</div>
|
|
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno"> 654</span> visitor->EndVisitConstraint(<a class="code hl_variable" href="classoperations__research_1_1_routing_model_visitor.html#a0ce138792ec79a561f17dd17b2c0610d">RoutingModelVisitor::kLightElement2</a>, <span class="keyword">this</span>);</div>
|
|
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno"> 655</span> }</div>
|
|
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno"> 656</span> </div>
|
|
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno"> 657</span> <span class="keyword">private</span>:</div>
|
|
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno"> 658</span> <span class="keywordtype">void</span> IndexBound() {</div>
|
|
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno"> 659</span> <span class="keywordflow">if</span> (index1_->Bound() && index2_->Bound()) {</div>
|
|
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno"> 660</span> var_->SetValue(values_(index1_->Min(), index2_->Min()));</div>
|
|
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno"> 661</span> }</div>
|
|
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno"> 662</span> }</div>
|
|
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno"> 663</span> </div>
|
|
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno"> 664</span> IntVar* <span class="keyword">const</span> var_;</div>
|
|
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno"> 665</span> IntVar* <span class="keyword">const</span> index1_;</div>
|
|
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno"> 666</span> IntVar* <span class="keyword">const</span> index2_;</div>
|
|
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno"> 667</span> <a class="code hl_typedef" href="classoperations__research_1_1_solver.html#a55d833360c375d45a3c503437de9841c">Solver::IndexEvaluator2</a> values_;</div>
|
|
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno"> 668</span> std::function<bool()> deep_serialize_;</div>
|
|
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno"> 669</span>};</div>
|
|
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno"> 670</span> </div>
|
|
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno"> 671</span><span class="keyword">template</span> <<span class="keyword">typename</span> F></div>
|
|
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno"> 672</span>Constraint* MakeLightElement2(Solver* <span class="keyword">const</span> solver, IntVar* <span class="keyword">const</span> <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>,</div>
|
|
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno"> 673</span> IntVar* <span class="keyword">const</span> index1, IntVar* <span class="keyword">const</span> index2,</div>
|
|
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno"> 674</span> F values, std::function<<span class="keywordtype">bool</span>()> deep_serialize) {</div>
|
|
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno"> 675</span> <span class="keywordflow">return</span> solver->RevAlloc(<span class="keyword">new</span> LightFunctionElement2Constraint<F>(</div>
|
|
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno"> 676</span> solver, <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, index1, index2, std::move(values),</div>
|
|
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno"> 677</span> std::move(deep_serialize)));</div>
|
|
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno"> 678</span>}</div>
|
|
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno"> 679</span> </div>
|
|
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno"> 680</span><span class="comment">// Evaluators</span></div>
|
|
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno"> 681</span><span class="keyword">template</span> <<span class="keyword">class</span> A, <span class="keyword">class</span> B></div>
|
|
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno"> 682</span><span class="keyword">static</span> int64_t ReturnZero(A <a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>, B <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>) {</div>
|
|
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno"> 683</span> <span class="keywordflow">return</span> 0;</div>
|
|
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno"> 684</span>}</div>
|
|
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno"> 685</span> </div>
|
|
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno"> 686</span><span class="keywordtype">bool</span> TransitCallbackPositive(<span class="keyword">const</span> <a class="code hl_typedef" href="namespaceoperations__research.html#a26868b9d744edcd8d59145e068678885">RoutingTransitCallback2</a>& <a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>, <span class="keywordtype">int</span> size1,</div>
|
|
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno"> 687</span> <span class="keywordtype">int</span> size2) {</div>
|
|
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno"> 688</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < size1; i++) {</div>
|
|
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno"> 689</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < size2; j++) {</div>
|
|
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno"> 690</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>(i, j) < 0) {</div>
|
|
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno"> 691</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno"> 692</span> }</div>
|
|
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno"> 693</span> }</div>
|
|
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno"> 694</span> }</div>
|
|
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno"> 695</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno"> 696</span>}</div>
|
|
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno"> 697</span> </div>
|
|
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno"> 698</span>} <span class="comment">// namespace</span></div>
|
|
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno"> 699</span> </div>
|
|
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno"> 700</span><span class="comment">// ----- Routing model -----</span></div>
|
|
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno"> 701</span> </div>
|
|
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno"><a class="line" href="namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955"> 702</a></span><span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code hl_variable" href="namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955">kUnassigned</a> = -1;</div>
|
|
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno"> 703</span><span class="keyword">const</span> int64_t <a class="code hl_variable" href="classoperations__research_1_1_routing_model.html#a5f3df49299b1aaad3bca40b14291aa79">RoutingModel::kNoPenalty</a> = -1;</div>
|
|
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno"> 704</span> </div>
|
|
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno"> 705</span><span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#afa7cbbd4db2dd5d0bec3393efc9ebac1">RoutingModel::DisjunctionIndex</a> <a class="code hl_variable" href="classoperations__research_1_1_routing_model.html#ae5a61ca8a5a897aa6c4ce5c466e8f45f">RoutingModel::kNoDisjunction</a>(-1);</div>
|
|
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno"> 706</span> </div>
|
|
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno"> 707</span><span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce">RoutingModel::DimensionIndex</a> <a class="code hl_variable" href="classoperations__research_1_1_routing_model.html#ae00630e36d2d8a2fa7eb4743a65e80d1">RoutingModel::kNoDimension</a>(-1);</div>
|
|
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno"> 708</span> </div>
|
|
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#af12674b693b7b7cfe271e5b066e10bff"> 709</a></span><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#af12674b693b7b7cfe271e5b066e10bff">RoutingModel::RoutingModel</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_index_manager.html">RoutingIndexManager</a>& index_manager)</div>
|
|
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno"> 710</span> : <a class="code hl_class" href="classoperations__research_1_1_routing_model.html">RoutingModel</a>(index_manager, <a class="code hl_function" href="namespaceoperations__research.html#a2fb66556abf59bfcf2fc1b87789d2a8e">DefaultRoutingModelParameters</a>()) {}</div>
|
|
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno"> 711</span> </div>
|
|
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a33cbb6c72596f866cb9cd105c5fee8ff"> 712</a></span><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#af12674b693b7b7cfe271e5b066e10bff">RoutingModel::RoutingModel</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_index_manager.html">RoutingIndexManager</a>& index_manager,</div>
|
|
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno"> 713</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_model_parameters.html">RoutingModelParameters</a>& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>)</div>
|
|
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno"> 714</span> : nodes_(index_manager.num_nodes()),</div>
|
|
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno"> 715</span> vehicles_(index_manager.num_vehicles()),</div>
|
|
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno"> 716</span> max_active_vehicles_(vehicles_),</div>
|
|
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno"> 717</span> fixed_cost_of_vehicle_(vehicles_, 0),</div>
|
|
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno"> 718</span> cost_class_index_of_vehicle_(vehicles_, <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#ad13ad202092298b43c9099b212c54d3d">CostClassIndex</a>(-1)),</div>
|
|
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno"> 719</span> linear_cost_factor_of_vehicle_(vehicles_, 0),</div>
|
|
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno"> 720</span> quadratic_cost_factor_of_vehicle_(vehicles_, 0),</div>
|
|
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno"> 721</span> vehicle_amortized_cost_factors_set_(false),</div>
|
|
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno"> 722</span> consider_empty_route_costs_(vehicles_, false),</div>
|
|
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno"> 723</span> cost_classes_(),</div>
|
|
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno"> 724</span> costs_are_homogeneous_across_vehicles_(</div>
|
|
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno"> 725</span> <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.reduce_vehicle_cost_model()),</div>
|
|
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno"> 726</span> cache_callbacks_(false),</div>
|
|
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno"> 727</span> vehicle_class_index_of_vehicle_(vehicles_, <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#ab6aae3927f3537c446ac33f2c6ecb922">VehicleClassIndex</a>(-1)),</div>
|
|
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno"> 728</span> vehicle_pickup_delivery_policy_(vehicles_, PICKUP_AND_DELIVERY_NO_ORDER),</div>
|
|
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno"> 729</span> has_hard_type_incompatibilities_(false),</div>
|
|
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno"> 730</span> has_temporal_type_incompatibilities_(false),</div>
|
|
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno"> 731</span> has_same_vehicle_type_requirements_(false),</div>
|
|
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno"> 732</span> has_temporal_type_requirements_(false),</div>
|
|
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno"> 733</span> num_visit_types_(0),</div>
|
|
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno"> 734</span> starts_(vehicles_),</div>
|
|
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno"> 735</span> ends_(vehicles_),</div>
|
|
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno"> 736</span> manager_(index_manager) {</div>
|
|
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno"> 737</span> <span class="comment">// Initialize vehicle costs to the zero evaluator.</span></div>
|
|
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno"> 738</span> vehicle_to_transit_cost_.assign(</div>
|
|
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno"> 739</span> vehicles_, <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8c58bbbfc090a581f02d76fabf465b3e">RegisterTransitCallback</a>(ReturnZero<int64_t, int64_t>));</div>
|
|
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno"> 740</span> <span class="comment">// Active caching after initializing vehicle_to_transit_cost_ to avoid</span></div>
|
|
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno"> 741</span> <span class="comment">// uselessly caching ReturnZero.</span></div>
|
|
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno"> 742</span> cache_callbacks_ = (nodes_ <= <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.max_callback_cache_size());</div>
|
|
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno"> 743</span> </div>
|
|
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno"> 744</span> <a class="code hl_define" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) << <span class="stringliteral">"Model parameters:\n"</span> << <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.DebugString();</div>
|
|
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno"> 745</span> <a class="code hl_class" href="classoperations__research_1_1_constraint_solver_parameters.html">ConstraintSolverParameters</a> solver_parameters =</div>
|
|
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno"> 746</span> <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.has_solver_parameters() ? <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.solver_parameters()</div>
|
|
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno"> 747</span> : <a class="code hl_function" href="classoperations__research_1_1_solver.html#aaa825d53a4aec98b8e8d5694b99a0c33">Solver::DefaultSolverParameters</a>();</div>
|
|
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno"> 748</span> solver_ = absl::make_unique<Solver>(<span class="stringliteral">"Routing"</span>, solver_parameters);</div>
|
|
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno"> 749</span> <span class="comment">// TODO(user): Remove when removal of NodeIndex is complete.</span></div>
|
|
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno"> 750</span> start_end_count_ = index_manager.<a class="code hl_function" href="classoperations__research_1_1_routing_index_manager.html#a77ea1e8bec366bf225bad6732c7eec63">num_unique_depots</a>();</div>
|
|
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno"> 751</span> Initialize();</div>
|
|
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno"> 752</span> </div>
|
|
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno"> 753</span> <span class="keyword">const</span> int64_t size = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a572bd92c25ebc67c72137fd59e53f6d6">Size</a>();</div>
|
|
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno"> 754</span> index_to_pickup_index_pairs_.resize(size);</div>
|
|
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno"> 755</span> index_to_delivery_index_pairs_.resize(size);</div>
|
|
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno"> 756</span> index_to_visit_type_.resize(index_manager.<a class="code hl_function" href="classoperations__research_1_1_routing_index_manager.html#ae7309bcc0f1a1e238ad7501f1b553ef2">num_indices</a>(), <a class="code hl_variable" href="namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955">kUnassigned</a>);</div>
|
|
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno"> 757</span> index_to_type_policy_.resize(index_manager.<a class="code hl_function" href="classoperations__research_1_1_routing_index_manager.html#ae7309bcc0f1a1e238ad7501f1b553ef2">num_indices</a>());</div>
|
|
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno"> 758</span> </div>
|
|
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno"> 759</span> index_to_vehicle_.resize(index_manager.<a class="code hl_function" href="classoperations__research_1_1_routing_index_manager.html#ae7309bcc0f1a1e238ad7501f1b553ef2">num_indices</a>(), <a class="code hl_variable" href="namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955">kUnassigned</a>);</div>
|
|
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno"> 760</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> v = 0; v < index_manager.<a class="code hl_function" href="classoperations__research_1_1_routing_index_manager.html#ad422f8593b66956120c8a5b1959b2623">num_vehicles</a>(); ++v) {</div>
|
|
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno"> 761</span> starts_[v] = index_manager.<a class="code hl_function" href="classoperations__research_1_1_routing_index_manager.html#a59b450e599349dfec9718bd43da47f24">GetStartIndex</a>(v);</div>
|
|
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno"> 762</span> index_to_vehicle_[starts_[v]] = v;</div>
|
|
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno"> 763</span> ends_[v] = index_manager.<a class="code hl_function" href="classoperations__research_1_1_routing_index_manager.html#a182f3163446aae823f46636ed452b5fc">GetEndIndex</a>(v);</div>
|
|
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno"> 764</span> index_to_vehicle_[ends_[v]] = v;</div>
|
|
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno"> 765</span> }</div>
|
|
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno"> 766</span> </div>
|
|
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno"> 767</span> <span class="keyword">const</span> std::vector<RoutingIndexManager::NodeIndex>& index_to_node =</div>
|
|
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno"> 768</span> index_manager.<a class="code hl_function" href="classoperations__research_1_1_routing_index_manager.html#ab4cc8be57f3de60a3cc605250950295a">GetIndexToNodeMap</a>();</div>
|
|
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno"> 769</span> index_to_equivalence_class_.resize(index_manager.<a class="code hl_function" href="classoperations__research_1_1_routing_index_manager.html#ae7309bcc0f1a1e238ad7501f1b553ef2">num_indices</a>());</div>
|
|
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno"> 770</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < index_to_node.size(); ++i) {</div>
|
|
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno"> 771</span> index_to_equivalence_class_[i] = index_to_node[i].value();</div>
|
|
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno"> 772</span> }</div>
|
|
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno"> 773</span> allowed_vehicles_.resize(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a572bd92c25ebc67c72137fd59e53f6d6">Size</a>() + vehicles_);</div>
|
|
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno"> 774</span>}</div>
|
|
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno"> 775</span> </div>
|
|
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno"> 776</span><span class="keywordtype">void</span> RoutingModel::Initialize() {</div>
|
|
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno"> 777</span> <span class="keyword">const</span> <span class="keywordtype">int</span> size = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a572bd92c25ebc67c72137fd59e53f6d6">Size</a>();</div>
|
|
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno"> 778</span> <span class="comment">// Next variables</span></div>
|
|
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno"> 779</span> solver_->MakeIntVarArray(size, 0, size + vehicles_ - 1, <span class="stringliteral">"Nexts"</span>, &nexts_);</div>
|
|
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno"> 780</span> solver_->AddConstraint(solver_->MakeAllDifferent(nexts_, <span class="keyword">false</span>));</div>
|
|
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno"> 781</span> index_to_disjunctions_.resize(size + vehicles_);</div>
|
|
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno"> 782</span> <span class="comment">// Vehicle variables. In case that node i is not active, vehicle_vars_[i] is</span></div>
|
|
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno"> 783</span> <span class="comment">// bound to -1.</span></div>
|
|
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno"> 784</span> solver_->MakeIntVarArray(size + vehicles_, -1, vehicles_ - 1, <span class="stringliteral">"Vehicles"</span>,</div>
|
|
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno"> 785</span> &vehicle_vars_);</div>
|
|
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno"> 786</span> <span class="comment">// Active variables</span></div>
|
|
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno"> 787</span> solver_->MakeBoolVarArray(size, <span class="stringliteral">"Active"</span>, &active_);</div>
|
|
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno"> 788</span> <span class="comment">// Active vehicle variables</span></div>
|
|
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno"> 789</span> solver_->MakeBoolVarArray(vehicles_, <span class="stringliteral">"ActiveVehicle"</span>, &vehicle_active_);</div>
|
|
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno"> 790</span> <span class="comment">// Variables representing vehicles contributing to cost.</span></div>
|
|
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno"> 791</span> solver_->MakeBoolVarArray(vehicles_, <span class="stringliteral">"VehicleCostsConsidered"</span>,</div>
|
|
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno"> 792</span> &vehicle_costs_considered_);</div>
|
|
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno"> 793</span> <span class="comment">// Is-bound-to-end variables.</span></div>
|
|
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno"> 794</span> solver_->MakeBoolVarArray(size + vehicles_, <span class="stringliteral">"IsBoundToEnd"</span>,</div>
|
|
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno"> 795</span> &is_bound_to_end_);</div>
|
|
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno"> 796</span> <span class="comment">// Cost cache</span></div>
|
|
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno"> 797</span> cost_cache_.clear();</div>
|
|
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno"> 798</span> cost_cache_.resize(size + vehicles_, {<a class="code hl_variable" href="namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955">kUnassigned</a>, <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#ad13ad202092298b43c9099b212c54d3d">CostClassIndex</a>(-1), 0});</div>
|
|
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno"> 799</span> preassignment_ = solver_->MakeAssignment();</div>
|
|
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno"> 800</span>}</div>
|
|
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno"> 801</span> </div>
|
|
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#adca8397d2ad8dfc3bcd2a768bf3e12a2"> 802</a></span><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#adca8397d2ad8dfc3bcd2a768bf3e12a2">RoutingModel::~RoutingModel</a>() {</div>
|
|
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno"> 803</span> <a class="code hl_function" href="namespacegtl.html#a4ee3db0c4acaa0f277a0d7006f5ad1e6">gtl::STLDeleteElements</a>(&dimensions_);</div>
|
|
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno"> 804</span> </div>
|
|
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno"> 805</span> <span class="comment">// State dependent transit callbacks.</span></div>
|
|
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno"> 806</span> absl::flat_hash_set<RangeIntToIntFunction*> value_functions_delete;</div>
|
|
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno"> 807</span> absl::flat_hash_set<RangeMinMaxIndexFunction*> index_functions_delete;</div>
|
|
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno"> 808</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>& cache_line : state_dependent_transit_evaluators_cache_) {</div>
|
|
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno"> 809</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>& key_transit : *cache_line) {</div>
|
|
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno"> 810</span> value_functions_delete.insert(key_transit.second.transit);</div>
|
|
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno"> 811</span> index_functions_delete.insert(key_transit.second.transit_plus_identity);</div>
|
|
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno"> 812</span> }</div>
|
|
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno"> 813</span> }</div>
|
|
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno"> 814</span> <a class="code hl_function" href="namespacegtl.html#a4ee3db0c4acaa0f277a0d7006f5ad1e6">gtl::STLDeleteElements</a>(&value_functions_delete);</div>
|
|
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno"> 815</span> <a class="code hl_function" href="namespacegtl.html#a4ee3db0c4acaa0f277a0d7006f5ad1e6">gtl::STLDeleteElements</a>(&index_functions_delete);</div>
|
|
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno"> 816</span>}</div>
|
|
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno"> 817</span> </div>
|
|
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno"> 818</span><span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno"> 819</span><span class="keywordtype">int</span> RegisterCallback(<a class="code hl_typedef" href="namespaceoperations__research.html#a26868b9d744edcd8d59145e068678885">RoutingTransitCallback2</a> <a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>, <span class="keywordtype">bool</span> is_positive,</div>
|
|
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno"> 820</span> <a class="code hl_class" href="classoperations__research_1_1_routing_model.html">RoutingModel</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
|
|
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno"> 821</span> <span class="keywordflow">if</span> (is_positive) {</div>
|
|
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno"> 822</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->RegisterPositiveTransitCallback(std::move(<a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>));</div>
|
|
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno"> 823</span> }</div>
|
|
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno"> 824</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->RegisterTransitCallback(std::move(<a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>));</div>
|
|
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno"> 825</span>}</div>
|
|
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno"> 826</span> </div>
|
|
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno"> 827</span><span class="keywordtype">int</span> RegisterUnaryCallback(<a class="code hl_typedef" href="namespaceoperations__research.html#aae02b84a58c3008fb747c0f6917bfe6c">RoutingTransitCallback1</a> <a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>, <span class="keywordtype">bool</span> is_positive,</div>
|
|
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno"> 828</span> RoutingModel* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
|
|
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno"> 829</span> <span class="keywordflow">if</span> (is_positive) {</div>
|
|
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno"> 830</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->RegisterPositiveUnaryTransitCallback(std::move(<a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>));</div>
|
|
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno"> 831</span> }</div>
|
|
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno"> 832</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->RegisterUnaryTransitCallback(std::move(<a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>));</div>
|
|
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno"> 833</span>}</div>
|
|
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno"> 834</span>} <span class="comment">// namespace</span></div>
|
|
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno"> 835</span> </div>
|
|
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a558728d2399a362f2595455653edad02"> 836</a></span><span class="keywordtype">int</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a558728d2399a362f2595455653edad02">RoutingModel::RegisterUnaryTransitVector</a>(std::vector<int64_t> values) {</div>
|
|
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno"> 837</span> <span class="keywordflow">return</span> RegisterUnaryCallback(</div>
|
|
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno"> 838</span> [<span class="keyword">this</span>, values = std::move(values)](int64_t i) {</div>
|
|
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno"> 839</span> <span class="keywordflow">return</span> values[manager_.<a class="code hl_function" href="classoperations__research_1_1_routing_index_manager.html#aaa5a86f47526bbf08a77756d5b542d48">IndexToNode</a>(i).<a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>()];</div>
|
|
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno"> 840</span> },</div>
|
|
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno"> 841</span> <span class="comment">/*is_positive=*/</span></div>
|
|
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno"> 842</span> std::all_of(std::cbegin(values), std::cend(values),</div>
|
|
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno"> 843</span> [](int64_t transit) { <span class="keywordflow">return</span> transit >= 0; }),</div>
|
|
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno"> 844</span> <span class="keyword">this</span>);</div>
|
|
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno"> 845</span>}</div>
|
|
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno"> 846</span> </div>
|
|
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#acbab635c68d8a6e0961afae0f606590b"> 847</a></span><span class="keywordtype">int</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acbab635c68d8a6e0961afae0f606590b">RoutingModel::RegisterUnaryTransitCallback</a>(<a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a204041e5264282d54dfd198011e776d3">TransitCallback1</a> <a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>) {</div>
|
|
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno"> 848</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = unary_transit_evaluators_.size();</div>
|
|
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno"> 849</span> unary_transit_evaluators_.push_back(std::move(<a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>));</div>
|
|
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno"> 850</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8c58bbbfc090a581f02d76fabf465b3e">RegisterTransitCallback</a>([<span class="keyword">this</span>, <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>](<span class="keywordtype">int</span> i, <span class="keywordtype">int</span> j) {</div>
|
|
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno"> 851</span> <span class="keywordflow">return</span> unary_transit_evaluators_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>](i);</div>
|
|
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno"> 852</span> });</div>
|
|
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno"> 853</span>}</div>
|
|
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno"> 854</span> </div>
|
|
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#add1a60041c1f8ec87b492635be1c8704"> 855</a></span><span class="keywordtype">int</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#add1a60041c1f8ec87b492635be1c8704">RoutingModel::RegisterTransitMatrix</a>(</div>
|
|
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno"> 856</span> std::vector<std::vector<int64_t> <span class="comment">/*needed_for_swig*/</span>> values) {</div>
|
|
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno"> 857</span> <span class="keywordtype">bool</span> all_transits_positive = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno"> 858</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::vector<int64_t>& transit_values : values) {</div>
|
|
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno"> 859</span> all_transits_positive =</div>
|
|
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno"> 860</span> std::all_of(std::cbegin(transit_values), std::cend(transit_values),</div>
|
|
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno"> 861</span> [](int64_t transit) { <span class="keywordflow">return</span> transit >= 0; });</div>
|
|
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno"> 862</span> <span class="keywordflow">if</span> (!all_transits_positive) {</div>
|
|
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno"> 863</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno"> 864</span> }</div>
|
|
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno"> 865</span> }</div>
|
|
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno"> 866</span> <span class="keywordflow">return</span> RegisterCallback(</div>
|
|
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno"> 867</span> [<span class="keyword">this</span>, values = std::move(values)](int64_t i, int64_t j) {</div>
|
|
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno"> 868</span> <span class="keywordflow">return</span> values[manager_.<a class="code hl_function" href="classoperations__research_1_1_routing_index_manager.html#aaa5a86f47526bbf08a77756d5b542d48">IndexToNode</a>(i).<a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>()]</div>
|
|
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno"> 869</span> [manager_.<a class="code hl_function" href="classoperations__research_1_1_routing_index_manager.html#aaa5a86f47526bbf08a77756d5b542d48">IndexToNode</a>(j).value()];</div>
|
|
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno"> 870</span> },</div>
|
|
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno"> 871</span> all_transits_positive, <span class="keyword">this</span>);</div>
|
|
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno"> 872</span>}</div>
|
|
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno"> 873</span> </div>
|
|
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a7dd3d77b26ddfc5e981637ee8b83c1ed"> 874</a></span><span class="keywordtype">int</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a7dd3d77b26ddfc5e981637ee8b83c1ed">RoutingModel::RegisterPositiveUnaryTransitCallback</a>(</div>
|
|
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno"> 875</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a204041e5264282d54dfd198011e776d3">TransitCallback1</a> <a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>) {</div>
|
|
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno"> 876</span> is_transit_evaluator_positive_.push_back(<span class="keyword">true</span>);</div>
|
|
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno"> 877</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(TransitCallbackPositive(</div>
|
|
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno"> 878</span> [&<a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>](<span class="keywordtype">int</span> i, <span class="keywordtype">int</span>) { <span class="keywordflow">return</span> <a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>(i); }, <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a572bd92c25ebc67c72137fd59e53f6d6">Size</a>() + <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(), 1));</div>
|
|
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno"> 879</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acbab635c68d8a6e0961afae0f606590b">RegisterUnaryTransitCallback</a>(std::move(<a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>));</div>
|
|
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno"> 880</span>}</div>
|
|
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno"> 881</span> </div>
|
|
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a8c58bbbfc090a581f02d76fabf465b3e"> 882</a></span><span class="keywordtype">int</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8c58bbbfc090a581f02d76fabf465b3e">RoutingModel::RegisterTransitCallback</a>(<a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a5fa8aee5b0c67072dbbb03f1899ec60a">TransitCallback2</a> <a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>) {</div>
|
|
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno"> 883</span> <span class="keywordflow">if</span> (cache_callbacks_) {</div>
|
|
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno"> 884</span> <span class="keyword">const</span> <span class="keywordtype">int</span> size = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a572bd92c25ebc67c72137fd59e53f6d6">Size</a>() + <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>();</div>
|
|
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno"> 885</span> std::vector<int64_t> cache(size * size, 0);</div>
|
|
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno"> 886</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < size; ++i) {</div>
|
|
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno"> 887</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < size; ++j) {</div>
|
|
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno"> 888</span> cache[i * size + j] = <a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>(i, j);</div>
|
|
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno"> 889</span> }</div>
|
|
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno"> 890</span> }</div>
|
|
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno"> 891</span> transit_evaluators_.push_back(</div>
|
|
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno"> 892</span> [cache, size](int64_t i, int64_t j) { <span class="keywordflow">return</span> cache[i * size + j]; });</div>
|
|
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno"> 893</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno"> 894</span> transit_evaluators_.push_back(std::move(<a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>));</div>
|
|
<div class="line"><a id="l00895" name="l00895"></a><span class="lineno"> 895</span> }</div>
|
|
<div class="line"><a id="l00896" name="l00896"></a><span class="lineno"> 896</span> <span class="keywordflow">if</span> (transit_evaluators_.size() != unary_transit_evaluators_.size()) {</div>
|
|
<div class="line"><a id="l00897" name="l00897"></a><span class="lineno"> 897</span> <a class="code hl_define" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(transit_evaluators_.size(), unary_transit_evaluators_.size() + 1);</div>
|
|
<div class="line"><a id="l00898" name="l00898"></a><span class="lineno"> 898</span> unary_transit_evaluators_.push_back(<span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l00899" name="l00899"></a><span class="lineno"> 899</span> }</div>
|
|
<div class="line"><a id="l00900" name="l00900"></a><span class="lineno"> 900</span> <span class="keywordflow">if</span> (transit_evaluators_.size() != is_transit_evaluator_positive_.size()) {</div>
|
|
<div class="line"><a id="l00901" name="l00901"></a><span class="lineno"> 901</span> <a class="code hl_define" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(transit_evaluators_.size(),</div>
|
|
<div class="line"><a id="l00902" name="l00902"></a><span class="lineno"> 902</span> is_transit_evaluator_positive_.size() + 1);</div>
|
|
<div class="line"><a id="l00903" name="l00903"></a><span class="lineno"> 903</span> is_transit_evaluator_positive_.push_back(<span class="keyword">false</span>);</div>
|
|
<div class="line"><a id="l00904" name="l00904"></a><span class="lineno"> 904</span> }</div>
|
|
<div class="line"><a id="l00905" name="l00905"></a><span class="lineno"> 905</span> <span class="keywordflow">return</span> transit_evaluators_.size() - 1;</div>
|
|
<div class="line"><a id="l00906" name="l00906"></a><span class="lineno"> 906</span>}</div>
|
|
<div class="line"><a id="l00907" name="l00907"></a><span class="lineno"> 907</span> </div>
|
|
<div class="line"><a id="l00908" name="l00908"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#aa540a1068aef75c041330a2eafccd623"> 908</a></span><span class="keywordtype">int</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa540a1068aef75c041330a2eafccd623">RoutingModel::RegisterPositiveTransitCallback</a>(<a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a5fa8aee5b0c67072dbbb03f1899ec60a">TransitCallback2</a> <a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>) {</div>
|
|
<div class="line"><a id="l00909" name="l00909"></a><span class="lineno"> 909</span> is_transit_evaluator_positive_.push_back(<span class="keyword">true</span>);</div>
|
|
<div class="line"><a id="l00910" name="l00910"></a><span class="lineno"> 910</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(TransitCallbackPositive(<a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>, <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a572bd92c25ebc67c72137fd59e53f6d6">Size</a>() + <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(),</div>
|
|
<div class="line"><a id="l00911" name="l00911"></a><span class="lineno"> 911</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a572bd92c25ebc67c72137fd59e53f6d6">Size</a>() + <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>()));</div>
|
|
<div class="line"><a id="l00912" name="l00912"></a><span class="lineno"> 912</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8c58bbbfc090a581f02d76fabf465b3e">RegisterTransitCallback</a>(std::move(<a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>));</div>
|
|
<div class="line"><a id="l00913" name="l00913"></a><span class="lineno"> 913</span>}</div>
|
|
<div class="line"><a id="l00914" name="l00914"></a><span class="lineno"> 914</span> </div>
|
|
<div class="line"><a id="l00915" name="l00915"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a422ce2898045c53fc90d21d8633d4af7"> 915</a></span><span class="keywordtype">int</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a422ce2898045c53fc90d21d8633d4af7">RoutingModel::RegisterStateDependentTransitCallback</a>(</div>
|
|
<div class="line"><a id="l00916" name="l00916"></a><span class="lineno"> 916</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#aba73f2fc54b941bd9233d07cf86b9feb">VariableIndexEvaluator2</a> <a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>) {</div>
|
|
<div class="line"><a id="l00917" name="l00917"></a><span class="lineno"> 917</span> state_dependent_transit_evaluators_cache_.push_back(</div>
|
|
<div class="line"><a id="l00918" name="l00918"></a><span class="lineno"> 918</span> absl::make_unique<StateDependentTransitCallbackCache>());</div>
|
|
<div class="line"><a id="l00919" name="l00919"></a><span class="lineno"> 919</span> StateDependentTransitCallbackCache* <span class="keyword">const</span> cache =</div>
|
|
<div class="line"><a id="l00920" name="l00920"></a><span class="lineno"> 920</span> state_dependent_transit_evaluators_cache_.back().get();</div>
|
|
<div class="line"><a id="l00921" name="l00921"></a><span class="lineno"> 921</span> state_dependent_transit_evaluators_.push_back(</div>
|
|
<div class="line"><a id="l00922" name="l00922"></a><span class="lineno"> 922</span> [cache, <a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>](int64_t i, int64_t j) {</div>
|
|
<div class="line"><a id="l00923" name="l00923"></a><span class="lineno"> 923</span> <a class="code hl_struct" href="structoperations__research_1_1_routing_model_1_1_state_dependent_transit.html">StateDependentTransit</a> <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>;</div>
|
|
<div class="line"><a id="l00924" name="l00924"></a><span class="lineno"> 924</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="namespacegtl.html#a6a4238d2e35cf819a8e83d60d331ea64">gtl::FindCopy</a>(*cache, CacheKey(i, j), &<a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>)) <span class="keywordflow">return</span> <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>;</div>
|
|
<div class="line"><a id="l00925" name="l00925"></a><span class="lineno"> 925</span> <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a> = <a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>(i, j);</div>
|
|
<div class="line"><a id="l00926" name="l00926"></a><span class="lineno"> 926</span> cache->insert({CacheKey(i, j), <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>});</div>
|
|
<div class="line"><a id="l00927" name="l00927"></a><span class="lineno"> 927</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>;</div>
|
|
<div class="line"><a id="l00928" name="l00928"></a><span class="lineno"> 928</span> });</div>
|
|
<div class="line"><a id="l00929" name="l00929"></a><span class="lineno"> 929</span> <span class="keywordflow">return</span> state_dependent_transit_evaluators_.size() - 1;</div>
|
|
<div class="line"><a id="l00930" name="l00930"></a><span class="lineno"> 930</span>}</div>
|
|
<div class="line"><a id="l00931" name="l00931"></a><span class="lineno"> 931</span> </div>
|
|
<div class="line"><a id="l00932" name="l00932"></a><span class="lineno"> 932</span><span class="keywordtype">void</span> RoutingModel::AddNoCycleConstraintInternal() {</div>
|
|
<div class="line"><a id="l00933" name="l00933"></a><span class="lineno"> 933</span> <span class="keywordflow">if</span> (no_cycle_constraint_ == <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l00934" name="l00934"></a><span class="lineno"> 934</span> no_cycle_constraint_ = solver_->MakeNoCycle(nexts_, active_);</div>
|
|
<div class="line"><a id="l00935" name="l00935"></a><span class="lineno"> 935</span> solver_->AddConstraint(no_cycle_constraint_);</div>
|
|
<div class="line"><a id="l00936" name="l00936"></a><span class="lineno"> 936</span> }</div>
|
|
<div class="line"><a id="l00937" name="l00937"></a><span class="lineno"> 937</span>}</div>
|
|
<div class="line"><a id="l00938" name="l00938"></a><span class="lineno"> 938</span> </div>
|
|
<div class="line"><a id="l00939" name="l00939"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#afe7b5ce21d69c0cf5e8469a73988b0df"> 939</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afe7b5ce21d69c0cf5e8469a73988b0df">RoutingModel::AddDimension</a>(<span class="keywordtype">int</span> evaluator_index, int64_t slack_max,</div>
|
|
<div class="line"><a id="l00940" name="l00940"></a><span class="lineno"> 940</span> int64_t <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div>
|
|
<div class="line"><a id="l00941" name="l00941"></a><span class="lineno"> 941</span> <span class="keyword">const</span> std::string& <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>) {</div>
|
|
<div class="line"><a id="l00942" name="l00942"></a><span class="lineno"> 942</span> <span class="keyword">const</span> std::vector<int> evaluator_indices(vehicles_, evaluator_index);</div>
|
|
<div class="line"><a id="l00943" name="l00943"></a><span class="lineno"> 943</span> std::vector<int64_t> capacities(vehicles_, <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>);</div>
|
|
<div class="line"><a id="l00944" name="l00944"></a><span class="lineno"> 944</span> <span class="keywordflow">return</span> AddDimensionWithCapacityInternal(evaluator_indices, slack_max,</div>
|
|
<div class="line"><a id="l00945" name="l00945"></a><span class="lineno"> 945</span> std::move(capacities),</div>
|
|
<div class="line"><a id="l00946" name="l00946"></a><span class="lineno"> 946</span> fix_start_cumul_to_zero, <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>);</div>
|
|
<div class="line"><a id="l00947" name="l00947"></a><span class="lineno"> 947</span>}</div>
|
|
<div class="line"><a id="l00948" name="l00948"></a><span class="lineno"> 948</span> </div>
|
|
<div class="line"><a id="l00949" name="l00949"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#acf6e2a1031a61467fff27d14cb937fde"> 949</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf6e2a1031a61467fff27d14cb937fde">RoutingModel::AddDimensionWithVehicleTransits</a>(</div>
|
|
<div class="line"><a id="l00950" name="l00950"></a><span class="lineno"> 950</span> <span class="keyword">const</span> std::vector<int>& evaluator_indices, int64_t slack_max,</div>
|
|
<div class="line"><a id="l00951" name="l00951"></a><span class="lineno"> 951</span> int64_t <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, <span class="keywordtype">bool</span> fix_start_cumul_to_zero, <span class="keyword">const</span> std::string& <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>) {</div>
|
|
<div class="line"><a id="l00952" name="l00952"></a><span class="lineno"> 952</span> std::vector<int64_t> capacities(vehicles_, <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>);</div>
|
|
<div class="line"><a id="l00953" name="l00953"></a><span class="lineno"> 953</span> <span class="keywordflow">return</span> AddDimensionWithCapacityInternal(evaluator_indices, slack_max,</div>
|
|
<div class="line"><a id="l00954" name="l00954"></a><span class="lineno"> 954</span> std::move(capacities),</div>
|
|
<div class="line"><a id="l00955" name="l00955"></a><span class="lineno"> 955</span> fix_start_cumul_to_zero, <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>);</div>
|
|
<div class="line"><a id="l00956" name="l00956"></a><span class="lineno"> 956</span>}</div>
|
|
<div class="line"><a id="l00957" name="l00957"></a><span class="lineno"> 957</span> </div>
|
|
<div class="line"><a id="l00958" name="l00958"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#abb04114cc25bd55e364b79d9adccab91"> 958</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#abb04114cc25bd55e364b79d9adccab91">RoutingModel::AddDimensionWithVehicleCapacity</a>(</div>
|
|
<div class="line"><a id="l00959" name="l00959"></a><span class="lineno"> 959</span> <span class="keywordtype">int</span> evaluator_index, int64_t slack_max,</div>
|
|
<div class="line"><a id="l00960" name="l00960"></a><span class="lineno"> 960</span> std::vector<int64_t> vehicle_capacities, <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div>
|
|
<div class="line"><a id="l00961" name="l00961"></a><span class="lineno"> 961</span> <span class="keyword">const</span> std::string& <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>) {</div>
|
|
<div class="line"><a id="l00962" name="l00962"></a><span class="lineno"> 962</span> <span class="keyword">const</span> std::vector<int> evaluator_indices(vehicles_, evaluator_index);</div>
|
|
<div class="line"><a id="l00963" name="l00963"></a><span class="lineno"> 963</span> <span class="keywordflow">return</span> AddDimensionWithCapacityInternal(evaluator_indices, slack_max,</div>
|
|
<div class="line"><a id="l00964" name="l00964"></a><span class="lineno"> 964</span> std::move(vehicle_capacities),</div>
|
|
<div class="line"><a id="l00965" name="l00965"></a><span class="lineno"> 965</span> fix_start_cumul_to_zero, <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>);</div>
|
|
<div class="line"><a id="l00966" name="l00966"></a><span class="lineno"> 966</span>}</div>
|
|
<div class="line"><a id="l00967" name="l00967"></a><span class="lineno"> 967</span> </div>
|
|
<div class="line"><a id="l00968" name="l00968"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#af6fa2d6d6bd7201d701efca7da040dd6"> 968</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#af6fa2d6d6bd7201d701efca7da040dd6">RoutingModel::AddDimensionWithVehicleTransitAndCapacity</a>(</div>
|
|
<div class="line"><a id="l00969" name="l00969"></a><span class="lineno"> 969</span> <span class="keyword">const</span> std::vector<int>& evaluator_indices, int64_t slack_max,</div>
|
|
<div class="line"><a id="l00970" name="l00970"></a><span class="lineno"> 970</span> std::vector<int64_t> vehicle_capacities, <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div>
|
|
<div class="line"><a id="l00971" name="l00971"></a><span class="lineno"> 971</span> <span class="keyword">const</span> std::string& <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>) {</div>
|
|
<div class="line"><a id="l00972" name="l00972"></a><span class="lineno"> 972</span> <span class="keywordflow">return</span> AddDimensionWithCapacityInternal(evaluator_indices, slack_max,</div>
|
|
<div class="line"><a id="l00973" name="l00973"></a><span class="lineno"> 973</span> std::move(vehicle_capacities),</div>
|
|
<div class="line"><a id="l00974" name="l00974"></a><span class="lineno"> 974</span> fix_start_cumul_to_zero, <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>);</div>
|
|
<div class="line"><a id="l00975" name="l00975"></a><span class="lineno"> 975</span>}</div>
|
|
<div class="line"><a id="l00976" name="l00976"></a><span class="lineno"> 976</span> </div>
|
|
<div class="line"><a id="l00977" name="l00977"></a><span class="lineno"> 977</span><span class="keywordtype">bool</span> RoutingModel::AddDimensionWithCapacityInternal(</div>
|
|
<div class="line"><a id="l00978" name="l00978"></a><span class="lineno"> 978</span> <span class="keyword">const</span> std::vector<int>& evaluator_indices, int64_t slack_max,</div>
|
|
<div class="line"><a id="l00979" name="l00979"></a><span class="lineno"> 979</span> std::vector<int64_t> vehicle_capacities, <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div>
|
|
<div class="line"><a id="l00980" name="l00980"></a><span class="lineno"> 980</span> <span class="keyword">const</span> std::string& <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>) {</div>
|
|
<div class="line"><a id="l00981" name="l00981"></a><span class="lineno"> 981</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(vehicles_, vehicle_capacities.size());</div>
|
|
<div class="line"><a id="l00982" name="l00982"></a><span class="lineno"> 982</span> <span class="keywordflow">return</span> InitializeDimensionInternal(</div>
|
|
<div class="line"><a id="l00983" name="l00983"></a><span class="lineno"> 983</span> evaluator_indices, std::vector<int>(), slack_max, fix_start_cumul_to_zero,</div>
|
|
<div class="line"><a id="l00984" name="l00984"></a><span class="lineno"> 984</span> <span class="keyword">new</span> <a class="code hl_friend" href="classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>(<span class="keyword">this</span>, std::move(vehicle_capacities), <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>, <span class="keyword">nullptr</span>));</div>
|
|
<div class="line"><a id="l00985" name="l00985"></a><span class="lineno"> 985</span>}</div>
|
|
<div class="line"><a id="l00986" name="l00986"></a><span class="lineno"> 986</span> </div>
|
|
<div class="line"><a id="l00987" name="l00987"></a><span class="lineno"> 987</span><span class="keywordtype">bool</span> RoutingModel::InitializeDimensionInternal(</div>
|
|
<div class="line"><a id="l00988" name="l00988"></a><span class="lineno"> 988</span> <span class="keyword">const</span> std::vector<int>& evaluator_indices,</div>
|
|
<div class="line"><a id="l00989" name="l00989"></a><span class="lineno"> 989</span> <span class="keyword">const</span> std::vector<int>& state_dependent_evaluator_indices,</div>
|
|
<div class="line"><a id="l00990" name="l00990"></a><span class="lineno"> 990</span> int64_t slack_max, <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div>
|
|
<div class="line"><a id="l00991" name="l00991"></a><span class="lineno"> 991</span> RoutingDimension* dimension) {</div>
|
|
<div class="line"><a id="l00992" name="l00992"></a><span class="lineno"> 992</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(dimension != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l00993" name="l00993"></a><span class="lineno"> 993</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(vehicles_, evaluator_indices.size());</div>
|
|
<div class="line"><a id="l00994" name="l00994"></a><span class="lineno"> 994</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>((dimension->base_dimension_ == <span class="keyword">nullptr</span> &&</div>
|
|
<div class="line"><a id="l00995" name="l00995"></a><span class="lineno"> 995</span> state_dependent_evaluator_indices.empty()) ||</div>
|
|
<div class="line"><a id="l00996" name="l00996"></a><span class="lineno"> 996</span> vehicles_ == state_dependent_evaluator_indices.size());</div>
|
|
<div class="line"><a id="l00997" name="l00997"></a><span class="lineno"> 997</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aea90b377b2cc45917a08d519be784009">HasDimension</a>(dimension->name())) {</div>
|
|
<div class="line"><a id="l00998" name="l00998"></a><span class="lineno"> 998</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce">DimensionIndex</a> dimension_index(dimensions_.size());</div>
|
|
<div class="line"><a id="l00999" name="l00999"></a><span class="lineno"> 999</span> dimension_name_to_index_[dimension->name()] = dimension_index;</div>
|
|
<div class="line"><a id="l01000" name="l01000"></a><span class="lineno"> 1000</span> dimensions_.push_back(dimension);</div>
|
|
<div class="line"><a id="l01001" name="l01001"></a><span class="lineno"> 1001</span> dimension->Initialize(evaluator_indices, state_dependent_evaluator_indices,</div>
|
|
<div class="line"><a id="l01002" name="l01002"></a><span class="lineno"> 1002</span> slack_max);</div>
|
|
<div class="line"><a id="l01003" name="l01003"></a><span class="lineno"> 1003</span> solver_->AddConstraint(solver_->MakeDelayedPathCumul(</div>
|
|
<div class="line"><a id="l01004" name="l01004"></a><span class="lineno"> 1004</span> nexts_, active_, dimension->cumuls(), dimension->transits()));</div>
|
|
<div class="line"><a id="l01005" name="l01005"></a><span class="lineno"> 1005</span> <span class="keywordflow">if</span> (fix_start_cumul_to_zero) {</div>
|
|
<div class="line"><a id="l01006" name="l01006"></a><span class="lineno"> 1006</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < vehicles_; ++i) {</div>
|
|
<div class="line"><a id="l01007" name="l01007"></a><span class="lineno"> 1007</span> IntVar* <span class="keyword">const</span> start_cumul = dimension->CumulVar(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(i));</div>
|
|
<div class="line"><a id="l01008" name="l01008"></a><span class="lineno"> 1008</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(0, start_cumul->Min());</div>
|
|
<div class="line"><a id="l01009" name="l01009"></a><span class="lineno"> 1009</span> start_cumul->SetValue(0);</div>
|
|
<div class="line"><a id="l01010" name="l01010"></a><span class="lineno"> 1010</span> }</div>
|
|
<div class="line"><a id="l01011" name="l01011"></a><span class="lineno"> 1011</span> }</div>
|
|
<div class="line"><a id="l01012" name="l01012"></a><span class="lineno"> 1012</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l01013" name="l01013"></a><span class="lineno"> 1013</span> }</div>
|
|
<div class="line"><a id="l01014" name="l01014"></a><span class="lineno"> 1014</span> <span class="keyword">delete</span> dimension;</div>
|
|
<div class="line"><a id="l01015" name="l01015"></a><span class="lineno"> 1015</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l01016" name="l01016"></a><span class="lineno"> 1016</span>}</div>
|
|
<div class="line"><a id="l01017" name="l01017"></a><span class="lineno"> 1017</span> </div>
|
|
<div class="line"><a id="l01018" name="l01018"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a646667a1b7c142fc9ac9471be43d12d1"> 1018</a></span>std::pair<int, bool> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a646667a1b7c142fc9ac9471be43d12d1">RoutingModel::AddConstantDimensionWithSlack</a>(</div>
|
|
<div class="line"><a id="l01019" name="l01019"></a><span class="lineno"> 1019</span> int64_t <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>, int64_t <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, int64_t slack_max,</div>
|
|
<div class="line"><a id="l01020" name="l01020"></a><span class="lineno"> 1020</span> <span class="keywordtype">bool</span> fix_start_cumul_to_zero, <span class="keyword">const</span> std::string& dimension_name) {</div>
|
|
<div class="line"><a id="l01021" name="l01021"></a><span class="lineno"> 1021</span> <span class="keyword">const</span> <span class="keywordtype">int</span> evaluator_index =</div>
|
|
<div class="line"><a id="l01022" name="l01022"></a><span class="lineno"> 1022</span> RegisterUnaryCallback([<a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>](int64_t) { <span class="keywordflow">return</span> <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>; },</div>
|
|
<div class="line"><a id="l01023" name="l01023"></a><span class="lineno"> 1023</span> <span class="comment">/*is_positive=*/</span><a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a> >= 0, <span class="keyword">this</span>);</div>
|
|
<div class="line"><a id="l01024" name="l01024"></a><span class="lineno"> 1024</span> <span class="keywordflow">return</span> std::make_pair(evaluator_index,</div>
|
|
<div class="line"><a id="l01025" name="l01025"></a><span class="lineno"> 1025</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afe7b5ce21d69c0cf5e8469a73988b0df">AddDimension</a>(evaluator_index, slack_max, <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>,</div>
|
|
<div class="line"><a id="l01026" name="l01026"></a><span class="lineno"> 1026</span> fix_start_cumul_to_zero, dimension_name));</div>
|
|
<div class="line"><a id="l01027" name="l01027"></a><span class="lineno"> 1027</span>}</div>
|
|
<div class="line"><a id="l01028" name="l01028"></a><span class="lineno"> 1028</span> </div>
|
|
<div class="line"><a id="l01029" name="l01029"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a34be40dba53068c0eb5c1f1fbb5966c0"> 1029</a></span>std::pair<int, bool> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a34be40dba53068c0eb5c1f1fbb5966c0">RoutingModel::AddVectorDimension</a>(</div>
|
|
<div class="line"><a id="l01030" name="l01030"></a><span class="lineno"> 1030</span> std::vector<int64_t> values, int64_t <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>, <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div>
|
|
<div class="line"><a id="l01031" name="l01031"></a><span class="lineno"> 1031</span> <span class="keyword">const</span> std::string& dimension_name) {</div>
|
|
<div class="line"><a id="l01032" name="l01032"></a><span class="lineno"> 1032</span> <span class="keyword">const</span> <span class="keywordtype">int</span> evaluator_index = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a558728d2399a362f2595455653edad02">RegisterUnaryTransitVector</a>(std::move(values));</div>
|
|
<div class="line"><a id="l01033" name="l01033"></a><span class="lineno"> 1033</span> <span class="keywordflow">return</span> std::make_pair(evaluator_index,</div>
|
|
<div class="line"><a id="l01034" name="l01034"></a><span class="lineno"> 1034</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afe7b5ce21d69c0cf5e8469a73988b0df">AddDimension</a>(evaluator_index, 0, <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>,</div>
|
|
<div class="line"><a id="l01035" name="l01035"></a><span class="lineno"> 1035</span> fix_start_cumul_to_zero, dimension_name));</div>
|
|
<div class="line"><a id="l01036" name="l01036"></a><span class="lineno"> 1036</span>}</div>
|
|
<div class="line"><a id="l01037" name="l01037"></a><span class="lineno"> 1037</span> </div>
|
|
<div class="line"><a id="l01038" name="l01038"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a1a976fc02875c6fbc766c8a67c8a2b93"> 1038</a></span>std::pair<int, bool> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a1a976fc02875c6fbc766c8a67c8a2b93">RoutingModel::AddMatrixDimension</a>(</div>
|
|
<div class="line"><a id="l01039" name="l01039"></a><span class="lineno"> 1039</span> std::vector<std::vector<int64_t>> values, int64_t <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>,</div>
|
|
<div class="line"><a id="l01040" name="l01040"></a><span class="lineno"> 1040</span> <span class="keywordtype">bool</span> fix_start_cumul_to_zero, <span class="keyword">const</span> std::string& dimension_name) {</div>
|
|
<div class="line"><a id="l01041" name="l01041"></a><span class="lineno"> 1041</span> <span class="keyword">const</span> <span class="keywordtype">int</span> evaluator_index = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#add1a60041c1f8ec87b492635be1c8704">RegisterTransitMatrix</a>(std::move(values));</div>
|
|
<div class="line"><a id="l01042" name="l01042"></a><span class="lineno"> 1042</span> <span class="keywordflow">return</span> std::make_pair(evaluator_index,</div>
|
|
<div class="line"><a id="l01043" name="l01043"></a><span class="lineno"> 1043</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afe7b5ce21d69c0cf5e8469a73988b0df">AddDimension</a>(evaluator_index, 0, <a class="code hl_variable" href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a>,</div>
|
|
<div class="line"><a id="l01044" name="l01044"></a><span class="lineno"> 1044</span> fix_start_cumul_to_zero, dimension_name));</div>
|
|
<div class="line"><a id="l01045" name="l01045"></a><span class="lineno"> 1045</span>}</div>
|
|
<div class="line"><a id="l01046" name="l01046"></a><span class="lineno"> 1046</span> </div>
|
|
<div class="line"><a id="l01047" name="l01047"></a><span class="lineno"> 1047</span><span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a id="l01048" name="l01048"></a><span class="lineno"> 1048</span><span class="comment">// RangeMakeElementExpr is an IntExpr that corresponds to a</span></div>
|
|
<div class="line"><a id="l01049" name="l01049"></a><span class="lineno"> 1049</span><span class="comment">// RangeIntToIntFunction indexed by an IntVar.</span></div>
|
|
<div class="line"><a id="l01050" name="l01050"></a><span class="lineno"> 1050</span><span class="comment">// Do not create this class dicretly, but rather use MakeRangeMakeElementExpr.</span></div>
|
|
<div class="line"><a id="l01051" name="l01051"></a><span class="lineno"> 1051</span><span class="keyword">class </span>RangeMakeElementExpr : <span class="keyword">public</span> <a class="code hl_class" href="classoperations__research_1_1_base_int_expr.html">BaseIntExpr</a> {</div>
|
|
<div class="line"><a id="l01052" name="l01052"></a><span class="lineno"> 1052</span> <span class="keyword">public</span>:</div>
|
|
<div class="line"><a id="l01053" name="l01053"></a><span class="lineno"> 1053</span> RangeMakeElementExpr(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_range_int_to_int_function.html">RangeIntToIntFunction</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>, <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>,</div>
|
|
<div class="line"><a id="l01054" name="l01054"></a><span class="lineno"> 1054</span> <a class="code hl_class" href="classoperations__research_1_1_solver.html">Solver</a>* s)</div>
|
|
<div class="line"><a id="l01055" name="l01055"></a><span class="lineno"> 1055</span> : <a class="code hl_class" href="classoperations__research_1_1_base_int_expr.html">BaseIntExpr</a>(s), callback_(<a class="code hl_define" href="base_2logging_8h.html#aeef651f886eb5252c08835194213efe2">ABSL_DIE_IF_NULL</a>(<a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>)), index_(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>) {</div>
|
|
<div class="line"><a id="l01056" name="l01056"></a><span class="lineno"> 1056</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(callback_ != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l01057" name="l01057"></a><span class="lineno"> 1057</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l01058" name="l01058"></a><span class="lineno"> 1058</span> }</div>
|
|
<div class="line"><a id="l01059" name="l01059"></a><span class="lineno"> 1059</span> </div>
|
|
<div class="line"><a id="l01060" name="l01060"></a><span class="lineno"> 1060</span> int64_t Min()<span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a id="l01061" name="l01061"></a><span class="lineno"> 1061</span> <span class="comment">// Converting [index_->Min(), index_->Max()] to [idx_min, idx_max).</span></div>
|
|
<div class="line"><a id="l01062" name="l01062"></a><span class="lineno"> 1062</span> <span class="keyword">const</span> <span class="keywordtype">int</span> idx_min = index_->Min();</div>
|
|
<div class="line"><a id="l01063" name="l01063"></a><span class="lineno"> 1063</span> <span class="keyword">const</span> <span class="keywordtype">int</span> idx_max = index_->Max() + 1;</div>
|
|
<div class="line"><a id="l01064" name="l01064"></a><span class="lineno"> 1064</span> <span class="keywordflow">return</span> (idx_min < idx_max) ? callback_->RangeMin(idx_min, idx_max)</div>
|
|
<div class="line"><a id="l01065" name="l01065"></a><span class="lineno"> 1065</span> : <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>();</div>
|
|
<div class="line"><a id="l01066" name="l01066"></a><span class="lineno"> 1066</span> }</div>
|
|
<div class="line"><a id="l01067" name="l01067"></a><span class="lineno"> 1067</span> <span class="keywordtype">void</span> SetMin(int64_t new_min)<span class="keyword"> override </span>{</div>
|
|
<div class="line"><a id="l01068" name="l01068"></a><span class="lineno"> 1068</span> <span class="keyword">const</span> int64_t old_min = Min();</div>
|
|
<div class="line"><a id="l01069" name="l01069"></a><span class="lineno"> 1069</span> <span class="keyword">const</span> int64_t old_max = Max();</div>
|
|
<div class="line"><a id="l01070" name="l01070"></a><span class="lineno"> 1070</span> <span class="keywordflow">if</span> (old_min < new_min && new_min <= old_max) {</div>
|
|
<div class="line"><a id="l01071" name="l01071"></a><span class="lineno"> 1071</span> <span class="keyword">const</span> int64_t old_idx_min = index_->Min();</div>
|
|
<div class="line"><a id="l01072" name="l01072"></a><span class="lineno"> 1072</span> <span class="keyword">const</span> int64_t old_idx_max = index_->Max() + 1;</div>
|
|
<div class="line"><a id="l01073" name="l01073"></a><span class="lineno"> 1073</span> <span class="keywordflow">if</span> (old_idx_min < old_idx_max) {</div>
|
|
<div class="line"><a id="l01074" name="l01074"></a><span class="lineno"> 1074</span> <span class="keyword">const</span> int64_t new_idx_min = callback_->RangeFirstInsideInterval(</div>
|
|
<div class="line"><a id="l01075" name="l01075"></a><span class="lineno"> 1075</span> old_idx_min, old_idx_max, new_min, old_max + 1);</div>
|
|
<div class="line"><a id="l01076" name="l01076"></a><span class="lineno"> 1076</span> index_->SetMin(new_idx_min);</div>
|
|
<div class="line"><a id="l01077" name="l01077"></a><span class="lineno"> 1077</span> <span class="keywordflow">if</span> (new_idx_min < old_idx_max) {</div>
|
|
<div class="line"><a id="l01078" name="l01078"></a><span class="lineno"> 1078</span> <span class="keyword">const</span> int64_t new_idx_max = callback_->RangeLastInsideInterval(</div>
|
|
<div class="line"><a id="l01079" name="l01079"></a><span class="lineno"> 1079</span> new_idx_min, old_idx_max, new_min, old_max + 1);</div>
|
|
<div class="line"><a id="l01080" name="l01080"></a><span class="lineno"> 1080</span> index_->SetMax(new_idx_max);</div>
|
|
<div class="line"><a id="l01081" name="l01081"></a><span class="lineno"> 1081</span> }</div>
|
|
<div class="line"><a id="l01082" name="l01082"></a><span class="lineno"> 1082</span> }</div>
|
|
<div class="line"><a id="l01083" name="l01083"></a><span class="lineno"> 1083</span> }</div>
|
|
<div class="line"><a id="l01084" name="l01084"></a><span class="lineno"> 1084</span> }</div>
|
|
<div class="line"><a id="l01085" name="l01085"></a><span class="lineno"> 1085</span> int64_t Max()<span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a id="l01086" name="l01086"></a><span class="lineno"> 1086</span> <span class="comment">// Converting [index_->Min(), index_->Max()] to [idx_min, idx_max).</span></div>
|
|
<div class="line"><a id="l01087" name="l01087"></a><span class="lineno"> 1087</span> <span class="keyword">const</span> <span class="keywordtype">int</span> idx_min = index_->Min();</div>
|
|
<div class="line"><a id="l01088" name="l01088"></a><span class="lineno"> 1088</span> <span class="keyword">const</span> <span class="keywordtype">int</span> idx_max = index_->Max() + 1;</div>
|
|
<div class="line"><a id="l01089" name="l01089"></a><span class="lineno"> 1089</span> <span class="keywordflow">return</span> (idx_min < idx_max) ? callback_->RangeMax(idx_min, idx_max)</div>
|
|
<div class="line"><a id="l01090" name="l01090"></a><span class="lineno"> 1090</span> : <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits<int64_t>::min</a>();</div>
|
|
<div class="line"><a id="l01091" name="l01091"></a><span class="lineno"> 1091</span> }</div>
|
|
<div class="line"><a id="l01092" name="l01092"></a><span class="lineno"> 1092</span> <span class="keywordtype">void</span> SetMax(int64_t new_max)<span class="keyword"> override </span>{</div>
|
|
<div class="line"><a id="l01093" name="l01093"></a><span class="lineno"> 1093</span> <span class="keyword">const</span> int64_t old_min = Min();</div>
|
|
<div class="line"><a id="l01094" name="l01094"></a><span class="lineno"> 1094</span> <span class="keyword">const</span> int64_t old_max = Max();</div>
|
|
<div class="line"><a id="l01095" name="l01095"></a><span class="lineno"> 1095</span> <span class="keywordflow">if</span> (old_min <= new_max && new_max < old_max) {</div>
|
|
<div class="line"><a id="l01096" name="l01096"></a><span class="lineno"> 1096</span> <span class="keyword">const</span> int64_t old_idx_min = index_->Min();</div>
|
|
<div class="line"><a id="l01097" name="l01097"></a><span class="lineno"> 1097</span> <span class="keyword">const</span> int64_t old_idx_max = index_->Max() + 1;</div>
|
|
<div class="line"><a id="l01098" name="l01098"></a><span class="lineno"> 1098</span> <span class="keywordflow">if</span> (old_idx_min < old_idx_max) {</div>
|
|
<div class="line"><a id="l01099" name="l01099"></a><span class="lineno"> 1099</span> <span class="keyword">const</span> int64_t new_idx_min = callback_->RangeFirstInsideInterval(</div>
|
|
<div class="line"><a id="l01100" name="l01100"></a><span class="lineno"> 1100</span> old_idx_min, old_idx_max, old_min, new_max + 1);</div>
|
|
<div class="line"><a id="l01101" name="l01101"></a><span class="lineno"> 1101</span> index_->SetMin(new_idx_min);</div>
|
|
<div class="line"><a id="l01102" name="l01102"></a><span class="lineno"> 1102</span> <span class="keywordflow">if</span> (new_idx_min < old_idx_max) {</div>
|
|
<div class="line"><a id="l01103" name="l01103"></a><span class="lineno"> 1103</span> <span class="keyword">const</span> int64_t new_idx_max = callback_->RangeLastInsideInterval(</div>
|
|
<div class="line"><a id="l01104" name="l01104"></a><span class="lineno"> 1104</span> new_idx_min, old_idx_max, old_min, new_max + 1);</div>
|
|
<div class="line"><a id="l01105" name="l01105"></a><span class="lineno"> 1105</span> index_->SetMax(new_idx_max);</div>
|
|
<div class="line"><a id="l01106" name="l01106"></a><span class="lineno"> 1106</span> }</div>
|
|
<div class="line"><a id="l01107" name="l01107"></a><span class="lineno"> 1107</span> }</div>
|
|
<div class="line"><a id="l01108" name="l01108"></a><span class="lineno"> 1108</span> }</div>
|
|
<div class="line"><a id="l01109" name="l01109"></a><span class="lineno"> 1109</span> }</div>
|
|
<div class="line"><a id="l01110" name="l01110"></a><span class="lineno"> 1110</span> <span class="keywordtype">void</span> WhenRange(Demon* d)<span class="keyword"> override </span>{ index_->WhenRange(d); }</div>
|
|
<div class="line"><a id="l01111" name="l01111"></a><span class="lineno"> 1111</span> </div>
|
|
<div class="line"><a id="l01112" name="l01112"></a><span class="lineno"> 1112</span> <span class="keyword">private</span>:</div>
|
|
<div class="line"><a id="l01113" name="l01113"></a><span class="lineno"> 1113</span> <span class="keyword">const</span> RangeIntToIntFunction* <span class="keyword">const</span> callback_;</div>
|
|
<div class="line"><a id="l01114" name="l01114"></a><span class="lineno"> 1114</span> IntVar* <span class="keyword">const</span> index_;</div>
|
|
<div class="line"><a id="l01115" name="l01115"></a><span class="lineno"> 1115</span>};</div>
|
|
<div class="line"><a id="l01116" name="l01116"></a><span class="lineno"> 1116</span> </div>
|
|
<div class="line"><a id="l01117" name="l01117"></a><span class="lineno"> 1117</span>IntExpr* MakeRangeMakeElementExpr(<span class="keyword">const</span> RangeIntToIntFunction* <a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>,</div>
|
|
<div class="line"><a id="l01118" name="l01118"></a><span class="lineno"> 1118</span> IntVar* <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>, Solver* s) {</div>
|
|
<div class="line"><a id="l01119" name="l01119"></a><span class="lineno"> 1119</span> <span class="keywordflow">return</span> s->RegisterIntExpr(</div>
|
|
<div class="line"><a id="l01120" name="l01120"></a><span class="lineno"> 1120</span> s->RevAlloc(<span class="keyword">new</span> RangeMakeElementExpr(<a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>, <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>, s)));</div>
|
|
<div class="line"><a id="l01121" name="l01121"></a><span class="lineno"> 1121</span>}</div>
|
|
<div class="line"><a id="l01122" name="l01122"></a><span class="lineno"> 1122</span>} <span class="comment">// namespace</span></div>
|
|
<div class="line"><a id="l01123" name="l01123"></a><span class="lineno"> 1123</span> </div>
|
|
<div class="line"><a id="l01124" name="l01124"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a29d89e72de5dd5b4faa176e24298c48a"> 1124</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a102980a19e062b6a1b0b89f119d64e67">RoutingModel::AddDimensionDependentDimensionWithVehicleCapacity</a>(</div>
|
|
<div class="line"><a id="l01125" name="l01125"></a><span class="lineno"> 1125</span> <span class="keyword">const</span> std::vector<int>& dependent_transits,</div>
|
|
<div class="line"><a id="l01126" name="l01126"></a><span class="lineno"> 1126</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* base_dimension, int64_t slack_max,</div>
|
|
<div class="line"><a id="l01127" name="l01127"></a><span class="lineno"> 1127</span> std::vector<int64_t> vehicle_capacities, <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div>
|
|
<div class="line"><a id="l01128" name="l01128"></a><span class="lineno"> 1128</span> <span class="keyword">const</span> std::string& <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>) {</div>
|
|
<div class="line"><a id="l01129" name="l01129"></a><span class="lineno"> 1129</span> <span class="keyword">const</span> std::vector<int> pure_transits(vehicles_, <span class="comment">/*zero_evaluator*/</span> 0);</div>
|
|
<div class="line"><a id="l01130" name="l01130"></a><span class="lineno"> 1130</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a102980a19e062b6a1b0b89f119d64e67">AddDimensionDependentDimensionWithVehicleCapacity</a>(</div>
|
|
<div class="line"><a id="l01131" name="l01131"></a><span class="lineno"> 1131</span> pure_transits, dependent_transits, base_dimension, slack_max,</div>
|
|
<div class="line"><a id="l01132" name="l01132"></a><span class="lineno"> 1132</span> std::move(vehicle_capacities), fix_start_cumul_to_zero, <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>);</div>
|
|
<div class="line"><a id="l01133" name="l01133"></a><span class="lineno"> 1133</span>}</div>
|
|
<div class="line"><a id="l01134" name="l01134"></a><span class="lineno"> 1134</span> </div>
|
|
<div class="line"><a id="l01135" name="l01135"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a23b9ed9eee4280a48f9c9231d5768ad9"> 1135</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a102980a19e062b6a1b0b89f119d64e67">RoutingModel::AddDimensionDependentDimensionWithVehicleCapacity</a>(</div>
|
|
<div class="line"><a id="l01136" name="l01136"></a><span class="lineno"> 1136</span> <span class="keywordtype">int</span> transit, <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* dimension, int64_t slack_max,</div>
|
|
<div class="line"><a id="l01137" name="l01137"></a><span class="lineno"> 1137</span> int64_t vehicle_capacity, <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div>
|
|
<div class="line"><a id="l01138" name="l01138"></a><span class="lineno"> 1138</span> <span class="keyword">const</span> std::string& <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>) {</div>
|
|
<div class="line"><a id="l01139" name="l01139"></a><span class="lineno"> 1139</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a102980a19e062b6a1b0b89f119d64e67">AddDimensionDependentDimensionWithVehicleCapacity</a>(</div>
|
|
<div class="line"><a id="l01140" name="l01140"></a><span class="lineno"> 1140</span> <span class="comment">/*zero_evaluator*/</span> 0, transit, dimension, slack_max, vehicle_capacity,</div>
|
|
<div class="line"><a id="l01141" name="l01141"></a><span class="lineno"> 1141</span> fix_start_cumul_to_zero, <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>);</div>
|
|
<div class="line"><a id="l01142" name="l01142"></a><span class="lineno"> 1142</span>}</div>
|
|
<div class="line"><a id="l01143" name="l01143"></a><span class="lineno"> 1143</span> </div>
|
|
<div class="line"><a id="l01144" name="l01144"></a><span class="lineno"> 1144</span><span class="keywordtype">bool</span> RoutingModel::AddDimensionDependentDimensionWithVehicleCapacityInternal(</div>
|
|
<div class="line"><a id="l01145" name="l01145"></a><span class="lineno"> 1145</span> <span class="keyword">const</span> std::vector<int>& pure_transits,</div>
|
|
<div class="line"><a id="l01146" name="l01146"></a><span class="lineno"> 1146</span> <span class="keyword">const</span> std::vector<int>& dependent_transits,</div>
|
|
<div class="line"><a id="l01147" name="l01147"></a><span class="lineno"> 1147</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* base_dimension, int64_t slack_max,</div>
|
|
<div class="line"><a id="l01148" name="l01148"></a><span class="lineno"> 1148</span> std::vector<int64_t> vehicle_capacities, <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div>
|
|
<div class="line"><a id="l01149" name="l01149"></a><span class="lineno"> 1149</span> <span class="keyword">const</span> std::string& <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>) {</div>
|
|
<div class="line"><a id="l01150" name="l01150"></a><span class="lineno"> 1150</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(vehicles_, vehicle_capacities.size());</div>
|
|
<div class="line"><a id="l01151" name="l01151"></a><span class="lineno"> 1151</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* new_dimension = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l01152" name="l01152"></a><span class="lineno"> 1152</span> <span class="keywordflow">if</span> (base_dimension == <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l01153" name="l01153"></a><span class="lineno"> 1153</span> new_dimension = <span class="keyword">new</span> <a class="code hl_friend" href="classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>(<span class="keyword">this</span>, std::move(vehicle_capacities),</div>
|
|
<div class="line"><a id="l01154" name="l01154"></a><span class="lineno"> 1154</span> <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>, RoutingDimension::SelfBased());</div>
|
|
<div class="line"><a id="l01155" name="l01155"></a><span class="lineno"> 1155</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l01156" name="l01156"></a><span class="lineno"> 1156</span> new_dimension = <span class="keyword">new</span> <a class="code hl_friend" href="classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>(<span class="keyword">this</span>, std::move(vehicle_capacities),</div>
|
|
<div class="line"><a id="l01157" name="l01157"></a><span class="lineno"> 1157</span> <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>, base_dimension);</div>
|
|
<div class="line"><a id="l01158" name="l01158"></a><span class="lineno"> 1158</span> }</div>
|
|
<div class="line"><a id="l01159" name="l01159"></a><span class="lineno"> 1159</span> <span class="keywordflow">return</span> InitializeDimensionInternal(pure_transits, dependent_transits,</div>
|
|
<div class="line"><a id="l01160" name="l01160"></a><span class="lineno"> 1160</span> slack_max, fix_start_cumul_to_zero,</div>
|
|
<div class="line"><a id="l01161" name="l01161"></a><span class="lineno"> 1161</span> new_dimension);</div>
|
|
<div class="line"><a id="l01162" name="l01162"></a><span class="lineno"> 1162</span>}</div>
|
|
<div class="line"><a id="l01163" name="l01163"></a><span class="lineno"> 1163</span> </div>
|
|
<div class="line"><a id="l01164" name="l01164"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#aef72ecc78425383c931a66caa21d15e2"> 1164</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a102980a19e062b6a1b0b89f119d64e67">RoutingModel::AddDimensionDependentDimensionWithVehicleCapacity</a>(</div>
|
|
<div class="line"><a id="l01165" name="l01165"></a><span class="lineno"> 1165</span> <span class="keywordtype">int</span> pure_transit, <span class="keywordtype">int</span> dependent_transit,</div>
|
|
<div class="line"><a id="l01166" name="l01166"></a><span class="lineno"> 1166</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* base_dimension, int64_t slack_max,</div>
|
|
<div class="line"><a id="l01167" name="l01167"></a><span class="lineno"> 1167</span> int64_t vehicle_capacity, <span class="keywordtype">bool</span> fix_start_cumul_to_zero,</div>
|
|
<div class="line"><a id="l01168" name="l01168"></a><span class="lineno"> 1168</span> <span class="keyword">const</span> std::string& <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>) {</div>
|
|
<div class="line"><a id="l01169" name="l01169"></a><span class="lineno"> 1169</span> std::vector<int> pure_transits(vehicles_, pure_transit);</div>
|
|
<div class="line"><a id="l01170" name="l01170"></a><span class="lineno"> 1170</span> std::vector<int> dependent_transits(vehicles_, dependent_transit);</div>
|
|
<div class="line"><a id="l01171" name="l01171"></a><span class="lineno"> 1171</span> std::vector<int64_t> vehicle_capacities(vehicles_, vehicle_capacity);</div>
|
|
<div class="line"><a id="l01172" name="l01172"></a><span class="lineno"> 1172</span> <span class="keywordflow">return</span> AddDimensionDependentDimensionWithVehicleCapacityInternal(</div>
|
|
<div class="line"><a id="l01173" name="l01173"></a><span class="lineno"> 1173</span> pure_transits, dependent_transits, base_dimension, slack_max,</div>
|
|
<div class="line"><a id="l01174" name="l01174"></a><span class="lineno"> 1174</span> std::move(vehicle_capacities), fix_start_cumul_to_zero, <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>);</div>
|
|
<div class="line"><a id="l01175" name="l01175"></a><span class="lineno"> 1175</span>}</div>
|
|
<div class="line"><a id="l01176" name="l01176"></a><span class="lineno"> 1176</span> </div>
|
|
<div class="line"><a id="l01177" name="l01177"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#ac8c094ea0f03a3c394140698e0ce7ffd"> 1177</a></span><a class="code hl_struct" href="structoperations__research_1_1_routing_model_1_1_state_dependent_transit.html">RoutingModel::StateDependentTransit</a> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ac8c094ea0f03a3c394140698e0ce7ffd">RoutingModel::MakeStateDependentTransit</a>(</div>
|
|
<div class="line"><a id="l01178" name="l01178"></a><span class="lineno"> 1178</span> <span class="keyword">const</span> std::function<int64_t(int64_t)>& f, int64_t domain_start,</div>
|
|
<div class="line"><a id="l01179" name="l01179"></a><span class="lineno"> 1179</span> int64_t domain_end) {</div>
|
|
<div class="line"><a id="l01180" name="l01180"></a><span class="lineno"> 1180</span> <span class="keyword">const</span> std::function<int64_t(int64_t)> g = [&f](int64_t x) {</div>
|
|
<div class="line"><a id="l01181" name="l01181"></a><span class="lineno"> 1181</span> <span class="keywordflow">return</span> f(x) + x;</div>
|
|
<div class="line"><a id="l01182" name="l01182"></a><span class="lineno"> 1182</span> };</div>
|
|
<div class="line"><a id="l01183" name="l01183"></a><span class="lineno"> 1183</span> <span class="comment">// The next line is safe, because MakeCachedIntToIntFunction does not count</span></div>
|
|
<div class="line"><a id="l01184" name="l01184"></a><span class="lineno"> 1184</span> <span class="comment">// on keeping the closure of its first argument alive.</span></div>
|
|
<div class="line"><a id="l01185" name="l01185"></a><span class="lineno"> 1185</span> <span class="keywordflow">return</span> {<a class="code hl_function" href="namespaceoperations__research.html#a15e668e6078014aa160c39782f916322">MakeCachedIntToIntFunction</a>(f, domain_start, domain_end),</div>
|
|
<div class="line"><a id="l01186" name="l01186"></a><span class="lineno"> 1186</span> <a class="code hl_function" href="namespaceoperations__research.html#a59955a2e2c2b28075cdc795f99df6134">MakeCachedRangeMinMaxIndexFunction</a>(g, domain_start, domain_end)};</div>
|
|
<div class="line"><a id="l01187" name="l01187"></a><span class="lineno"> 1187</span>}</div>
|
|
<div class="line"><a id="l01188" name="l01188"></a><span class="lineno"> 1188</span> </div>
|
|
<div class="line"><a id="l01189" name="l01189"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a644ab247b579b93e9a3b1ecd96ba415c"> 1189</a></span>std::vector<std::string> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a644ab247b579b93e9a3b1ecd96ba415c">RoutingModel::GetAllDimensionNames</a>()<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01190" name="l01190"></a><span class="lineno"> 1190</span> std::vector<std::string> dimension_names;</div>
|
|
<div class="line"><a id="l01191" name="l01191"></a><span class="lineno"> 1191</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>& dimension_name_index : dimension_name_to_index_) {</div>
|
|
<div class="line"><a id="l01192" name="l01192"></a><span class="lineno"> 1192</span> dimension_names.push_back(dimension_name_index.first);</div>
|
|
<div class="line"><a id="l01193" name="l01193"></a><span class="lineno"> 1193</span> }</div>
|
|
<div class="line"><a id="l01194" name="l01194"></a><span class="lineno"> 1194</span> std::sort(dimension_names.begin(), dimension_names.end());</div>
|
|
<div class="line"><a id="l01195" name="l01195"></a><span class="lineno"> 1195</span> <span class="keywordflow">return</span> dimension_names;</div>
|
|
<div class="line"><a id="l01196" name="l01196"></a><span class="lineno"> 1196</span>}</div>
|
|
<div class="line"><a id="l01197" name="l01197"></a><span class="lineno"> 1197</span> </div>
|
|
<div class="line"><a id="l01198" name="l01198"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#abac1ff6e7eaa5e1ec6e86e726cce3d90"> 1198</a></span><a class="code hl_class" href="classoperations__research_1_1_global_dimension_cumul_optimizer.html">GlobalDimensionCumulOptimizer</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#abac1ff6e7eaa5e1ec6e86e726cce3d90">RoutingModel::GetMutableGlobalCumulOptimizer</a>(</div>
|
|
<div class="line"><a id="l01199" name="l01199"></a><span class="lineno"> 1199</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>& dimension)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01200" name="l01200"></a><span class="lineno"> 1200</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce">DimensionIndex</a> dim_index = GetDimensionIndex(dimension.<a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a24dcbf29c0d6cd766009a182a6484e3b">name</a>());</div>
|
|
<div class="line"><a id="l01201" name="l01201"></a><span class="lineno"> 1201</span> <span class="keywordflow">if</span> (dim_index < 0 || dim_index >= global_optimizer_index_.size() ||</div>
|
|
<div class="line"><a id="l01202" name="l01202"></a><span class="lineno"> 1202</span> global_optimizer_index_[dim_index] < 0) {</div>
|
|
<div class="line"><a id="l01203" name="l01203"></a><span class="lineno"> 1203</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l01204" name="l01204"></a><span class="lineno"> 1204</span> }</div>
|
|
<div class="line"><a id="l01205" name="l01205"></a><span class="lineno"> 1205</span> <span class="keyword">const</span> <span class="keywordtype">int</span> optimizer_index = global_optimizer_index_[dim_index];</div>
|
|
<div class="line"><a id="l01206" name="l01206"></a><span class="lineno"> 1206</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(optimizer_index, global_dimension_optimizers_.size());</div>
|
|
<div class="line"><a id="l01207" name="l01207"></a><span class="lineno"> 1207</span> <span class="keywordflow">return</span> global_dimension_optimizers_[optimizer_index].get();</div>
|
|
<div class="line"><a id="l01208" name="l01208"></a><span class="lineno"> 1208</span>}</div>
|
|
<div class="line"><a id="l01209" name="l01209"></a><span class="lineno"> 1209</span> </div>
|
|
<div class="line"><a id="l01210" name="l01210"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a4aa17dcb68bcfcfa4c6c0088f5155da8"> 1210</a></span><a class="code hl_class" href="classoperations__research_1_1_global_dimension_cumul_optimizer.html">GlobalDimensionCumulOptimizer</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a4aa17dcb68bcfcfa4c6c0088f5155da8">RoutingModel::GetMutableGlobalCumulMPOptimizer</a>(</div>
|
|
<div class="line"><a id="l01211" name="l01211"></a><span class="lineno"> 1211</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>& dimension)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01212" name="l01212"></a><span class="lineno"> 1212</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce">DimensionIndex</a> dim_index = GetDimensionIndex(dimension.<a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a24dcbf29c0d6cd766009a182a6484e3b">name</a>());</div>
|
|
<div class="line"><a id="l01213" name="l01213"></a><span class="lineno"> 1213</span> <span class="keywordflow">if</span> (dim_index < 0 || dim_index >= global_optimizer_index_.size() ||</div>
|
|
<div class="line"><a id="l01214" name="l01214"></a><span class="lineno"> 1214</span> global_optimizer_index_[dim_index] < 0) {</div>
|
|
<div class="line"><a id="l01215" name="l01215"></a><span class="lineno"> 1215</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l01216" name="l01216"></a><span class="lineno"> 1216</span> }</div>
|
|
<div class="line"><a id="l01217" name="l01217"></a><span class="lineno"> 1217</span> <span class="keyword">const</span> <span class="keywordtype">int</span> optimizer_index = global_optimizer_index_[dim_index];</div>
|
|
<div class="line"><a id="l01218" name="l01218"></a><span class="lineno"> 1218</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(optimizer_index, global_dimension_mp_optimizers_.size());</div>
|
|
<div class="line"><a id="l01219" name="l01219"></a><span class="lineno"> 1219</span> <span class="keywordflow">return</span> global_dimension_mp_optimizers_[optimizer_index].get();</div>
|
|
<div class="line"><a id="l01220" name="l01220"></a><span class="lineno"> 1220</span>}</div>
|
|
<div class="line"><a id="l01221" name="l01221"></a><span class="lineno"> 1221</span> </div>
|
|
<div class="line"><a id="l01222" name="l01222"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a54dbca44a148f9d6d37d4938d686b838"> 1222</a></span><a class="code hl_class" href="classoperations__research_1_1_local_dimension_cumul_optimizer.html">LocalDimensionCumulOptimizer</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a54dbca44a148f9d6d37d4938d686b838">RoutingModel::GetMutableLocalCumulOptimizer</a>(</div>
|
|
<div class="line"><a id="l01223" name="l01223"></a><span class="lineno"> 1223</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>& dimension)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01224" name="l01224"></a><span class="lineno"> 1224</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce">DimensionIndex</a> dim_index = GetDimensionIndex(dimension.<a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a24dcbf29c0d6cd766009a182a6484e3b">name</a>());</div>
|
|
<div class="line"><a id="l01225" name="l01225"></a><span class="lineno"> 1225</span> <span class="keywordflow">if</span> (dim_index < 0 || dim_index >= local_optimizer_index_.size() ||</div>
|
|
<div class="line"><a id="l01226" name="l01226"></a><span class="lineno"> 1226</span> local_optimizer_index_[dim_index] < 0) {</div>
|
|
<div class="line"><a id="l01227" name="l01227"></a><span class="lineno"> 1227</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l01228" name="l01228"></a><span class="lineno"> 1228</span> }</div>
|
|
<div class="line"><a id="l01229" name="l01229"></a><span class="lineno"> 1229</span> <span class="keyword">const</span> <span class="keywordtype">int</span> optimizer_index = local_optimizer_index_[dim_index];</div>
|
|
<div class="line"><a id="l01230" name="l01230"></a><span class="lineno"> 1230</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(optimizer_index, local_dimension_optimizers_.size());</div>
|
|
<div class="line"><a id="l01231" name="l01231"></a><span class="lineno"> 1231</span> <span class="keywordflow">return</span> local_dimension_optimizers_[optimizer_index].get();</div>
|
|
<div class="line"><a id="l01232" name="l01232"></a><span class="lineno"> 1232</span>}</div>
|
|
<div class="line"><a id="l01233" name="l01233"></a><span class="lineno"> 1233</span> </div>
|
|
<div class="line"><a id="l01234" name="l01234"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a9b9a92ffb451f19ec773b0543b3f2497"> 1234</a></span><a class="code hl_class" href="classoperations__research_1_1_local_dimension_cumul_optimizer.html">LocalDimensionCumulOptimizer</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a9b9a92ffb451f19ec773b0543b3f2497">RoutingModel::GetMutableLocalCumulMPOptimizer</a>(</div>
|
|
<div class="line"><a id="l01235" name="l01235"></a><span class="lineno"> 1235</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>& dimension)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01236" name="l01236"></a><span class="lineno"> 1236</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce">DimensionIndex</a> dim_index = GetDimensionIndex(dimension.<a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a24dcbf29c0d6cd766009a182a6484e3b">name</a>());</div>
|
|
<div class="line"><a id="l01237" name="l01237"></a><span class="lineno"> 1237</span> <span class="keywordflow">if</span> (dim_index < 0 || dim_index >= local_optimizer_index_.size() ||</div>
|
|
<div class="line"><a id="l01238" name="l01238"></a><span class="lineno"> 1238</span> local_optimizer_index_[dim_index] < 0) {</div>
|
|
<div class="line"><a id="l01239" name="l01239"></a><span class="lineno"> 1239</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l01240" name="l01240"></a><span class="lineno"> 1240</span> }</div>
|
|
<div class="line"><a id="l01241" name="l01241"></a><span class="lineno"> 1241</span> <span class="keyword">const</span> <span class="keywordtype">int</span> optimizer_index = local_optimizer_index_[dim_index];</div>
|
|
<div class="line"><a id="l01242" name="l01242"></a><span class="lineno"> 1242</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(optimizer_index, local_dimension_mp_optimizers_.size());</div>
|
|
<div class="line"><a id="l01243" name="l01243"></a><span class="lineno"> 1243</span> <span class="keywordflow">return</span> local_dimension_mp_optimizers_[optimizer_index].get();</div>
|
|
<div class="line"><a id="l01244" name="l01244"></a><span class="lineno"> 1244</span>}</div>
|
|
<div class="line"><a id="l01245" name="l01245"></a><span class="lineno"> 1245</span> </div>
|
|
<div class="line"><a id="l01246" name="l01246"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#aea90b377b2cc45917a08d519be784009"> 1246</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aea90b377b2cc45917a08d519be784009">RoutingModel::HasDimension</a>(<span class="keyword">const</span> std::string& dimension_name)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01247" name="l01247"></a><span class="lineno"> 1247</span> <span class="keywordflow">return</span> <a class="code hl_function" href="namespacegtl.html#aae28e97bd1fa93cb0032642550da7455">gtl::ContainsKey</a>(dimension_name_to_index_, dimension_name);</div>
|
|
<div class="line"><a id="l01248" name="l01248"></a><span class="lineno"> 1248</span>}</div>
|
|
<div class="line"><a id="l01249" name="l01249"></a><span class="lineno"> 1249</span> </div>
|
|
<div class="line"><a id="l01250" name="l01250"></a><span class="lineno"> 1250</span><a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce">RoutingModel::DimensionIndex</a> RoutingModel::GetDimensionIndex(</div>
|
|
<div class="line"><a id="l01251" name="l01251"></a><span class="lineno"> 1251</span> <span class="keyword">const</span> std::string& dimension_name)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01252" name="l01252"></a><span class="lineno"> 1252</span> <span class="keywordflow">return</span> <a class="code hl_function" href="namespacegtl.html#a795ebdb62731938c8c31b221f0f074b4">gtl::FindWithDefault</a>(dimension_name_to_index_, dimension_name,</div>
|
|
<div class="line"><a id="l01253" name="l01253"></a><span class="lineno"> 1253</span> <a class="code hl_variable" href="classoperations__research_1_1_routing_model.html#ae00630e36d2d8a2fa7eb4743a65e80d1">kNoDimension</a>);</div>
|
|
<div class="line"><a id="l01254" name="l01254"></a><span class="lineno"> 1254</span>}</div>
|
|
<div class="line"><a id="l01255" name="l01255"></a><span class="lineno"> 1255</span> </div>
|
|
<div class="line"><a id="l01256" name="l01256"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#aff7724c6a1de20cd5369108e3db5fc76"> 1256</a></span><span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>& <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aff7724c6a1de20cd5369108e3db5fc76">RoutingModel::GetDimensionOrDie</a>(</div>
|
|
<div class="line"><a id="l01257" name="l01257"></a><span class="lineno"> 1257</span> <span class="keyword">const</span> std::string& dimension_name)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01258" name="l01258"></a><span class="lineno"> 1258</span> <span class="keywordflow">return</span> *dimensions_[<a class="code hl_function" href="namespacegtl.html#a73f41ac11336b94768fdd41594153d59">gtl::FindOrDie</a>(dimension_name_to_index_, dimension_name)];</div>
|
|
<div class="line"><a id="l01259" name="l01259"></a><span class="lineno"> 1259</span>}</div>
|
|
<div class="line"><a id="l01260" name="l01260"></a><span class="lineno"> 1260</span> </div>
|
|
<div class="line"><a id="l01261" name="l01261"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a57cfea273f9a4d2bacc0cc1e626cb3e1"> 1261</a></span><a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a57cfea273f9a4d2bacc0cc1e626cb3e1">RoutingModel::GetMutableDimension</a>(</div>
|
|
<div class="line"><a id="l01262" name="l01262"></a><span class="lineno"> 1262</span> <span class="keyword">const</span> std::string& dimension_name)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01263" name="l01263"></a><span class="lineno"> 1263</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce">DimensionIndex</a> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = GetDimensionIndex(dimension_name);</div>
|
|
<div class="line"><a id="l01264" name="l01264"></a><span class="lineno"> 1264</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> != <a class="code hl_variable" href="classoperations__research_1_1_routing_model.html#ae00630e36d2d8a2fa7eb4743a65e80d1">kNoDimension</a>) {</div>
|
|
<div class="line"><a id="l01265" name="l01265"></a><span class="lineno"> 1265</span> <span class="keywordflow">return</span> dimensions_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>];</div>
|
|
<div class="line"><a id="l01266" name="l01266"></a><span class="lineno"> 1266</span> }</div>
|
|
<div class="line"><a id="l01267" name="l01267"></a><span class="lineno"> 1267</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l01268" name="l01268"></a><span class="lineno"> 1268</span>}</div>
|
|
<div class="line"><a id="l01269" name="l01269"></a><span class="lineno"> 1269</span> </div>
|
|
<div class="line"><a id="l01270" name="l01270"></a><span class="lineno"> 1270</span><span class="comment">// ResourceGroup</span></div>
|
|
<div class="line"><a id="l01271" name="l01271"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model_1_1_resource_group_1_1_attributes.html#a2ee6f3658c1eec6d46c09c2494ace6a2"> 1271</a></span>ResourceGroup::Attributes::Attributes()</div>
|
|
<div class="line"><a id="l01272" name="l01272"></a><span class="lineno"> 1272</span> : start_domain_(<a class="code hl_class" href="classoperations__research_1_1_domain.html">Domain</a>::AllValues()), end_domain_(<a class="code hl_class" href="classoperations__research_1_1_domain.html">Domain</a>::AllValues()) {</div>
|
|
<div class="line"><a id="l01274" name="l01274"></a><span class="lineno"> 1274</span>}</div>
|
|
<div class="line"><a id="l01275" name="l01275"></a><span class="lineno"> 1275</span> </div>
|
|
<div class="line"><a id="l01276" name="l01276"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model_1_1_resource_group_1_1_attributes.html#a4f7125d952d5363b9f3436caa52a64e3"> 1276</a></span><a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group_1_1_attributes.html#a2ee6f3658c1eec6d46c09c2494ace6a2">RoutingModel::ResourceGroup::Attributes::Attributes</a>(<a class="code hl_class" href="classoperations__research_1_1_domain.html">Domain</a> start_domain,</div>
|
|
<div class="line"><a id="l01277" name="l01277"></a><span class="lineno"> 1277</span> <a class="code hl_class" href="classoperations__research_1_1_domain.html">Domain</a> end_domain)</div>
|
|
<div class="line"><a id="l01278" name="l01278"></a><span class="lineno"> 1278</span> : start_domain_(<a class="code hl_namespace" href="namespacestd.html">std</a>::move(start_domain)),</div>
|
|
<div class="line"><a id="l01279" name="l01279"></a><span class="lineno"> 1279</span> end_domain_(<a class="code hl_namespace" href="namespacestd.html">std</a>::move(end_domain)) {}</div>
|
|
<div class="line"><a id="l01280" name="l01280"></a><span class="lineno"> 1280</span> </div>
|
|
<div class="line"><a id="l01281" name="l01281"></a><span class="lineno"> 1281</span><span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_model_1_1_resource_group_1_1_attributes.html">ResourceGroup::Attributes</a>&</div>
|
|
<div class="line"><a id="l01282" name="l01282"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model_1_1_resource_group_1_1_resource.html#a62ffecc22f41f4274edc49987db5770e"> 1282</a></span><a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group_1_1_resource.html#a62ffecc22f41f4274edc49987db5770e">ResourceGroup::Resource::GetDimensionAttributes</a>(</div>
|
|
<div class="line"><a id="l01283" name="l01283"></a><span class="lineno"> 1283</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* dimension)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01284" name="l01284"></a><span class="lineno"> 1284</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce">DimensionIndex</a> dimension_index = model_->GetDimensionIndex(dimension-><a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a24dcbf29c0d6cd766009a182a6484e3b">name</a>());</div>
|
|
<div class="line"><a id="l01285" name="l01285"></a><span class="lineno"> 1285</span> <a class="code hl_define" href="base_2logging_8h.html#a46e69120fbd3b36e6960e096d23b66f0">DCHECK_NE</a>(dimension_index, <a class="code hl_variable" href="classoperations__research_1_1_routing_model.html#ae00630e36d2d8a2fa7eb4743a65e80d1">kNoDimension</a>);</div>
|
|
<div class="line"><a id="l01286" name="l01286"></a><span class="lineno"> 1286</span> <span class="keywordflow">return</span> <a class="code hl_function" href="namespacegtl.html#a795ebdb62731938c8c31b221f0f074b4">gtl::FindWithDefault</a>(dimension_attributes_, dimension_index,</div>
|
|
<div class="line"><a id="l01287" name="l01287"></a><span class="lineno"> 1287</span> GetDefaultAttributes());</div>
|
|
<div class="line"><a id="l01288" name="l01288"></a><span class="lineno"> 1288</span>}</div>
|
|
<div class="line"><a id="l01289" name="l01289"></a><span class="lineno"> 1289</span> </div>
|
|
<div class="line"><a id="l01290" name="l01290"></a><span class="lineno"> 1290</span><span class="keywordtype">void</span> ResourceGroup::Resource::SetDimensionAttributes(</div>
|
|
<div class="line"><a id="l01291" name="l01291"></a><span class="lineno"> 1291</span> <a class="code hl_class" href="classoperations__research_1_1_routing_model_1_1_resource_group_1_1_attributes.html">Attributes</a> attributes, <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* dimension) {</div>
|
|
<div class="line"><a id="l01292" name="l01292"></a><span class="lineno"> 1292</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(dimension_attributes_.empty())</div>
|
|
<div class="line"><a id="l01293" name="l01293"></a><span class="lineno"> 1293</span> << <span class="stringliteral">"As of 2021/07, each resource can only constrain a single dimension."</span>;</div>
|
|
<div class="line"><a id="l01294" name="l01294"></a><span class="lineno"> 1294</span> </div>
|
|
<div class="line"><a id="l01295" name="l01295"></a><span class="lineno"> 1295</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce">DimensionIndex</a> dimension_index =</div>
|
|
<div class="line"><a id="l01296" name="l01296"></a><span class="lineno"> 1296</span> model_->GetDimensionIndex(dimension-><a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a24dcbf29c0d6cd766009a182a6484e3b">name</a>());</div>
|
|
<div class="line"><a id="l01297" name="l01297"></a><span class="lineno"> 1297</span> <a class="code hl_define" href="base_2logging_8h.html#a46e69120fbd3b36e6960e096d23b66f0">DCHECK_NE</a>(dimension_index, <a class="code hl_variable" href="classoperations__research_1_1_routing_model.html#ae00630e36d2d8a2fa7eb4743a65e80d1">kNoDimension</a>);</div>
|
|
<div class="line"><a id="l01298" name="l01298"></a><span class="lineno"> 1298</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(!dimension_attributes_.contains(dimension_index));</div>
|
|
<div class="line"><a id="l01299" name="l01299"></a><span class="lineno"> 1299</span> dimension_attributes_[dimension_index] = std::move(attributes);</div>
|
|
<div class="line"><a id="l01300" name="l01300"></a><span class="lineno"> 1300</span>}</div>
|
|
<div class="line"><a id="l01301" name="l01301"></a><span class="lineno"> 1301</span> </div>
|
|
<div class="line"><a id="l01302" name="l01302"></a><span class="lineno"> 1302</span><span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_model_1_1_resource_group_1_1_attributes.html">ResourceGroup::Attributes</a>& ResourceGroup::Resource::GetDefaultAttributes()<span class="keyword"></span></div>
|
|
<div class="line"><a id="l01303" name="l01303"></a><span class="lineno"> 1303</span><span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01304" name="l01304"></a><span class="lineno"> 1304</span> <span class="keyword">static</span> <span class="keyword">const</span> Attributes* <span class="keyword">const</span> kAttributes = <span class="keyword">new</span> Attributes();</div>
|
|
<div class="line"><a id="l01305" name="l01305"></a><span class="lineno"> 1305</span> <span class="keywordflow">return</span> *kAttributes;</div>
|
|
<div class="line"><a id="l01306" name="l01306"></a><span class="lineno"> 1306</span>}</div>
|
|
<div class="line"><a id="l01307" name="l01307"></a><span class="lineno"> 1307</span> </div>
|
|
<div class="line"><a id="l01308" name="l01308"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#af607134ad28032b4e736467dfd11a466"> 1308</a></span><a class="code hl_class" href="classoperations__research_1_1_routing_model_1_1_resource_group.html">RoutingModel::ResourceGroup</a>* <span class="keyword">const</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#af607134ad28032b4e736467dfd11a466">RoutingModel::AddResourceGroup</a>() {</div>
|
|
<div class="line"><a id="l01309" name="l01309"></a><span class="lineno"> 1309</span> resource_groups_.push_back(absl::make_unique<ResourceGroup>(<span class="keyword">this</span>));</div>
|
|
<div class="line"><a id="l01310" name="l01310"></a><span class="lineno"> 1310</span> <span class="keywordflow">return</span> resource_groups_.back().get();</div>
|
|
<div class="line"><a id="l01311" name="l01311"></a><span class="lineno"> 1311</span>}</div>
|
|
<div class="line"><a id="l01312" name="l01312"></a><span class="lineno"> 1312</span> </div>
|
|
<div class="line"><a id="l01313" name="l01313"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#aa28b494f521776a038f0a4d5f9289ebb"> 1313</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#aa28b494f521776a038f0a4d5f9289ebb">RoutingModel::ResourceGroup::AddResource</a>(</div>
|
|
<div class="line"><a id="l01314" name="l01314"></a><span class="lineno"> 1314</span> <a class="code hl_class" href="classoperations__research_1_1_routing_model_1_1_resource_group_1_1_attributes.html">Attributes</a> attributes, <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* dimension) {</div>
|
|
<div class="line"><a id="l01315" name="l01315"></a><span class="lineno"> 1315</span> resources_.push_back(<a class="code hl_class" href="classoperations__research_1_1_routing_model_1_1_resource_group_1_1_resource.html">Resource</a>(model_));</div>
|
|
<div class="line"><a id="l01316" name="l01316"></a><span class="lineno"> 1316</span> resources_.back().SetDimensionAttributes(std::move(attributes), dimension);</div>
|
|
<div class="line"><a id="l01317" name="l01317"></a><span class="lineno"> 1317</span> </div>
|
|
<div class="line"><a id="l01318" name="l01318"></a><span class="lineno"> 1318</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce">DimensionIndex</a> dimension_index =</div>
|
|
<div class="line"><a id="l01319" name="l01319"></a><span class="lineno"> 1319</span> model_->GetDimensionIndex(dimension-><a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a24dcbf29c0d6cd766009a182a6484e3b">name</a>());</div>
|
|
<div class="line"><a id="l01320" name="l01320"></a><span class="lineno"> 1320</span> <a class="code hl_define" href="base_2logging_8h.html#a46e69120fbd3b36e6960e096d23b66f0">DCHECK_NE</a>(dimension_index, <a class="code hl_variable" href="classoperations__research_1_1_routing_model.html#ae00630e36d2d8a2fa7eb4743a65e80d1">kNoDimension</a>);</div>
|
|
<div class="line"><a id="l01321" name="l01321"></a><span class="lineno"> 1321</span> affected_dimension_indices_.insert(dimension_index);</div>
|
|
<div class="line"><a id="l01322" name="l01322"></a><span class="lineno"> 1322</span> </div>
|
|
<div class="line"><a id="l01323" name="l01323"></a><span class="lineno"> 1323</span> <a class="code hl_define" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(affected_dimension_indices_.size(), 1)</div>
|
|
<div class="line"><a id="l01324" name="l01324"></a><span class="lineno"> 1324</span> << <span class="stringliteral">"As of 2021/07, each ResourceGroup can only affect a single "</span></div>
|
|
<div class="line"><a id="l01325" name="l01325"></a><span class="lineno"> 1325</span> <span class="stringliteral">"RoutingDimension at a time."</span>;</div>
|
|
<div class="line"><a id="l01326" name="l01326"></a><span class="lineno"> 1326</span>}</div>
|
|
<div class="line"><a id="l01327" name="l01327"></a><span class="lineno"> 1327</span> </div>
|
|
<div class="line"><a id="l01328" name="l01328"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a219dfa10a2c3c26cff85c5adde3d47a3"> 1328</a></span><span class="keyword">const</span> std::vector<int>& <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a219dfa10a2c3c26cff85c5adde3d47a3">RoutingModel::GetDimensionResourceGroupIndices</a>(</div>
|
|
<div class="line"><a id="l01329" name="l01329"></a><span class="lineno"> 1329</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* dimension)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01330" name="l01330"></a><span class="lineno"> 1330</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(closed_);</div>
|
|
<div class="line"><a id="l01331" name="l01331"></a><span class="lineno"> 1331</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce">DimensionIndex</a> dim = GetDimensionIndex(dimension-><a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a24dcbf29c0d6cd766009a182a6484e3b">name</a>());</div>
|
|
<div class="line"><a id="l01332" name="l01332"></a><span class="lineno"> 1332</span> <a class="code hl_define" href="base_2logging_8h.html#a46e69120fbd3b36e6960e096d23b66f0">DCHECK_NE</a>(dim, <a class="code hl_variable" href="classoperations__research_1_1_routing_model.html#ae00630e36d2d8a2fa7eb4743a65e80d1">kNoDimension</a>);</div>
|
|
<div class="line"><a id="l01333" name="l01333"></a><span class="lineno"> 1333</span> <span class="keywordflow">return</span> dimension_resource_group_indices_[dim];</div>
|
|
<div class="line"><a id="l01334" name="l01334"></a><span class="lineno"> 1334</span>}</div>
|
|
<div class="line"><a id="l01335" name="l01335"></a><span class="lineno"> 1335</span> </div>
|
|
<div class="line"><a id="l01336" name="l01336"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#ab8d61705aa4291d2cd437ba0a7dfccbf"> 1336</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab8d61705aa4291d2cd437ba0a7dfccbf">RoutingModel::SetArcCostEvaluatorOfAllVehicles</a>(<span class="keywordtype">int</span> evaluator_index) {</div>
|
|
<div class="line"><a id="l01337" name="l01337"></a><span class="lineno"> 1337</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(0, vehicles_);</div>
|
|
<div class="line"><a id="l01338" name="l01338"></a><span class="lineno"> 1338</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < vehicles_; ++i) {</div>
|
|
<div class="line"><a id="l01339" name="l01339"></a><span class="lineno"> 1339</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ae75d9f49c157b7784fc8baa7d623ee35">SetArcCostEvaluatorOfVehicle</a>(evaluator_index, i);</div>
|
|
<div class="line"><a id="l01340" name="l01340"></a><span class="lineno"> 1340</span> }</div>
|
|
<div class="line"><a id="l01341" name="l01341"></a><span class="lineno"> 1341</span>}</div>
|
|
<div class="line"><a id="l01342" name="l01342"></a><span class="lineno"> 1342</span> </div>
|
|
<div class="line"><a id="l01343" name="l01343"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#ae75d9f49c157b7784fc8baa7d623ee35"> 1343</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ae75d9f49c157b7784fc8baa7d623ee35">RoutingModel::SetArcCostEvaluatorOfVehicle</a>(<span class="keywordtype">int</span> evaluator_index,</div>
|
|
<div class="line"><a id="l01344" name="l01344"></a><span class="lineno"> 1344</span> <span class="keywordtype">int</span> vehicle) {</div>
|
|
<div class="line"><a id="l01345" name="l01345"></a><span class="lineno"> 1345</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(vehicle, vehicles_);</div>
|
|
<div class="line"><a id="l01346" name="l01346"></a><span class="lineno"> 1346</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(evaluator_index, transit_evaluators_.size());</div>
|
|
<div class="line"><a id="l01347" name="l01347"></a><span class="lineno"> 1347</span> vehicle_to_transit_cost_[vehicle] = evaluator_index;</div>
|
|
<div class="line"><a id="l01348" name="l01348"></a><span class="lineno"> 1348</span>}</div>
|
|
<div class="line"><a id="l01349" name="l01349"></a><span class="lineno"> 1349</span> </div>
|
|
<div class="line"><a id="l01350" name="l01350"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#ae75b9e0c54aab66cffec86c67df3a1d8"> 1350</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ae75b9e0c54aab66cffec86c67df3a1d8">RoutingModel::SetFixedCostOfAllVehicles</a>(int64_t <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a>) {</div>
|
|
<div class="line"><a id="l01351" name="l01351"></a><span class="lineno"> 1351</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < vehicles_; ++i) {</div>
|
|
<div class="line"><a id="l01352" name="l01352"></a><span class="lineno"> 1352</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a76b241b39811cd74a0ab6e59ab9f63f2">SetFixedCostOfVehicle</a>(<a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a>, i);</div>
|
|
<div class="line"><a id="l01353" name="l01353"></a><span class="lineno"> 1353</span> }</div>
|
|
<div class="line"><a id="l01354" name="l01354"></a><span class="lineno"> 1354</span>}</div>
|
|
<div class="line"><a id="l01355" name="l01355"></a><span class="lineno"> 1355</span> </div>
|
|
<div class="line"><a id="l01356" name="l01356"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a34bd38fe78ef5896f2a623170f1be5d0"> 1356</a></span>int64_t <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a34bd38fe78ef5896f2a623170f1be5d0">RoutingModel::GetFixedCostOfVehicle</a>(<span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01357" name="l01357"></a><span class="lineno"> 1357</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(vehicle, vehicles_);</div>
|
|
<div class="line"><a id="l01358" name="l01358"></a><span class="lineno"> 1358</span> <span class="keywordflow">return</span> fixed_cost_of_vehicle_[vehicle];</div>
|
|
<div class="line"><a id="l01359" name="l01359"></a><span class="lineno"> 1359</span>}</div>
|
|
<div class="line"><a id="l01360" name="l01360"></a><span class="lineno"> 1360</span> </div>
|
|
<div class="line"><a id="l01361" name="l01361"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a76b241b39811cd74a0ab6e59ab9f63f2"> 1361</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a76b241b39811cd74a0ab6e59ab9f63f2">RoutingModel::SetFixedCostOfVehicle</a>(int64_t <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a>, <span class="keywordtype">int</span> vehicle) {</div>
|
|
<div class="line"><a id="l01362" name="l01362"></a><span class="lineno"> 1362</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(vehicle, vehicles_);</div>
|
|
<div class="line"><a id="l01363" name="l01363"></a><span class="lineno"> 1363</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(<a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a>, 0);</div>
|
|
<div class="line"><a id="l01364" name="l01364"></a><span class="lineno"> 1364</span> fixed_cost_of_vehicle_[vehicle] = <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a>;</div>
|
|
<div class="line"><a id="l01365" name="l01365"></a><span class="lineno"> 1365</span>}</div>
|
|
<div class="line"><a id="l01366" name="l01366"></a><span class="lineno"> 1366</span> </div>
|
|
<div class="line"><a id="l01367" name="l01367"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#aa3a9b4b73781a66cf0095c3d29af87c7"> 1367</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa3a9b4b73781a66cf0095c3d29af87c7">RoutingModel::SetAmortizedCostFactorsOfAllVehicles</a>(</div>
|
|
<div class="line"><a id="l01368" name="l01368"></a><span class="lineno"> 1368</span> int64_t linear_cost_factor, int64_t quadratic_cost_factor) {</div>
|
|
<div class="line"><a id="l01369" name="l01369"></a><span class="lineno"> 1369</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> v = 0; v < vehicles_; v++) {</div>
|
|
<div class="line"><a id="l01370" name="l01370"></a><span class="lineno"> 1370</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aaf77a22f4aad202b26d26415f2ad51c7">SetAmortizedCostFactorsOfVehicle</a>(linear_cost_factor, quadratic_cost_factor,</div>
|
|
<div class="line"><a id="l01371" name="l01371"></a><span class="lineno"> 1371</span> v);</div>
|
|
<div class="line"><a id="l01372" name="l01372"></a><span class="lineno"> 1372</span> }</div>
|
|
<div class="line"><a id="l01373" name="l01373"></a><span class="lineno"> 1373</span>}</div>
|
|
<div class="line"><a id="l01374" name="l01374"></a><span class="lineno"> 1374</span> </div>
|
|
<div class="line"><a id="l01375" name="l01375"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#aaf77a22f4aad202b26d26415f2ad51c7"> 1375</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aaf77a22f4aad202b26d26415f2ad51c7">RoutingModel::SetAmortizedCostFactorsOfVehicle</a>(</div>
|
|
<div class="line"><a id="l01376" name="l01376"></a><span class="lineno"> 1376</span> int64_t linear_cost_factor, int64_t quadratic_cost_factor, <span class="keywordtype">int</span> vehicle) {</div>
|
|
<div class="line"><a id="l01377" name="l01377"></a><span class="lineno"> 1377</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(vehicle, vehicles_);</div>
|
|
<div class="line"><a id="l01378" name="l01378"></a><span class="lineno"> 1378</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(linear_cost_factor, 0);</div>
|
|
<div class="line"><a id="l01379" name="l01379"></a><span class="lineno"> 1379</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(quadratic_cost_factor, 0);</div>
|
|
<div class="line"><a id="l01380" name="l01380"></a><span class="lineno"> 1380</span> <span class="keywordflow">if</span> (linear_cost_factor + quadratic_cost_factor > 0) {</div>
|
|
<div class="line"><a id="l01381" name="l01381"></a><span class="lineno"> 1381</span> vehicle_amortized_cost_factors_set_ = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l01382" name="l01382"></a><span class="lineno"> 1382</span> }</div>
|
|
<div class="line"><a id="l01383" name="l01383"></a><span class="lineno"> 1383</span> linear_cost_factor_of_vehicle_[vehicle] = linear_cost_factor;</div>
|
|
<div class="line"><a id="l01384" name="l01384"></a><span class="lineno"> 1384</span> quadratic_cost_factor_of_vehicle_[vehicle] = quadratic_cost_factor;</div>
|
|
<div class="line"><a id="l01385" name="l01385"></a><span class="lineno"> 1385</span>}</div>
|
|
<div class="line"><a id="l01386" name="l01386"></a><span class="lineno"> 1386</span> </div>
|
|
<div class="line"><a id="l01387" name="l01387"></a><span class="lineno"> 1387</span><span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a id="l01388" name="l01388"></a><span class="lineno"> 1388</span><span class="comment">// Some C++ versions used in the open-source export don't support comparison</span></div>
|
|
<div class="line"><a id="l01389" name="l01389"></a><span class="lineno"> 1389</span><span class="comment">// functors for STL containers; so we need a comparator class instead.</span></div>
|
|
<div class="line"><a id="l01390" name="l01390"></a><span class="lineno"> 1390</span><span class="keyword">struct </span>CostClassComparator {</div>
|
|
<div class="line"><a id="l01391" name="l01391"></a><span class="lineno"> 1391</span> <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1_routing_model_1_1_cost_class.html">RoutingModel::CostClass</a>& <a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>,</div>
|
|
<div class="line"><a id="l01392" name="l01392"></a><span class="lineno"> 1392</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1_routing_model_1_1_cost_class.html">RoutingModel::CostClass</a>& <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01393" name="l01393"></a><span class="lineno"> 1393</span> <span class="keywordflow">return</span> <a class="code hl_function" href="structoperations__research_1_1_routing_model_1_1_cost_class.html#aecd5ad315b3f45eef0d567ad99008eaf">RoutingModel::CostClass::LessThan</a>(<a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>, <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>);</div>
|
|
<div class="line"><a id="l01394" name="l01394"></a><span class="lineno"> 1394</span> }</div>
|
|
<div class="line"><a id="l01395" name="l01395"></a><span class="lineno"> 1395</span>};</div>
|
|
<div class="line"><a id="l01396" name="l01396"></a><span class="lineno"> 1396</span> </div>
|
|
<div class="line"><a id="l01397" name="l01397"></a><span class="lineno"> 1397</span><span class="keyword">struct </span>VehicleClassComparator {</div>
|
|
<div class="line"><a id="l01398" name="l01398"></a><span class="lineno"> 1398</span> <span class="keywordtype">bool</span> operator()(<span class="keyword">const</span> RoutingModel::VehicleClass& <a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>,</div>
|
|
<div class="line"><a id="l01399" name="l01399"></a><span class="lineno"> 1399</span> <span class="keyword">const</span> RoutingModel::VehicleClass& <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01400" name="l01400"></a><span class="lineno"> 1400</span> <span class="keywordflow">return</span> <a class="code hl_function" href="structoperations__research_1_1_routing_model_1_1_vehicle_class.html#ad42f0b03bf2ec344fa3ab98832a020f6">RoutingModel::VehicleClass::LessThan</a>(<a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>, <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>);</div>
|
|
<div class="line"><a id="l01401" name="l01401"></a><span class="lineno"> 1401</span> }</div>
|
|
<div class="line"><a id="l01402" name="l01402"></a><span class="lineno"> 1402</span>};</div>
|
|
<div class="line"><a id="l01403" name="l01403"></a><span class="lineno"> 1403</span>} <span class="comment">// namespace</span></div>
|
|
<div class="line"><a id="l01404" name="l01404"></a><span class="lineno"> 1404</span> </div>
|
|
<div class="line"><a id="l01405" name="l01405"></a><span class="lineno"> 1405</span><span class="comment">// static</span></div>
|
|
<div class="line"><a id="l01406" name="l01406"></a><span class="lineno"> 1406</span><span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#ad13ad202092298b43c9099b212c54d3d">RoutingModel::CostClassIndex</a> RoutingModel::kCostClassIndexOfZeroCost =</div>
|
|
<div class="line"><a id="l01407" name="l01407"></a><span class="lineno"> 1407</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#ad13ad202092298b43c9099b212c54d3d">CostClassIndex</a>(0);</div>
|
|
<div class="line"><a id="l01408" name="l01408"></a><span class="lineno"> 1408</span> </div>
|
|
<div class="line"><a id="l01409" name="l01409"></a><span class="lineno"> 1409</span><span class="keywordtype">void</span> RoutingModel::ComputeCostClasses(</div>
|
|
<div class="line"><a id="l01410" name="l01410"></a><span class="lineno"> 1410</span> <span class="keyword">const</span> RoutingSearchParameters& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>) {</div>
|
|
<div class="line"><a id="l01411" name="l01411"></a><span class="lineno"> 1411</span> <span class="comment">// Create and reduce the cost classes.</span></div>
|
|
<div class="line"><a id="l01412" name="l01412"></a><span class="lineno"> 1412</span> cost_classes_.reserve(vehicles_);</div>
|
|
<div class="line"><a id="l01413" name="l01413"></a><span class="lineno"> 1413</span> cost_classes_.clear();</div>
|
|
<div class="line"><a id="l01414" name="l01414"></a><span class="lineno"> 1414</span> cost_class_index_of_vehicle_.assign(vehicles_, <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#ad13ad202092298b43c9099b212c54d3d">CostClassIndex</a>(-1));</div>
|
|
<div class="line"><a id="l01415" name="l01415"></a><span class="lineno"> 1415</span> std::map<CostClass, CostClassIndex, CostClassComparator> cost_class_map;</div>
|
|
<div class="line"><a id="l01416" name="l01416"></a><span class="lineno"> 1416</span> </div>
|
|
<div class="line"><a id="l01417" name="l01417"></a><span class="lineno"> 1417</span> <span class="comment">// Pre-insert the built-in cost class 'zero cost' with index 0.</span></div>
|
|
<div class="line"><a id="l01418" name="l01418"></a><span class="lineno"> 1418</span> <span class="keyword">const</span> CostClass zero_cost_class(0);</div>
|
|
<div class="line"><a id="l01419" name="l01419"></a><span class="lineno"> 1419</span> cost_classes_.push_back(zero_cost_class);</div>
|
|
<div class="line"><a id="l01420" name="l01420"></a><span class="lineno"> 1420</span> <a class="code hl_define" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(cost_classes_[kCostClassIndexOfZeroCost].evaluator_index, 0);</div>
|
|
<div class="line"><a id="l01421" name="l01421"></a><span class="lineno"> 1421</span> cost_class_map[zero_cost_class] = kCostClassIndexOfZeroCost;</div>
|
|
<div class="line"><a id="l01422" name="l01422"></a><span class="lineno"> 1422</span> </div>
|
|
<div class="line"><a id="l01423" name="l01423"></a><span class="lineno"> 1423</span> <span class="comment">// Determine the canonicalized cost class for each vehicle, and insert it as</span></div>
|
|
<div class="line"><a id="l01424" name="l01424"></a><span class="lineno"> 1424</span> <span class="comment">// a new cost class if it doesn't exist already. Building cached evaluators</span></div>
|
|
<div class="line"><a id="l01425" name="l01425"></a><span class="lineno"> 1425</span> <span class="comment">// on the way.</span></div>
|
|
<div class="line"><a id="l01426" name="l01426"></a><span class="lineno"> 1426</span> has_vehicle_with_zero_cost_class_ = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l01427" name="l01427"></a><span class="lineno"> 1427</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++vehicle) {</div>
|
|
<div class="line"><a id="l01428" name="l01428"></a><span class="lineno"> 1428</span> CostClass cost_class(vehicle_to_transit_cost_[vehicle]);</div>
|
|
<div class="line"><a id="l01429" name="l01429"></a><span class="lineno"> 1429</span> </div>
|
|
<div class="line"><a id="l01430" name="l01430"></a><span class="lineno"> 1430</span> <span class="comment">// Insert the dimension data in a canonical way.</span></div>
|
|
<div class="line"><a id="l01431" name="l01431"></a><span class="lineno"> 1431</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_friend" href="classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* <span class="keyword">const</span> dimension : dimensions_) {</div>
|
|
<div class="line"><a id="l01432" name="l01432"></a><span class="lineno"> 1432</span> <span class="keyword">const</span> int64_t coeff =</div>
|
|
<div class="line"><a id="l01433" name="l01433"></a><span class="lineno"> 1433</span> dimension-><a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a62099b067d4f0d26e41a020c2fca1731">vehicle_span_cost_coefficients</a>()[vehicle];</div>
|
|
<div class="line"><a id="l01434" name="l01434"></a><span class="lineno"> 1434</span> <span class="keywordflow">if</span> (coeff == 0) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l01435" name="l01435"></a><span class="lineno"> 1435</span> cost_class.dimension_transit_evaluator_class_and_cost_coefficient</div>
|
|
<div class="line"><a id="l01436" name="l01436"></a><span class="lineno"> 1436</span> .push_back({dimension-><a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#aa46d01169492b00c999344e8982ddd0f">vehicle_to_class</a>(vehicle), coeff, dimension});</div>
|
|
<div class="line"><a id="l01437" name="l01437"></a><span class="lineno"> 1437</span> }</div>
|
|
<div class="line"><a id="l01438" name="l01438"></a><span class="lineno"> 1438</span> std::sort(cost_class.dimension_transit_evaluator_class_and_cost_coefficient</div>
|
|
<div class="line"><a id="l01439" name="l01439"></a><span class="lineno"> 1439</span> .begin(),</div>
|
|
<div class="line"><a id="l01440" name="l01440"></a><span class="lineno"> 1440</span> cost_class.dimension_transit_evaluator_class_and_cost_coefficient</div>
|
|
<div class="line"><a id="l01441" name="l01441"></a><span class="lineno"> 1441</span> .end());</div>
|
|
<div class="line"><a id="l01442" name="l01442"></a><span class="lineno"> 1442</span> <span class="comment">// Try inserting the CostClass, if it's not already present.</span></div>
|
|
<div class="line"><a id="l01443" name="l01443"></a><span class="lineno"> 1443</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#ad13ad202092298b43c9099b212c54d3d">CostClassIndex</a> num_cost_classes(cost_classes_.size());</div>
|
|
<div class="line"><a id="l01444" name="l01444"></a><span class="lineno"> 1444</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#ad13ad202092298b43c9099b212c54d3d">CostClassIndex</a> cost_class_index =</div>
|
|
<div class="line"><a id="l01445" name="l01445"></a><span class="lineno"> 1445</span> <a class="code hl_function" href="namespacegtl.html#a523b266127b26ec3817cae4c5f41c391">gtl::LookupOrInsert</a>(&cost_class_map, cost_class, num_cost_classes);</div>
|
|
<div class="line"><a id="l01446" name="l01446"></a><span class="lineno"> 1446</span> <span class="keywordflow">if</span> (cost_class_index == kCostClassIndexOfZeroCost) {</div>
|
|
<div class="line"><a id="l01447" name="l01447"></a><span class="lineno"> 1447</span> has_vehicle_with_zero_cost_class_ = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l01448" name="l01448"></a><span class="lineno"> 1448</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (cost_class_index == num_cost_classes) { <span class="comment">// New cost class.</span></div>
|
|
<div class="line"><a id="l01449" name="l01449"></a><span class="lineno"> 1449</span> cost_classes_.push_back(cost_class);</div>
|
|
<div class="line"><a id="l01450" name="l01450"></a><span class="lineno"> 1450</span> }</div>
|
|
<div class="line"><a id="l01451" name="l01451"></a><span class="lineno"> 1451</span> cost_class_index_of_vehicle_[vehicle] = cost_class_index;</div>
|
|
<div class="line"><a id="l01452" name="l01452"></a><span class="lineno"> 1452</span> }</div>
|
|
<div class="line"><a id="l01453" name="l01453"></a><span class="lineno"> 1453</span> </div>
|
|
<div class="line"><a id="l01454" name="l01454"></a><span class="lineno"> 1454</span> <span class="comment">// TRICKY:</span></div>
|
|
<div class="line"><a id="l01455" name="l01455"></a><span class="lineno"> 1455</span> <span class="comment">// If some vehicle had the "zero" cost class, then we'll have homogeneous</span></div>
|
|
<div class="line"><a id="l01456" name="l01456"></a><span class="lineno"> 1456</span> <span class="comment">// vehicles iff they all have that cost class (i.e. cost class count = 1).</span></div>
|
|
<div class="line"><a id="l01457" name="l01457"></a><span class="lineno"> 1457</span> <span class="comment">// If none of them have it, then we have homogeneous costs iff there are two</span></div>
|
|
<div class="line"><a id="l01458" name="l01458"></a><span class="lineno"> 1458</span> <span class="comment">// cost classes: the unused "zero" cost class and the one used by all</span></div>
|
|
<div class="line"><a id="l01459" name="l01459"></a><span class="lineno"> 1459</span> <span class="comment">// vehicles.</span></div>
|
|
<div class="line"><a id="l01460" name="l01460"></a><span class="lineno"> 1460</span> <span class="comment">// Note that we always need the zero cost class, even if no vehicle uses it,</span></div>
|
|
<div class="line"><a id="l01461" name="l01461"></a><span class="lineno"> 1461</span> <span class="comment">// because we use it in the vehicle_var = -1 scenario (i.e. unperformed).</span></div>
|
|
<div class="line"><a id="l01462" name="l01462"></a><span class="lineno"> 1462</span> <span class="comment">//</span></div>
|
|
<div class="line"><a id="l01463" name="l01463"></a><span class="lineno"> 1463</span> <span class="comment">// Fixed costs are simply ignored for computing these cost classes. They are</span></div>
|
|
<div class="line"><a id="l01464" name="l01464"></a><span class="lineno"> 1464</span> <span class="comment">// attached to start nodes directly.</span></div>
|
|
<div class="line"><a id="l01465" name="l01465"></a><span class="lineno"> 1465</span> costs_are_homogeneous_across_vehicles_ &= has_vehicle_with_zero_cost_class_</div>
|
|
<div class="line"><a id="l01466" name="l01466"></a><span class="lineno"> 1466</span> ? <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ad3b144985c2b4b24cf39b839dbd9c16d">GetCostClassesCount</a>() == 1</div>
|
|
<div class="line"><a id="l01467" name="l01467"></a><span class="lineno"> 1467</span> : <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ad3b144985c2b4b24cf39b839dbd9c16d">GetCostClassesCount</a>() <= 2;</div>
|
|
<div class="line"><a id="l01468" name="l01468"></a><span class="lineno"> 1468</span>}</div>
|
|
<div class="line"><a id="l01469" name="l01469"></a><span class="lineno"> 1469</span> </div>
|
|
<div class="line"><a id="l01470" name="l01470"></a><span class="lineno"><a class="line" href="structoperations__research_1_1_routing_model_1_1_vehicle_class.html#ad42f0b03bf2ec344fa3ab98832a020f6"> 1470</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="structoperations__research_1_1_routing_model_1_1_vehicle_class.html#ad42f0b03bf2ec344fa3ab98832a020f6">RoutingModel::VehicleClass::LessThan</a>(<span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1_routing_model_1_1_vehicle_class.html">VehicleClass</a>& <a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>,</div>
|
|
<div class="line"><a id="l01471" name="l01471"></a><span class="lineno"> 1471</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1_routing_model_1_1_vehicle_class.html">VehicleClass</a>& <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>) {</div>
|
|
<div class="line"><a id="l01472" name="l01472"></a><span class="lineno"> 1472</span> <span class="keywordflow">return</span> std::tie(<a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>.cost_class_index, <a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>.fixed_cost, <a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>.start_equivalence_class,</div>
|
|
<div class="line"><a id="l01473" name="l01473"></a><span class="lineno"> 1473</span> <a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>.end_equivalence_class, <a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>.unvisitable_nodes_fprint,</div>
|
|
<div class="line"><a id="l01474" name="l01474"></a><span class="lineno"> 1474</span> <a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>.dimension_start_cumuls_min, <a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>.dimension_start_cumuls_max,</div>
|
|
<div class="line"><a id="l01475" name="l01475"></a><span class="lineno"> 1475</span> <a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>.dimension_end_cumuls_min, <a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>.dimension_end_cumuls_max,</div>
|
|
<div class="line"><a id="l01476" name="l01476"></a><span class="lineno"> 1476</span> <a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>.dimension_capacities, <a class="code hl_variable" href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a>.dimension_evaluator_classes) <</div>
|
|
<div class="line"><a id="l01477" name="l01477"></a><span class="lineno"> 1477</span> std::tie(<a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>.cost_class_index, <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>.fixed_cost, <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>.start_equivalence_class,</div>
|
|
<div class="line"><a id="l01478" name="l01478"></a><span class="lineno"> 1478</span> <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>.end_equivalence_class, <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>.unvisitable_nodes_fprint,</div>
|
|
<div class="line"><a id="l01479" name="l01479"></a><span class="lineno"> 1479</span> <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>.dimension_start_cumuls_min, <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>.dimension_start_cumuls_max,</div>
|
|
<div class="line"><a id="l01480" name="l01480"></a><span class="lineno"> 1480</span> <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>.dimension_end_cumuls_min, <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>.dimension_end_cumuls_max,</div>
|
|
<div class="line"><a id="l01481" name="l01481"></a><span class="lineno"> 1481</span> <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>.dimension_capacities, <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>.dimension_evaluator_classes);</div>
|
|
<div class="line"><a id="l01482" name="l01482"></a><span class="lineno"> 1482</span>}</div>
|
|
<div class="line"><a id="l01483" name="l01483"></a><span class="lineno"> 1483</span> </div>
|
|
<div class="line"><a id="l01484" name="l01484"></a><span class="lineno"> 1484</span><span class="keywordtype">void</span> RoutingModel::ComputeVehicleClasses() {</div>
|
|
<div class="line"><a id="l01485" name="l01485"></a><span class="lineno"> 1485</span> vehicle_classes_.reserve(vehicles_);</div>
|
|
<div class="line"><a id="l01486" name="l01486"></a><span class="lineno"> 1486</span> vehicle_classes_.clear();</div>
|
|
<div class="line"><a id="l01487" name="l01487"></a><span class="lineno"> 1487</span> vehicle_class_index_of_vehicle_.assign(vehicles_, <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#ab6aae3927f3537c446ac33f2c6ecb922">VehicleClassIndex</a>(-1));</div>
|
|
<div class="line"><a id="l01488" name="l01488"></a><span class="lineno"> 1488</span> std::map<VehicleClass, VehicleClassIndex, VehicleClassComparator></div>
|
|
<div class="line"><a id="l01489" name="l01489"></a><span class="lineno"> 1489</span> vehicle_class_map;</div>
|
|
<div class="line"><a id="l01490" name="l01490"></a><span class="lineno"> 1490</span> <span class="keyword">const</span> <span class="keywordtype">int</span> nodes_unvisitability_num_bytes = (vehicle_vars_.size() + 7) / 8;</div>
|
|
<div class="line"><a id="l01491" name="l01491"></a><span class="lineno"> 1491</span> std::unique_ptr<char[]> nodes_unvisitability_bitmask(</div>
|
|
<div class="line"><a id="l01492" name="l01492"></a><span class="lineno"> 1492</span> <span class="keyword">new</span> <span class="keywordtype">char</span>[nodes_unvisitability_num_bytes]);</div>
|
|
<div class="line"><a id="l01493" name="l01493"></a><span class="lineno"> 1493</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++vehicle) {</div>
|
|
<div class="line"><a id="l01494" name="l01494"></a><span class="lineno"> 1494</span> <a class="code hl_struct" href="structoperations__research_1_1_routing_model_1_1_vehicle_class.html">VehicleClass</a> <a class="code hl_variable" href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a>;</div>
|
|
<div class="line"><a id="l01495" name="l01495"></a><span class="lineno"> 1495</span> <a class="code hl_variable" href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a>.cost_class_index = cost_class_index_of_vehicle_[vehicle];</div>
|
|
<div class="line"><a id="l01496" name="l01496"></a><span class="lineno"> 1496</span> <a class="code hl_variable" href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a>.fixed_cost = fixed_cost_of_vehicle_[vehicle];</div>
|
|
<div class="line"><a id="l01497" name="l01497"></a><span class="lineno"> 1497</span> <a class="code hl_variable" href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a>.start_equivalence_class =</div>
|
|
<div class="line"><a id="l01498" name="l01498"></a><span class="lineno"> 1498</span> index_to_equivalence_class_[<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(vehicle)];</div>
|
|
<div class="line"><a id="l01499" name="l01499"></a><span class="lineno"> 1499</span> <a class="code hl_variable" href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a>.end_equivalence_class =</div>
|
|
<div class="line"><a id="l01500" name="l01500"></a><span class="lineno"> 1500</span> index_to_equivalence_class_[<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afb80fd36c1fb57d2db049403483e2074">End</a>(vehicle)];</div>
|
|
<div class="line"><a id="l01501" name="l01501"></a><span class="lineno"> 1501</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* <span class="keyword">const</span> dimension : dimensions_) {</div>
|
|
<div class="line"><a id="l01502" name="l01502"></a><span class="lineno"> 1502</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> start_cumul_var = dimension-><a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a2658bab0f635e3b399b100ecd6bc12cb">cumuls</a>()[<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(vehicle)];</div>
|
|
<div class="line"><a id="l01503" name="l01503"></a><span class="lineno"> 1503</span> <a class="code hl_variable" href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a>.dimension_start_cumuls_min.push_back(</div>
|
|
<div class="line"><a id="l01504" name="l01504"></a><span class="lineno"> 1504</span> start_cumul_var-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#a62b340f6d1dde6a36560bd88a382ada7">Min</a>());</div>
|
|
<div class="line"><a id="l01505" name="l01505"></a><span class="lineno"> 1505</span> <a class="code hl_variable" href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a>.dimension_start_cumuls_max.push_back(</div>
|
|
<div class="line"><a id="l01506" name="l01506"></a><span class="lineno"> 1506</span> start_cumul_var-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#ac84c250d67f30c89e845cd460eeaaad8">Max</a>());</div>
|
|
<div class="line"><a id="l01507" name="l01507"></a><span class="lineno"> 1507</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> end_cumul_var = dimension-><a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a2658bab0f635e3b399b100ecd6bc12cb">cumuls</a>()[<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afb80fd36c1fb57d2db049403483e2074">End</a>(vehicle)];</div>
|
|
<div class="line"><a id="l01508" name="l01508"></a><span class="lineno"> 1508</span> <a class="code hl_variable" href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a>.dimension_end_cumuls_min.push_back(end_cumul_var-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#a62b340f6d1dde6a36560bd88a382ada7">Min</a>());</div>
|
|
<div class="line"><a id="l01509" name="l01509"></a><span class="lineno"> 1509</span> <a class="code hl_variable" href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a>.dimension_end_cumuls_max.push_back(end_cumul_var-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#ac84c250d67f30c89e845cd460eeaaad8">Max</a>());</div>
|
|
<div class="line"><a id="l01510" name="l01510"></a><span class="lineno"> 1510</span> <a class="code hl_variable" href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a>.dimension_capacities.push_back(</div>
|
|
<div class="line"><a id="l01511" name="l01511"></a><span class="lineno"> 1511</span> dimension-><a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a2f01e7a89b0da7143b9ece70c88fd640">vehicle_capacities</a>()[vehicle]);</div>
|
|
<div class="line"><a id="l01512" name="l01512"></a><span class="lineno"> 1512</span> <a class="code hl_variable" href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a>.dimension_evaluator_classes.push_back(</div>
|
|
<div class="line"><a id="l01513" name="l01513"></a><span class="lineno"> 1513</span> dimension-><a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#aa46d01169492b00c999344e8982ddd0f">vehicle_to_class</a>(vehicle));</div>
|
|
<div class="line"><a id="l01514" name="l01514"></a><span class="lineno"> 1514</span> }</div>
|
|
<div class="line"><a id="l01515" name="l01515"></a><span class="lineno"> 1515</span> memset(nodes_unvisitability_bitmask.get(), 0,</div>
|
|
<div class="line"><a id="l01516" name="l01516"></a><span class="lineno"> 1516</span> nodes_unvisitability_num_bytes);</div>
|
|
<div class="line"><a id="l01517" name="l01517"></a><span class="lineno"> 1517</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = 0; <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < vehicle_vars_.size(); ++<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>) {</div>
|
|
<div class="line"><a id="l01518" name="l01518"></a><span class="lineno"> 1518</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> vehicle_var = vehicle_vars_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>];</div>
|
|
<div class="line"><a id="l01519" name="l01519"></a><span class="lineno"> 1519</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a3582f01eabc65ba4b801215ca6420a7c">IsStart</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>) && !<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>) &&</div>
|
|
<div class="line"><a id="l01520" name="l01520"></a><span class="lineno"> 1520</span> (!vehicle_var-><a class="code hl_function" href="classoperations__research_1_1_int_var.html#a0723abf37f7a5a8a604fd1bcd96a7be0">Contains</a>(vehicle) ||</div>
|
|
<div class="line"><a id="l01521" name="l01521"></a><span class="lineno"> 1521</span> !<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a7d83ad98473be9a287f5ef628b99c929">IsVehicleAllowedForIndex</a>(vehicle, <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>))) {</div>
|
|
<div class="line"><a id="l01522" name="l01522"></a><span class="lineno"> 1522</span> nodes_unvisitability_bitmask[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> / CHAR_BIT] |= 1U</div>
|
|
<div class="line"><a id="l01523" name="l01523"></a><span class="lineno"> 1523</span> << (<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> % CHAR_BIT);</div>
|
|
<div class="line"><a id="l01524" name="l01524"></a><span class="lineno"> 1524</span> }</div>
|
|
<div class="line"><a id="l01525" name="l01525"></a><span class="lineno"> 1525</span> }</div>
|
|
<div class="line"><a id="l01526" name="l01526"></a><span class="lineno"> 1526</span> <a class="code hl_variable" href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a>.unvisitable_nodes_fprint = <a class="code hl_function" href="namespaceoperations__research.html#a8c36f70ade4fbfc1c3c4055ee6e4a857">ThoroughHash</a>(</div>
|
|
<div class="line"><a id="l01527" name="l01527"></a><span class="lineno"> 1527</span> nodes_unvisitability_bitmask.get(), nodes_unvisitability_num_bytes);</div>
|
|
<div class="line"><a id="l01528" name="l01528"></a><span class="lineno"> 1528</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#ab6aae3927f3537c446ac33f2c6ecb922">VehicleClassIndex</a> num_vehicle_classes(vehicle_classes_.size());</div>
|
|
<div class="line"><a id="l01529" name="l01529"></a><span class="lineno"> 1529</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#ab6aae3927f3537c446ac33f2c6ecb922">VehicleClassIndex</a> vehicle_class_index = <a class="code hl_function" href="namespacegtl.html#a523b266127b26ec3817cae4c5f41c391">gtl::LookupOrInsert</a>(</div>
|
|
<div class="line"><a id="l01530" name="l01530"></a><span class="lineno"> 1530</span> &vehicle_class_map, <a class="code hl_variable" href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a>, num_vehicle_classes);</div>
|
|
<div class="line"><a id="l01531" name="l01531"></a><span class="lineno"> 1531</span> <span class="keywordflow">if</span> (vehicle_class_index == num_vehicle_classes) { <span class="comment">// New vehicle class</span></div>
|
|
<div class="line"><a id="l01532" name="l01532"></a><span class="lineno"> 1532</span> vehicle_classes_.push_back(<a class="code hl_variable" href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a>);</div>
|
|
<div class="line"><a id="l01533" name="l01533"></a><span class="lineno"> 1533</span> }</div>
|
|
<div class="line"><a id="l01534" name="l01534"></a><span class="lineno"> 1534</span> vehicle_class_index_of_vehicle_[vehicle] = vehicle_class_index;</div>
|
|
<div class="line"><a id="l01535" name="l01535"></a><span class="lineno"> 1535</span> }</div>
|
|
<div class="line"><a id="l01536" name="l01536"></a><span class="lineno"> 1536</span>}</div>
|
|
<div class="line"><a id="l01537" name="l01537"></a><span class="lineno"> 1537</span> </div>
|
|
<div class="line"><a id="l01538" name="l01538"></a><span class="lineno"> 1538</span><span class="keywordtype">void</span> RoutingModel::ComputeVehicleTypes() {</div>
|
|
<div class="line"><a id="l01539" name="l01539"></a><span class="lineno"> 1539</span> <span class="keyword">const</span> <span class="keywordtype">int</span> nodes_squared = nodes_ * nodes_;</div>
|
|
<div class="line"><a id="l01540" name="l01540"></a><span class="lineno"> 1540</span> std::vector<int>& type_index_of_vehicle =</div>
|
|
<div class="line"><a id="l01541" name="l01541"></a><span class="lineno"> 1541</span> vehicle_type_container_.type_index_of_vehicle;</div>
|
|
<div class="line"><a id="l01542" name="l01542"></a><span class="lineno"> 1542</span> std::vector<std::set<VehicleTypeContainer::VehicleClassEntry>>&</div>
|
|
<div class="line"><a id="l01543" name="l01543"></a><span class="lineno"> 1543</span> sorted_vehicle_classes_per_type =</div>
|
|
<div class="line"><a id="l01544" name="l01544"></a><span class="lineno"> 1544</span> vehicle_type_container_.sorted_vehicle_classes_per_type;</div>
|
|
<div class="line"><a id="l01545" name="l01545"></a><span class="lineno"> 1545</span> std::vector<std::deque<int>>& vehicles_per_vehicle_class =</div>
|
|
<div class="line"><a id="l01546" name="l01546"></a><span class="lineno"> 1546</span> vehicle_type_container_.vehicles_per_vehicle_class;</div>
|
|
<div class="line"><a id="l01547" name="l01547"></a><span class="lineno"> 1547</span> </div>
|
|
<div class="line"><a id="l01548" name="l01548"></a><span class="lineno"> 1548</span> type_index_of_vehicle.resize(vehicles_);</div>
|
|
<div class="line"><a id="l01549" name="l01549"></a><span class="lineno"> 1549</span> sorted_vehicle_classes_per_type.clear();</div>
|
|
<div class="line"><a id="l01550" name="l01550"></a><span class="lineno"> 1550</span> sorted_vehicle_classes_per_type.reserve(vehicles_);</div>
|
|
<div class="line"><a id="l01551" name="l01551"></a><span class="lineno"> 1551</span> vehicles_per_vehicle_class.clear();</div>
|
|
<div class="line"><a id="l01552" name="l01552"></a><span class="lineno"> 1552</span> vehicles_per_vehicle_class.resize(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a34ab0d5fa45360b5e6a42b9a78cfe5a8">GetVehicleClassesCount</a>());</div>
|
|
<div class="line"><a id="l01553" name="l01553"></a><span class="lineno"> 1553</span> </div>
|
|
<div class="line"><a id="l01554" name="l01554"></a><span class="lineno"> 1554</span> absl::flat_hash_map<int64_t, int> type_to_type_index;</div>
|
|
<div class="line"><a id="l01555" name="l01555"></a><span class="lineno"> 1555</span> </div>
|
|
<div class="line"><a id="l01556" name="l01556"></a><span class="lineno"> 1556</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> v = 0; v < vehicles_; v++) {</div>
|
|
<div class="line"><a id="l01557" name="l01557"></a><span class="lineno"> 1557</span> <span class="keyword">const</span> <span class="keywordtype">int</span> start = manager_.IndexToNode(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(v)).value();</div>
|
|
<div class="line"><a id="l01558" name="l01558"></a><span class="lineno"> 1558</span> <span class="keyword">const</span> <span class="keywordtype">int</span> end = manager_.IndexToNode(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afb80fd36c1fb57d2db049403483e2074">End</a>(v)).value();</div>
|
|
<div class="line"><a id="l01559" name="l01559"></a><span class="lineno"> 1559</span> <span class="keyword">const</span> <span class="keywordtype">int</span> cost_class = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ae378d23c967e818f321bd4498b5c74f2">GetCostClassIndexOfVehicle</a>(v).value();</div>
|
|
<div class="line"><a id="l01560" name="l01560"></a><span class="lineno"> 1560</span> <span class="keyword">const</span> int64_t type = cost_class * nodes_squared + start * nodes_ + end;</div>
|
|
<div class="line"><a id="l01561" name="l01561"></a><span class="lineno"> 1561</span> </div>
|
|
<div class="line"><a id="l01562" name="l01562"></a><span class="lineno"> 1562</span> <span class="keyword">const</span> <span class="keyword">auto</span>& vehicle_type_added = type_to_type_index.insert(</div>
|
|
<div class="line"><a id="l01563" name="l01563"></a><span class="lineno"> 1563</span> std::make_pair(type, type_to_type_index.size()));</div>
|
|
<div class="line"><a id="l01564" name="l01564"></a><span class="lineno"> 1564</span> </div>
|
|
<div class="line"><a id="l01565" name="l01565"></a><span class="lineno"> 1565</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = vehicle_type_added.first->second;</div>
|
|
<div class="line"><a id="l01566" name="l01566"></a><span class="lineno"> 1566</span> </div>
|
|
<div class="line"><a id="l01567" name="l01567"></a><span class="lineno"> 1567</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code hl_variable" href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a> = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a114000eadb54d1a6275add6c1e6fcf33">GetVehicleClassIndexOfVehicle</a>(v).value();</div>
|
|
<div class="line"><a id="l01568" name="l01568"></a><span class="lineno"> 1568</span> <span class="keyword">const</span> VehicleTypeContainer::VehicleClassEntry class_entry = {</div>
|
|
<div class="line"><a id="l01569" name="l01569"></a><span class="lineno"> 1569</span> <a class="code hl_variable" href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a>, <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a34bd38fe78ef5896f2a623170f1be5d0">GetFixedCostOfVehicle</a>(v)};</div>
|
|
<div class="line"><a id="l01570" name="l01570"></a><span class="lineno"> 1570</span> </div>
|
|
<div class="line"><a id="l01571" name="l01571"></a><span class="lineno"> 1571</span> <span class="keywordflow">if</span> (vehicle_type_added.second) {</div>
|
|
<div class="line"><a id="l01572" name="l01572"></a><span class="lineno"> 1572</span> <span class="comment">// Type was not indexed yet.</span></div>
|
|
<div class="line"><a id="l01573" name="l01573"></a><span class="lineno"> 1573</span> <a class="code hl_define" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(sorted_vehicle_classes_per_type.size(), <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l01574" name="l01574"></a><span class="lineno"> 1574</span> sorted_vehicle_classes_per_type.push_back({class_entry});</div>
|
|
<div class="line"><a id="l01575" name="l01575"></a><span class="lineno"> 1575</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l01576" name="l01576"></a><span class="lineno"> 1576</span> <span class="comment">// Type already indexed.</span></div>
|
|
<div class="line"><a id="l01577" name="l01577"></a><span class="lineno"> 1577</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>, sorted_vehicle_classes_per_type.size());</div>
|
|
<div class="line"><a id="l01578" name="l01578"></a><span class="lineno"> 1578</span> sorted_vehicle_classes_per_type[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].insert(class_entry);</div>
|
|
<div class="line"><a id="l01579" name="l01579"></a><span class="lineno"> 1579</span> }</div>
|
|
<div class="line"><a id="l01580" name="l01580"></a><span class="lineno"> 1580</span> vehicles_per_vehicle_class[<a class="code hl_variable" href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a>].push_back(v);</div>
|
|
<div class="line"><a id="l01581" name="l01581"></a><span class="lineno"> 1581</span> type_index_of_vehicle[v] = <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>;</div>
|
|
<div class="line"><a id="l01582" name="l01582"></a><span class="lineno"> 1582</span> }</div>
|
|
<div class="line"><a id="l01583" name="l01583"></a><span class="lineno"> 1583</span>}</div>
|
|
<div class="line"><a id="l01584" name="l01584"></a><span class="lineno"> 1584</span> </div>
|
|
<div class="line"><a id="l01585" name="l01585"></a><span class="lineno"> 1585</span><span class="keywordtype">void</span> RoutingModel::FinalizeVisitTypes() {</div>
|
|
<div class="line"><a id="l01586" name="l01586"></a><span class="lineno"> 1586</span> <span class="comment">// NOTE(user): This is necessary if CloseVisitTypes() was not called</span></div>
|
|
<div class="line"><a id="l01587" name="l01587"></a><span class="lineno"> 1587</span> <span class="comment">// explicitly before. This will be removed when the TODO regarding this logic</span></div>
|
|
<div class="line"><a id="l01588" name="l01588"></a><span class="lineno"> 1588</span> <span class="comment">// is addressed.</span></div>
|
|
<div class="line"><a id="l01589" name="l01589"></a><span class="lineno"> 1589</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a822458cc9a9a6fa02e86af3e3a1e5c89">CloseVisitTypes</a>();</div>
|
|
<div class="line"><a id="l01590" name="l01590"></a><span class="lineno"> 1590</span> </div>
|
|
<div class="line"><a id="l01591" name="l01591"></a><span class="lineno"> 1591</span> single_nodes_of_type_.clear();</div>
|
|
<div class="line"><a id="l01592" name="l01592"></a><span class="lineno"> 1592</span> single_nodes_of_type_.resize(num_visit_types_);</div>
|
|
<div class="line"><a id="l01593" name="l01593"></a><span class="lineno"> 1593</span> pair_indices_of_type_.clear();</div>
|
|
<div class="line"><a id="l01594" name="l01594"></a><span class="lineno"> 1594</span> pair_indices_of_type_.resize(num_visit_types_);</div>
|
|
<div class="line"><a id="l01595" name="l01595"></a><span class="lineno"> 1595</span> std::vector<absl::flat_hash_set<int>> pair_indices_added_for_type(</div>
|
|
<div class="line"><a id="l01596" name="l01596"></a><span class="lineno"> 1596</span> num_visit_types_);</div>
|
|
<div class="line"><a id="l01597" name="l01597"></a><span class="lineno"> 1597</span> </div>
|
|
<div class="line"><a id="l01598" name="l01598"></a><span class="lineno"> 1598</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = 0; <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < index_to_visit_type_.size(); <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>++) {</div>
|
|
<div class="line"><a id="l01599" name="l01599"></a><span class="lineno"> 1599</span> <span class="keyword">const</span> <span class="keywordtype">int</span> visit_type = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5ae82715107922af5fbc18f854d58026">GetVisitType</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l01600" name="l01600"></a><span class="lineno"> 1600</span> <span class="keywordflow">if</span> (visit_type < 0) {</div>
|
|
<div class="line"><a id="l01601" name="l01601"></a><span class="lineno"> 1601</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l01602" name="l01602"></a><span class="lineno"> 1602</span> }</div>
|
|
<div class="line"><a id="l01603" name="l01603"></a><span class="lineno"> 1603</span> <span class="keyword">const</span> std::vector<std::pair<int, int>>& pickup_index_pairs =</div>
|
|
<div class="line"><a id="l01604" name="l01604"></a><span class="lineno"> 1604</span> index_to_pickup_index_pairs_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>];</div>
|
|
<div class="line"><a id="l01605" name="l01605"></a><span class="lineno"> 1605</span> <span class="keyword">const</span> std::vector<std::pair<int, int>>& delivery_index_pairs =</div>
|
|
<div class="line"><a id="l01606" name="l01606"></a><span class="lineno"> 1606</span> index_to_delivery_index_pairs_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>];</div>
|
|
<div class="line"><a id="l01607" name="l01607"></a><span class="lineno"> 1607</span> <span class="keywordflow">if</span> (pickup_index_pairs.empty() && delivery_index_pairs.empty()) {</div>
|
|
<div class="line"><a id="l01608" name="l01608"></a><span class="lineno"> 1608</span> single_nodes_of_type_[visit_type].push_back(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l01609" name="l01609"></a><span class="lineno"> 1609</span> }</div>
|
|
<div class="line"><a id="l01610" name="l01610"></a><span class="lineno"> 1610</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::vector<std::pair<int, int>>* index_pairs :</div>
|
|
<div class="line"><a id="l01611" name="l01611"></a><span class="lineno"> 1611</span> {&pickup_index_pairs, &delivery_index_pairs}) {</div>
|
|
<div class="line"><a id="l01612" name="l01612"></a><span class="lineno"> 1612</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::pair<int, int>& index_pair : *index_pairs) {</div>
|
|
<div class="line"><a id="l01613" name="l01613"></a><span class="lineno"> 1613</span> <span class="keyword">const</span> <span class="keywordtype">int</span> pair_index = index_pair.first;</div>
|
|
<div class="line"><a id="l01614" name="l01614"></a><span class="lineno"> 1614</span> <span class="keywordflow">if</span> (pair_indices_added_for_type[visit_type].insert(pair_index).second) {</div>
|
|
<div class="line"><a id="l01615" name="l01615"></a><span class="lineno"> 1615</span> pair_indices_of_type_[visit_type].push_back(pair_index);</div>
|
|
<div class="line"><a id="l01616" name="l01616"></a><span class="lineno"> 1616</span> }</div>
|
|
<div class="line"><a id="l01617" name="l01617"></a><span class="lineno"> 1617</span> }</div>
|
|
<div class="line"><a id="l01618" name="l01618"></a><span class="lineno"> 1618</span> }</div>
|
|
<div class="line"><a id="l01619" name="l01619"></a><span class="lineno"> 1619</span> }</div>
|
|
<div class="line"><a id="l01620" name="l01620"></a><span class="lineno"> 1620</span> </div>
|
|
<div class="line"><a id="l01621" name="l01621"></a><span class="lineno"> 1621</span> TopologicallySortVisitTypes();</div>
|
|
<div class="line"><a id="l01622" name="l01622"></a><span class="lineno"> 1622</span>}</div>
|
|
<div class="line"><a id="l01623" name="l01623"></a><span class="lineno"> 1623</span> </div>
|
|
<div class="line"><a id="l01624" name="l01624"></a><span class="lineno"> 1624</span><span class="keywordtype">void</span> RoutingModel::TopologicallySortVisitTypes() {</div>
|
|
<div class="line"><a id="l01625" name="l01625"></a><span class="lineno"> 1625</span> <span class="keywordflow">if</span> (!has_same_vehicle_type_requirements_ &&</div>
|
|
<div class="line"><a id="l01626" name="l01626"></a><span class="lineno"> 1626</span> !has_temporal_type_requirements_) {</div>
|
|
<div class="line"><a id="l01627" name="l01627"></a><span class="lineno"> 1627</span> <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l01628" name="l01628"></a><span class="lineno"> 1628</span> }</div>
|
|
<div class="line"><a id="l01629" name="l01629"></a><span class="lineno"> 1629</span> std::vector<std::pair<double, double>> type_requirement_tightness(</div>
|
|
<div class="line"><a id="l01630" name="l01630"></a><span class="lineno"> 1630</span> num_visit_types_, {0, 0});</div>
|
|
<div class="line"><a id="l01631" name="l01631"></a><span class="lineno"> 1631</span> std::vector<absl::flat_hash_set<int>> type_to_dependent_types(</div>
|
|
<div class="line"><a id="l01632" name="l01632"></a><span class="lineno"> 1632</span> num_visit_types_);</div>
|
|
<div class="line"><a id="l01633" name="l01633"></a><span class="lineno"> 1633</span> SparseBitset<> types_in_requirement_graph(num_visit_types_);</div>
|
|
<div class="line"><a id="l01634" name="l01634"></a><span class="lineno"> 1634</span> std::vector<int> in_degree(num_visit_types_, 0);</div>
|
|
<div class="line"><a id="l01635" name="l01635"></a><span class="lineno"> 1635</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> type = 0; type < num_visit_types_; type++) {</div>
|
|
<div class="line"><a id="l01636" name="l01636"></a><span class="lineno"> 1636</span> <span class="keywordtype">int</span> num_alternative_required_types = 0;</div>
|
|
<div class="line"><a id="l01637" name="l01637"></a><span class="lineno"> 1637</span> <span class="keywordtype">int</span> num_required_sets = 0;</div>
|
|
<div class="line"><a id="l01638" name="l01638"></a><span class="lineno"> 1638</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::vector<absl::flat_hash_set<int>>*</div>
|
|
<div class="line"><a id="l01639" name="l01639"></a><span class="lineno"> 1639</span> required_type_alternatives :</div>
|
|
<div class="line"><a id="l01640" name="l01640"></a><span class="lineno"> 1640</span> {&required_type_alternatives_when_adding_type_index_[type],</div>
|
|
<div class="line"><a id="l01641" name="l01641"></a><span class="lineno"> 1641</span> &required_type_alternatives_when_removing_type_index_[type],</div>
|
|
<div class="line"><a id="l01642" name="l01642"></a><span class="lineno"> 1642</span> &same_vehicle_required_type_alternatives_per_type_index_[type]}) {</div>
|
|
<div class="line"><a id="l01643" name="l01643"></a><span class="lineno"> 1643</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> absl::flat_hash_set<int>& alternatives :</div>
|
|
<div class="line"><a id="l01644" name="l01644"></a><span class="lineno"> 1644</span> *required_type_alternatives) {</div>
|
|
<div class="line"><a id="l01645" name="l01645"></a><span class="lineno"> 1645</span> types_in_requirement_graph.Set(type);</div>
|
|
<div class="line"><a id="l01646" name="l01646"></a><span class="lineno"> 1646</span> num_required_sets++;</div>
|
|
<div class="line"><a id="l01647" name="l01647"></a><span class="lineno"> 1647</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> required_type : alternatives) {</div>
|
|
<div class="line"><a id="l01648" name="l01648"></a><span class="lineno"> 1648</span> type_requirement_tightness[required_type].second +=</div>
|
|
<div class="line"><a id="l01649" name="l01649"></a><span class="lineno"> 1649</span> 1.0 / alternatives.size();</div>
|
|
<div class="line"><a id="l01650" name="l01650"></a><span class="lineno"> 1650</span> types_in_requirement_graph.Set(required_type);</div>
|
|
<div class="line"><a id="l01651" name="l01651"></a><span class="lineno"> 1651</span> num_alternative_required_types++;</div>
|
|
<div class="line"><a id="l01652" name="l01652"></a><span class="lineno"> 1652</span> <span class="keywordflow">if</span> (type_to_dependent_types[required_type].insert(type).second) {</div>
|
|
<div class="line"><a id="l01653" name="l01653"></a><span class="lineno"> 1653</span> in_degree[type]++;</div>
|
|
<div class="line"><a id="l01654" name="l01654"></a><span class="lineno"> 1654</span> }</div>
|
|
<div class="line"><a id="l01655" name="l01655"></a><span class="lineno"> 1655</span> }</div>
|
|
<div class="line"><a id="l01656" name="l01656"></a><span class="lineno"> 1656</span> }</div>
|
|
<div class="line"><a id="l01657" name="l01657"></a><span class="lineno"> 1657</span> }</div>
|
|
<div class="line"><a id="l01658" name="l01658"></a><span class="lineno"> 1658</span> <span class="keywordflow">if</span> (num_alternative_required_types > 0) {</div>
|
|
<div class="line"><a id="l01659" name="l01659"></a><span class="lineno"> 1659</span> type_requirement_tightness[type].first += 1.0 * num_required_sets *</div>
|
|
<div class="line"><a id="l01660" name="l01660"></a><span class="lineno"> 1660</span> num_required_sets /</div>
|
|
<div class="line"><a id="l01661" name="l01661"></a><span class="lineno"> 1661</span> num_alternative_required_types;</div>
|
|
<div class="line"><a id="l01662" name="l01662"></a><span class="lineno"> 1662</span> }</div>
|
|
<div class="line"><a id="l01663" name="l01663"></a><span class="lineno"> 1663</span> }</div>
|
|
<div class="line"><a id="l01664" name="l01664"></a><span class="lineno"> 1664</span> </div>
|
|
<div class="line"><a id="l01665" name="l01665"></a><span class="lineno"> 1665</span> <span class="comment">// Compute topological order of visit types.</span></div>
|
|
<div class="line"><a id="l01666" name="l01666"></a><span class="lineno"> 1666</span> topologically_sorted_visit_types_.clear();</div>
|
|
<div class="line"><a id="l01667" name="l01667"></a><span class="lineno"> 1667</span> std::vector<int> current_types_with_zero_indegree;</div>
|
|
<div class="line"><a id="l01668" name="l01668"></a><span class="lineno"> 1668</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> type : types_in_requirement_graph.PositionsSetAtLeastOnce()) {</div>
|
|
<div class="line"><a id="l01669" name="l01669"></a><span class="lineno"> 1669</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(type_requirement_tightness[type].first > 0 ||</div>
|
|
<div class="line"><a id="l01670" name="l01670"></a><span class="lineno"> 1670</span> type_requirement_tightness[type].second > 0);</div>
|
|
<div class="line"><a id="l01671" name="l01671"></a><span class="lineno"> 1671</span> <span class="keywordflow">if</span> (in_degree[type] == 0) {</div>
|
|
<div class="line"><a id="l01672" name="l01672"></a><span class="lineno"> 1672</span> current_types_with_zero_indegree.push_back(type);</div>
|
|
<div class="line"><a id="l01673" name="l01673"></a><span class="lineno"> 1673</span> }</div>
|
|
<div class="line"><a id="l01674" name="l01674"></a><span class="lineno"> 1674</span> }</div>
|
|
<div class="line"><a id="l01675" name="l01675"></a><span class="lineno"> 1675</span> </div>
|
|
<div class="line"><a id="l01676" name="l01676"></a><span class="lineno"> 1676</span> <span class="keywordtype">int</span> num_types_added = 0;</div>
|
|
<div class="line"><a id="l01677" name="l01677"></a><span class="lineno"> 1677</span> <span class="keywordflow">while</span> (!current_types_with_zero_indegree.empty()) {</div>
|
|
<div class="line"><a id="l01678" name="l01678"></a><span class="lineno"> 1678</span> <span class="comment">// Add all zero-degree nodes to the same topological order group, while</span></div>
|
|
<div class="line"><a id="l01679" name="l01679"></a><span class="lineno"> 1679</span> <span class="comment">// also marking their dependent types that become part of the next group.</span></div>
|
|
<div class="line"><a id="l01680" name="l01680"></a><span class="lineno"> 1680</span> topologically_sorted_visit_types_.push_back({});</div>
|
|
<div class="line"><a id="l01681" name="l01681"></a><span class="lineno"> 1681</span> std::vector<int>& topological_group =</div>
|
|
<div class="line"><a id="l01682" name="l01682"></a><span class="lineno"> 1682</span> topologically_sorted_visit_types_.back();</div>
|
|
<div class="line"><a id="l01683" name="l01683"></a><span class="lineno"> 1683</span> std::vector<int> next_types_with_zero_indegree;</div>
|
|
<div class="line"><a id="l01684" name="l01684"></a><span class="lineno"> 1684</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> type : current_types_with_zero_indegree) {</div>
|
|
<div class="line"><a id="l01685" name="l01685"></a><span class="lineno"> 1685</span> topological_group.push_back(type);</div>
|
|
<div class="line"><a id="l01686" name="l01686"></a><span class="lineno"> 1686</span> num_types_added++;</div>
|
|
<div class="line"><a id="l01687" name="l01687"></a><span class="lineno"> 1687</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> dependent_type : type_to_dependent_types[type]) {</div>
|
|
<div class="line"><a id="l01688" name="l01688"></a><span class="lineno"> 1688</span> <a class="code hl_define" href="base_2logging_8h.html#ab4f56aa24c4c9cddc47a6abd2d747f9a">DCHECK_GT</a>(in_degree[dependent_type], 0);</div>
|
|
<div class="line"><a id="l01689" name="l01689"></a><span class="lineno"> 1689</span> <span class="keywordflow">if</span> (--in_degree[dependent_type] == 0) {</div>
|
|
<div class="line"><a id="l01690" name="l01690"></a><span class="lineno"> 1690</span> next_types_with_zero_indegree.push_back(dependent_type);</div>
|
|
<div class="line"><a id="l01691" name="l01691"></a><span class="lineno"> 1691</span> }</div>
|
|
<div class="line"><a id="l01692" name="l01692"></a><span class="lineno"> 1692</span> }</div>
|
|
<div class="line"><a id="l01693" name="l01693"></a><span class="lineno"> 1693</span> }</div>
|
|
<div class="line"><a id="l01694" name="l01694"></a><span class="lineno"> 1694</span> <span class="comment">// Sort the types in the current topological group based on their</span></div>
|
|
<div class="line"><a id="l01695" name="l01695"></a><span class="lineno"> 1695</span> <span class="comment">// requirement tightness.</span></div>
|
|
<div class="line"><a id="l01696" name="l01696"></a><span class="lineno"> 1696</span> <span class="comment">// NOTE: For a deterministic order, types with equal tightness are sorted by</span></div>
|
|
<div class="line"><a id="l01697" name="l01697"></a><span class="lineno"> 1697</span> <span class="comment">// increasing type.</span></div>
|
|
<div class="line"><a id="l01698" name="l01698"></a><span class="lineno"> 1698</span> <span class="comment">// TODO(user): Put types of the same topological order and same</span></div>
|
|
<div class="line"><a id="l01699" name="l01699"></a><span class="lineno"> 1699</span> <span class="comment">// requirement tightness in a single group (so that they all get inserted</span></div>
|
|
<div class="line"><a id="l01700" name="l01700"></a><span class="lineno"> 1700</span> <span class="comment">// simultaneously by the GlobalCheapestInsertion heuristic, for instance).</span></div>
|
|
<div class="line"><a id="l01701" name="l01701"></a><span class="lineno"> 1701</span> std::sort(topological_group.begin(), topological_group.end(),</div>
|
|
<div class="line"><a id="l01702" name="l01702"></a><span class="lineno"> 1702</span> [&type_requirement_tightness](<span class="keywordtype">int</span> type1, <span class="keywordtype">int</span> type2) {</div>
|
|
<div class="line"><a id="l01703" name="l01703"></a><span class="lineno"> 1703</span> const auto& tightness1 = type_requirement_tightness[type1];</div>
|
|
<div class="line"><a id="l01704" name="l01704"></a><span class="lineno"> 1704</span> const auto& tightness2 = type_requirement_tightness[type2];</div>
|
|
<div class="line"><a id="l01705" name="l01705"></a><span class="lineno"> 1705</span> return tightness1 > tightness2 ||</div>
|
|
<div class="line"><a id="l01706" name="l01706"></a><span class="lineno"> 1706</span> (tightness1 == tightness2 && type1 < type2);</div>
|
|
<div class="line"><a id="l01707" name="l01707"></a><span class="lineno"> 1707</span> });</div>
|
|
<div class="line"><a id="l01708" name="l01708"></a><span class="lineno"> 1708</span> <span class="comment">// Swap the current types with zero in-degree with the next ones.</span></div>
|
|
<div class="line"><a id="l01709" name="l01709"></a><span class="lineno"> 1709</span> current_types_with_zero_indegree.swap(next_types_with_zero_indegree);</div>
|
|
<div class="line"><a id="l01710" name="l01710"></a><span class="lineno"> 1710</span> }</div>
|
|
<div class="line"><a id="l01711" name="l01711"></a><span class="lineno"> 1711</span> </div>
|
|
<div class="line"><a id="l01712" name="l01712"></a><span class="lineno"> 1712</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_types_in_requirement_graph =</div>
|
|
<div class="line"><a id="l01713" name="l01713"></a><span class="lineno"> 1713</span> types_in_requirement_graph.NumberOfSetCallsWithDifferentArguments();</div>
|
|
<div class="line"><a id="l01714" name="l01714"></a><span class="lineno"> 1714</span> <a class="code hl_define" href="base_2logging_8h.html#a4395e95bab44e222cb2e77251017a0e2">DCHECK_LE</a>(num_types_added, num_types_in_requirement_graph);</div>
|
|
<div class="line"><a id="l01715" name="l01715"></a><span class="lineno"> 1715</span> <span class="keywordflow">if</span> (num_types_added < num_types_in_requirement_graph) {</div>
|
|
<div class="line"><a id="l01716" name="l01716"></a><span class="lineno"> 1716</span> <span class="comment">// Requirement graph is cyclic, no topological order.</span></div>
|
|
<div class="line"><a id="l01717" name="l01717"></a><span class="lineno"> 1717</span> topologically_sorted_visit_types_.clear();</div>
|
|
<div class="line"><a id="l01718" name="l01718"></a><span class="lineno"> 1718</span> }</div>
|
|
<div class="line"><a id="l01719" name="l01719"></a><span class="lineno"> 1719</span>}</div>
|
|
<div class="line"><a id="l01720" name="l01720"></a><span class="lineno"> 1720</span> </div>
|
|
<div class="line"><a id="l01721" name="l01721"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a855597cfbfe217d469f87488444bb0cd"> 1721</a></span><a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#afa7cbbd4db2dd5d0bec3393efc9ebac1">RoutingModel::DisjunctionIndex</a> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a855597cfbfe217d469f87488444bb0cd">RoutingModel::AddDisjunction</a>(</div>
|
|
<div class="line"><a id="l01722" name="l01722"></a><span class="lineno"> 1722</span> <span class="keyword">const</span> std::vector<int64_t>& indices, int64_t penalty,</div>
|
|
<div class="line"><a id="l01723" name="l01723"></a><span class="lineno"> 1723</span> int64_t max_cardinality) {</div>
|
|
<div class="line"><a id="l01724" name="l01724"></a><span class="lineno"> 1724</span> <a class="code hl_define" href="base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9">CHECK_GE</a>(max_cardinality, 1);</div>
|
|
<div class="line"><a id="l01725" name="l01725"></a><span class="lineno"> 1725</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < indices.size(); ++i) {</div>
|
|
<div class="line"><a id="l01726" name="l01726"></a><span class="lineno"> 1726</span> <a class="code hl_define" href="base_2logging_8h.html#ab25e01a2942b821d66371fc68d53f2eb">CHECK_NE</a>(<a class="code hl_variable" href="namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955">kUnassigned</a>, indices[i]);</div>
|
|
<div class="line"><a id="l01727" name="l01727"></a><span class="lineno"> 1727</span> }</div>
|
|
<div class="line"><a id="l01728" name="l01728"></a><span class="lineno"> 1728</span> </div>
|
|
<div class="line"><a id="l01729" name="l01729"></a><span class="lineno"> 1729</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#afa7cbbd4db2dd5d0bec3393efc9ebac1">DisjunctionIndex</a> disjunction_index(disjunctions_.size());</div>
|
|
<div class="line"><a id="l01730" name="l01730"></a><span class="lineno"> 1730</span> disjunctions_.push_back({indices, {penalty, max_cardinality}});</div>
|
|
<div class="line"><a id="l01731" name="l01731"></a><span class="lineno"> 1731</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> : indices) {</div>
|
|
<div class="line"><a id="l01732" name="l01732"></a><span class="lineno"> 1732</span> index_to_disjunctions_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].push_back(disjunction_index);</div>
|
|
<div class="line"><a id="l01733" name="l01733"></a><span class="lineno"> 1733</span> }</div>
|
|
<div class="line"><a id="l01734" name="l01734"></a><span class="lineno"> 1734</span> <span class="keywordflow">return</span> disjunction_index;</div>
|
|
<div class="line"><a id="l01735" name="l01735"></a><span class="lineno"> 1735</span>}</div>
|
|
<div class="line"><a id="l01736" name="l01736"></a><span class="lineno"> 1736</span> </div>
|
|
<div class="line"><a id="l01737" name="l01737"></a><span class="lineno"> 1737</span>std::vector<std::pair<int64_t, int64_t>></div>
|
|
<div class="line"><a id="l01738" name="l01738"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#aba04bfb310dabb1357ebabd3163350c9"> 1738</a></span><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aba04bfb310dabb1357ebabd3163350c9">RoutingModel::GetPerfectBinaryDisjunctions</a>()<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01739" name="l01739"></a><span class="lineno"> 1739</span> std::vector<std::pair<int64_t, int64_t>> var_index_pairs;</div>
|
|
<div class="line"><a id="l01740" name="l01740"></a><span class="lineno"> 1740</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> Disjunction& disjunction : disjunctions_) {</div>
|
|
<div class="line"><a id="l01741" name="l01741"></a><span class="lineno"> 1741</span> <span class="keyword">const</span> std::vector<int64_t>& <a class="code hl_variable" href="sat_2lp__utils_8cc.html#a742ae1554f2decd63d35be3e6ff4f58d">var_indices</a> = disjunction.indices;</div>
|
|
<div class="line"><a id="l01742" name="l01742"></a><span class="lineno"> 1742</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="sat_2lp__utils_8cc.html#a742ae1554f2decd63d35be3e6ff4f58d">var_indices</a>.size() != 2) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l01743" name="l01743"></a><span class="lineno"> 1743</span> <span class="keyword">const</span> int64_t v0 = <a class="code hl_variable" href="sat_2lp__utils_8cc.html#a742ae1554f2decd63d35be3e6ff4f58d">var_indices</a>[0];</div>
|
|
<div class="line"><a id="l01744" name="l01744"></a><span class="lineno"> 1744</span> <span class="keyword">const</span> int64_t v1 = <a class="code hl_variable" href="sat_2lp__utils_8cc.html#a742ae1554f2decd63d35be3e6ff4f58d">var_indices</a>[1];</div>
|
|
<div class="line"><a id="l01745" name="l01745"></a><span class="lineno"> 1745</span> <span class="keywordflow">if</span> (index_to_disjunctions_[v0].size() == 1 &&</div>
|
|
<div class="line"><a id="l01746" name="l01746"></a><span class="lineno"> 1746</span> index_to_disjunctions_[v1].size() == 1) {</div>
|
|
<div class="line"><a id="l01747" name="l01747"></a><span class="lineno"> 1747</span> <span class="comment">// We output sorted pairs.</span></div>
|
|
<div class="line"><a id="l01748" name="l01748"></a><span class="lineno"> 1748</span> var_index_pairs.push_back({<a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::min</a>(v0, v1), <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(v0, v1)});</div>
|
|
<div class="line"><a id="l01749" name="l01749"></a><span class="lineno"> 1749</span> }</div>
|
|
<div class="line"><a id="l01750" name="l01750"></a><span class="lineno"> 1750</span> }</div>
|
|
<div class="line"><a id="l01751" name="l01751"></a><span class="lineno"> 1751</span> std::sort(var_index_pairs.begin(), var_index_pairs.end());</div>
|
|
<div class="line"><a id="l01752" name="l01752"></a><span class="lineno"> 1752</span> <span class="keywordflow">return</span> var_index_pairs;</div>
|
|
<div class="line"><a id="l01753" name="l01753"></a><span class="lineno"> 1753</span>}</div>
|
|
<div class="line"><a id="l01754" name="l01754"></a><span class="lineno"> 1754</span> </div>
|
|
<div class="line"><a id="l01755" name="l01755"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a8b9a513f402e84f4c71436cf430f248a"> 1755</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8b9a513f402e84f4c71436cf430f248a">RoutingModel::IgnoreDisjunctionsAlreadyForcedToZero</a>() {</div>
|
|
<div class="line"><a id="l01756" name="l01756"></a><span class="lineno"> 1756</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(!closed_);</div>
|
|
<div class="line"><a id="l01757" name="l01757"></a><span class="lineno"> 1757</span> <span class="keywordflow">for</span> (Disjunction& disjunction : disjunctions_) {</div>
|
|
<div class="line"><a id="l01758" name="l01758"></a><span class="lineno"> 1758</span> <span class="keywordtype">bool</span> has_one_potentially_active_var = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l01759" name="l01759"></a><span class="lineno"> 1759</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> int64_t var_index : disjunction.indices) {</div>
|
|
<div class="line"><a id="l01760" name="l01760"></a><span class="lineno"> 1760</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab1d54f34a26afd08eeef25e8725dd7c2">ActiveVar</a>(var_index)->Max() > 0) {</div>
|
|
<div class="line"><a id="l01761" name="l01761"></a><span class="lineno"> 1761</span> has_one_potentially_active_var = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l01762" name="l01762"></a><span class="lineno"> 1762</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l01763" name="l01763"></a><span class="lineno"> 1763</span> }</div>
|
|
<div class="line"><a id="l01764" name="l01764"></a><span class="lineno"> 1764</span> }</div>
|
|
<div class="line"><a id="l01765" name="l01765"></a><span class="lineno"> 1765</span> <span class="keywordflow">if</span> (!has_one_potentially_active_var) {</div>
|
|
<div class="line"><a id="l01766" name="l01766"></a><span class="lineno"> 1766</span> disjunction.value.max_cardinality = 0;</div>
|
|
<div class="line"><a id="l01767" name="l01767"></a><span class="lineno"> 1767</span> }</div>
|
|
<div class="line"><a id="l01768" name="l01768"></a><span class="lineno"> 1768</span> }</div>
|
|
<div class="line"><a id="l01769" name="l01769"></a><span class="lineno"> 1769</span>}</div>
|
|
<div class="line"><a id="l01770" name="l01770"></a><span class="lineno"> 1770</span> </div>
|
|
<div class="line"><a id="l01771" name="l01771"></a><span class="lineno"> 1771</span><a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* RoutingModel::CreateDisjunction(<a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#afa7cbbd4db2dd5d0bec3393efc9ebac1">DisjunctionIndex</a> disjunction) {</div>
|
|
<div class="line"><a id="l01772" name="l01772"></a><span class="lineno"> 1772</span> <span class="keyword">const</span> std::vector<int64_t>& indices = disjunctions_[disjunction].indices;</div>
|
|
<div class="line"><a id="l01773" name="l01773"></a><span class="lineno"> 1773</span> <span class="keyword">const</span> <span class="keywordtype">int</span> indices_size = indices.size();</div>
|
|
<div class="line"><a id="l01774" name="l01774"></a><span class="lineno"> 1774</span> std::vector<IntVar*> disjunction_vars(indices_size);</div>
|
|
<div class="line"><a id="l01775" name="l01775"></a><span class="lineno"> 1775</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < indices_size; ++i) {</div>
|
|
<div class="line"><a id="l01776" name="l01776"></a><span class="lineno"> 1776</span> <span class="keyword">const</span> int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = indices[i];</div>
|
|
<div class="line"><a id="l01777" name="l01777"></a><span class="lineno"> 1777</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>, <a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#a24926108b770033792d015cb86aeffb3">Size</a>());</div>
|
|
<div class="line"><a id="l01778" name="l01778"></a><span class="lineno"> 1778</span> disjunction_vars[i] = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab1d54f34a26afd08eeef25e8725dd7c2">ActiveVar</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l01779" name="l01779"></a><span class="lineno"> 1779</span> }</div>
|
|
<div class="line"><a id="l01780" name="l01780"></a><span class="lineno"> 1780</span> <span class="keyword">const</span> int64_t max_cardinality =</div>
|
|
<div class="line"><a id="l01781" name="l01781"></a><span class="lineno"> 1781</span> disjunctions_[disjunction].value.max_cardinality;</div>
|
|
<div class="line"><a id="l01782" name="l01782"></a><span class="lineno"> 1782</span> IntVar* no_active_var = solver_->MakeBoolVar();</div>
|
|
<div class="line"><a id="l01783" name="l01783"></a><span class="lineno"> 1783</span> IntVar* number_active_vars = solver_->MakeIntVar(0, max_cardinality);</div>
|
|
<div class="line"><a id="l01784" name="l01784"></a><span class="lineno"> 1784</span> solver_->AddConstraint(</div>
|
|
<div class="line"><a id="l01785" name="l01785"></a><span class="lineno"> 1785</span> solver_->MakeSumEquality(disjunction_vars, number_active_vars));</div>
|
|
<div class="line"><a id="l01786" name="l01786"></a><span class="lineno"> 1786</span> solver_->AddConstraint(solver_->MakeIsDifferentCstCt(</div>
|
|
<div class="line"><a id="l01787" name="l01787"></a><span class="lineno"> 1787</span> number_active_vars, max_cardinality, no_active_var));</div>
|
|
<div class="line"><a id="l01788" name="l01788"></a><span class="lineno"> 1788</span> <span class="keyword">const</span> int64_t penalty = disjunctions_[disjunction].value.penalty;</div>
|
|
<div class="line"><a id="l01789" name="l01789"></a><span class="lineno"> 1789</span> <span class="keywordflow">if</span> (penalty < 0) {</div>
|
|
<div class="line"><a id="l01790" name="l01790"></a><span class="lineno"> 1790</span> no_active_var->SetMax(0);</div>
|
|
<div class="line"><a id="l01791" name="l01791"></a><span class="lineno"> 1791</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l01792" name="l01792"></a><span class="lineno"> 1792</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l01793" name="l01793"></a><span class="lineno"> 1793</span> <span class="keywordflow">return</span> solver_->MakeProd(no_active_var, penalty)->Var();</div>
|
|
<div class="line"><a id="l01794" name="l01794"></a><span class="lineno"> 1794</span> }</div>
|
|
<div class="line"><a id="l01795" name="l01795"></a><span class="lineno"> 1795</span>}</div>
|
|
<div class="line"><a id="l01796" name="l01796"></a><span class="lineno"> 1796</span> </div>
|
|
<div class="line"><a id="l01797" name="l01797"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a3941ea5b7354b04afea324f91a2ebd35"> 1797</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a3941ea5b7354b04afea324f91a2ebd35">RoutingModel::AddSoftSameVehicleConstraint</a>(</div>
|
|
<div class="line"><a id="l01798" name="l01798"></a><span class="lineno"> 1798</span> <span class="keyword">const</span> std::vector<int64_t>& indices, int64_t <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a>) {</div>
|
|
<div class="line"><a id="l01799" name="l01799"></a><span class="lineno"> 1799</span> <span class="keywordflow">if</span> (!indices.empty()) {</div>
|
|
<div class="line"><a id="l01800" name="l01800"></a><span class="lineno"> 1800</span> ValuedNodes<int64_t> same_vehicle_cost;</div>
|
|
<div class="line"><a id="l01801" name="l01801"></a><span class="lineno"> 1801</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> : indices) {</div>
|
|
<div class="line"><a id="l01802" name="l01802"></a><span class="lineno"> 1802</span> same_vehicle_cost.indices.push_back(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l01803" name="l01803"></a><span class="lineno"> 1803</span> }</div>
|
|
<div class="line"><a id="l01804" name="l01804"></a><span class="lineno"> 1804</span> same_vehicle_cost.value = <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a>;</div>
|
|
<div class="line"><a id="l01805" name="l01805"></a><span class="lineno"> 1805</span> same_vehicle_costs_.push_back(same_vehicle_cost);</div>
|
|
<div class="line"><a id="l01806" name="l01806"></a><span class="lineno"> 1806</span> }</div>
|
|
<div class="line"><a id="l01807" name="l01807"></a><span class="lineno"> 1807</span>}</div>
|
|
<div class="line"><a id="l01808" name="l01808"></a><span class="lineno"> 1808</span> </div>
|
|
<div class="line"><a id="l01809" name="l01809"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#aaa20e609421302541206a667e0c71f36"> 1809</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aaa20e609421302541206a667e0c71f36">RoutingModel::SetAllowedVehiclesForIndex</a>(<span class="keyword">const</span> std::vector<int>& <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>,</div>
|
|
<div class="line"><a id="l01810" name="l01810"></a><span class="lineno"> 1810</span> int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>) {</div>
|
|
<div class="line"><a id="l01811" name="l01811"></a><span class="lineno"> 1811</span> <span class="keyword">auto</span>& allowed_vehicles = allowed_vehicles_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>];</div>
|
|
<div class="line"><a id="l01812" name="l01812"></a><span class="lineno"> 1812</span> allowed_vehicles.clear();</div>
|
|
<div class="line"><a id="l01813" name="l01813"></a><span class="lineno"> 1813</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle : <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>) {</div>
|
|
<div class="line"><a id="l01814" name="l01814"></a><span class="lineno"> 1814</span> allowed_vehicles.insert(vehicle);</div>
|
|
<div class="line"><a id="l01815" name="l01815"></a><span class="lineno"> 1815</span> }</div>
|
|
<div class="line"><a id="l01816" name="l01816"></a><span class="lineno"> 1816</span>}</div>
|
|
<div class="line"><a id="l01817" name="l01817"></a><span class="lineno"> 1817</span> </div>
|
|
<div class="line"><a id="l01818" name="l01818"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a7ab8e7947bd1cf91da5560bf7db1fa61"> 1818</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a7ab8e7947bd1cf91da5560bf7db1fa61">RoutingModel::AddPickupAndDelivery</a>(int64_t pickup, int64_t delivery) {</div>
|
|
<div class="line"><a id="l01819" name="l01819"></a><span class="lineno"> 1819</span> AddPickupAndDeliverySetsInternal({pickup}, {delivery});</div>
|
|
<div class="line"><a id="l01820" name="l01820"></a><span class="lineno"> 1820</span> pickup_delivery_disjunctions_.push_back({<a class="code hl_variable" href="classoperations__research_1_1_routing_model.html#ae5a61ca8a5a897aa6c4ce5c466e8f45f">kNoDisjunction</a>, <a class="code hl_variable" href="classoperations__research_1_1_routing_model.html#ae5a61ca8a5a897aa6c4ce5c466e8f45f">kNoDisjunction</a>});</div>
|
|
<div class="line"><a id="l01821" name="l01821"></a><span class="lineno"> 1821</span>}</div>
|
|
<div class="line"><a id="l01822" name="l01822"></a><span class="lineno"> 1822</span> </div>
|
|
<div class="line"><a id="l01823" name="l01823"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a5f404ec17ed0917a6ac3711ac53e60f1"> 1823</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5f404ec17ed0917a6ac3711ac53e60f1">RoutingModel::AddPickupAndDeliverySets</a>(</div>
|
|
<div class="line"><a id="l01824" name="l01824"></a><span class="lineno"> 1824</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#afa7cbbd4db2dd5d0bec3393efc9ebac1">DisjunctionIndex</a> pickup_disjunction,</div>
|
|
<div class="line"><a id="l01825" name="l01825"></a><span class="lineno"> 1825</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#afa7cbbd4db2dd5d0bec3393efc9ebac1">DisjunctionIndex</a> delivery_disjunction) {</div>
|
|
<div class="line"><a id="l01826" name="l01826"></a><span class="lineno"> 1826</span> AddPickupAndDeliverySetsInternal(</div>
|
|
<div class="line"><a id="l01827" name="l01827"></a><span class="lineno"> 1827</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#affd6cc6c76adff8e52220cff2c61635b">GetDisjunctionNodeIndices</a>(pickup_disjunction),</div>
|
|
<div class="line"><a id="l01828" name="l01828"></a><span class="lineno"> 1828</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#affd6cc6c76adff8e52220cff2c61635b">GetDisjunctionNodeIndices</a>(delivery_disjunction));</div>
|
|
<div class="line"><a id="l01829" name="l01829"></a><span class="lineno"> 1829</span> pickup_delivery_disjunctions_.push_back(</div>
|
|
<div class="line"><a id="l01830" name="l01830"></a><span class="lineno"> 1830</span> {pickup_disjunction, delivery_disjunction});</div>
|
|
<div class="line"><a id="l01831" name="l01831"></a><span class="lineno"> 1831</span>}</div>
|
|
<div class="line"><a id="l01832" name="l01832"></a><span class="lineno"> 1832</span> </div>
|
|
<div class="line"><a id="l01833" name="l01833"></a><span class="lineno"> 1833</span><span class="keywordtype">void</span> RoutingModel::AddPickupAndDeliverySetsInternal(</div>
|
|
<div class="line"><a id="l01834" name="l01834"></a><span class="lineno"> 1834</span> <span class="keyword">const</span> std::vector<int64_t>& pickups,</div>
|
|
<div class="line"><a id="l01835" name="l01835"></a><span class="lineno"> 1835</span> <span class="keyword">const</span> std::vector<int64_t>& deliveries) {</div>
|
|
<div class="line"><a id="l01836" name="l01836"></a><span class="lineno"> 1836</span> <span class="keywordflow">if</span> (pickups.empty() || deliveries.empty()) {</div>
|
|
<div class="line"><a id="l01837" name="l01837"></a><span class="lineno"> 1837</span> <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l01838" name="l01838"></a><span class="lineno"> 1838</span> }</div>
|
|
<div class="line"><a id="l01839" name="l01839"></a><span class="lineno"> 1839</span> <span class="keyword">const</span> int64_t size = <a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#a24926108b770033792d015cb86aeffb3">Size</a>();</div>
|
|
<div class="line"><a id="l01840" name="l01840"></a><span class="lineno"> 1840</span> <span class="keyword">const</span> <span class="keywordtype">int</span> pair_index = pickup_delivery_pairs_.size();</div>
|
|
<div class="line"><a id="l01841" name="l01841"></a><span class="lineno"> 1841</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> pickup_index = 0; pickup_index < pickups.size(); pickup_index++) {</div>
|
|
<div class="line"><a id="l01842" name="l01842"></a><span class="lineno"> 1842</span> <span class="keyword">const</span> int64_t pickup = pickups[pickup_index];</div>
|
|
<div class="line"><a id="l01843" name="l01843"></a><span class="lineno"> 1843</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(pickup, size);</div>
|
|
<div class="line"><a id="l01844" name="l01844"></a><span class="lineno"> 1844</span> index_to_pickup_index_pairs_[pickup].emplace_back(pair_index, pickup_index);</div>
|
|
<div class="line"><a id="l01845" name="l01845"></a><span class="lineno"> 1845</span> }</div>
|
|
<div class="line"><a id="l01846" name="l01846"></a><span class="lineno"> 1846</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> delivery_index = 0; delivery_index < deliveries.size();</div>
|
|
<div class="line"><a id="l01847" name="l01847"></a><span class="lineno"> 1847</span> delivery_index++) {</div>
|
|
<div class="line"><a id="l01848" name="l01848"></a><span class="lineno"> 1848</span> <span class="keyword">const</span> int64_t delivery = deliveries[delivery_index];</div>
|
|
<div class="line"><a id="l01849" name="l01849"></a><span class="lineno"> 1849</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(delivery, size);</div>
|
|
<div class="line"><a id="l01850" name="l01850"></a><span class="lineno"> 1850</span> index_to_delivery_index_pairs_[delivery].emplace_back(pair_index,</div>
|
|
<div class="line"><a id="l01851" name="l01851"></a><span class="lineno"> 1851</span> delivery_index);</div>
|
|
<div class="line"><a id="l01852" name="l01852"></a><span class="lineno"> 1852</span> }</div>
|
|
<div class="line"><a id="l01853" name="l01853"></a><span class="lineno"> 1853</span> pickup_delivery_pairs_.push_back({pickups, deliveries});</div>
|
|
<div class="line"><a id="l01854" name="l01854"></a><span class="lineno"> 1854</span>}</div>
|
|
<div class="line"><a id="l01855" name="l01855"></a><span class="lineno"> 1855</span> </div>
|
|
<div class="line"><a id="l01856" name="l01856"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#ac6d5e197d4c8db922db0b8e2a8b7074e"> 1856</a></span><span class="keyword">const</span> std::vector<std::pair<int, int>>& <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ac6d5e197d4c8db922db0b8e2a8b7074e">RoutingModel::GetPickupIndexPairs</a>(</div>
|
|
<div class="line"><a id="l01857" name="l01857"></a><span class="lineno"> 1857</span> int64_t node_index)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01858" name="l01858"></a><span class="lineno"> 1858</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(node_index, index_to_pickup_index_pairs_.size());</div>
|
|
<div class="line"><a id="l01859" name="l01859"></a><span class="lineno"> 1859</span> <span class="keywordflow">return</span> index_to_pickup_index_pairs_[node_index];</div>
|
|
<div class="line"><a id="l01860" name="l01860"></a><span class="lineno"> 1860</span>}</div>
|
|
<div class="line"><a id="l01861" name="l01861"></a><span class="lineno"> 1861</span> </div>
|
|
<div class="line"><a id="l01862" name="l01862"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a434b15d056c7e1751925eba475e84c32"> 1862</a></span><span class="keyword">const</span> std::vector<std::pair<int, int>>& <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a434b15d056c7e1751925eba475e84c32">RoutingModel::GetDeliveryIndexPairs</a>(</div>
|
|
<div class="line"><a id="l01863" name="l01863"></a><span class="lineno"> 1863</span> int64_t node_index)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01864" name="l01864"></a><span class="lineno"> 1864</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(node_index, index_to_delivery_index_pairs_.size());</div>
|
|
<div class="line"><a id="l01865" name="l01865"></a><span class="lineno"> 1865</span> <span class="keywordflow">return</span> index_to_delivery_index_pairs_[node_index];</div>
|
|
<div class="line"><a id="l01866" name="l01866"></a><span class="lineno"> 1866</span>}</div>
|
|
<div class="line"><a id="l01867" name="l01867"></a><span class="lineno"> 1867</span> </div>
|
|
<div class="line"><a id="l01868" name="l01868"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a8bd5bf6b0d1d0c1c5e2470c5f4882a62"> 1868</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8bd5bf6b0d1d0c1c5e2470c5f4882a62">RoutingModel::SetPickupAndDeliveryPolicyOfVehicle</a>(</div>
|
|
<div class="line"><a id="l01869" name="l01869"></a><span class="lineno"> 1869</span> <a class="code hl_enumeration" href="classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83">PickupAndDeliveryPolicy</a> policy, <span class="keywordtype">int</span> vehicle) {</div>
|
|
<div class="line"><a id="l01870" name="l01870"></a><span class="lineno"> 1870</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(vehicle, vehicles_);</div>
|
|
<div class="line"><a id="l01871" name="l01871"></a><span class="lineno"> 1871</span> vehicle_pickup_delivery_policy_[vehicle] = policy;</div>
|
|
<div class="line"><a id="l01872" name="l01872"></a><span class="lineno"> 1872</span>}</div>
|
|
<div class="line"><a id="l01873" name="l01873"></a><span class="lineno"> 1873</span> </div>
|
|
<div class="line"><a id="l01874" name="l01874"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a3656e594d89a44fb6b35ba8f2d395624"> 1874</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a3656e594d89a44fb6b35ba8f2d395624">RoutingModel::SetPickupAndDeliveryPolicyOfAllVehicles</a>(</div>
|
|
<div class="line"><a id="l01875" name="l01875"></a><span class="lineno"> 1875</span> <a class="code hl_enumeration" href="classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83">PickupAndDeliveryPolicy</a> policy) {</div>
|
|
<div class="line"><a id="l01876" name="l01876"></a><span class="lineno"> 1876</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(0, vehicles_);</div>
|
|
<div class="line"><a id="l01877" name="l01877"></a><span class="lineno"> 1877</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < vehicles_; ++i) {</div>
|
|
<div class="line"><a id="l01878" name="l01878"></a><span class="lineno"> 1878</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8bd5bf6b0d1d0c1c5e2470c5f4882a62">SetPickupAndDeliveryPolicyOfVehicle</a>(policy, i);</div>
|
|
<div class="line"><a id="l01879" name="l01879"></a><span class="lineno"> 1879</span> }</div>
|
|
<div class="line"><a id="l01880" name="l01880"></a><span class="lineno"> 1880</span>}</div>
|
|
<div class="line"><a id="l01881" name="l01881"></a><span class="lineno"> 1881</span> </div>
|
|
<div class="line"><a id="l01882" name="l01882"></a><span class="lineno"> 1882</span><a class="code hl_enumeration" href="classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83">RoutingModel::PickupAndDeliveryPolicy</a></div>
|
|
<div class="line"><a id="l01883" name="l01883"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a351611d23877598dbf426f4235b68112"> 1883</a></span><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a351611d23877598dbf426f4235b68112">RoutingModel::GetPickupAndDeliveryPolicyOfVehicle</a>(<span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01884" name="l01884"></a><span class="lineno"> 1884</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(vehicle, vehicles_);</div>
|
|
<div class="line"><a id="l01885" name="l01885"></a><span class="lineno"> 1885</span> <span class="keywordflow">return</span> vehicle_pickup_delivery_policy_[vehicle];</div>
|
|
<div class="line"><a id="l01886" name="l01886"></a><span class="lineno"> 1886</span>}</div>
|
|
<div class="line"><a id="l01887" name="l01887"></a><span class="lineno"> 1887</span> </div>
|
|
<div class="line"><a id="l01888" name="l01888"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#ad62f14646fa4da5b6836a2ae505706d2"> 1888</a></span><span class="keywordtype">int</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ad62f14646fa4da5b6836a2ae505706d2">RoutingModel::GetNumOfSingletonNodes</a>()<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01889" name="l01889"></a><span class="lineno"> 1889</span> <span class="keywordtype">int</span> count = 0;</div>
|
|
<div class="line"><a id="l01890" name="l01890"></a><span class="lineno"> 1890</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a911482cb7495f22638a02066adf13c8b">Nexts</a>().size(); ++i) {</div>
|
|
<div class="line"><a id="l01891" name="l01891"></a><span class="lineno"> 1891</span> <span class="comment">// End nodes have no next variables.</span></div>
|
|
<div class="line"><a id="l01892" name="l01892"></a><span class="lineno"> 1892</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a3582f01eabc65ba4b801215ca6420a7c">IsStart</a>(i) && <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ac6d5e197d4c8db922db0b8e2a8b7074e">GetPickupIndexPairs</a>(i).empty() &&</div>
|
|
<div class="line"><a id="l01893" name="l01893"></a><span class="lineno"> 1893</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a434b15d056c7e1751925eba475e84c32">GetDeliveryIndexPairs</a>(i).empty()) {</div>
|
|
<div class="line"><a id="l01894" name="l01894"></a><span class="lineno"> 1894</span> ++count;</div>
|
|
<div class="line"><a id="l01895" name="l01895"></a><span class="lineno"> 1895</span> }</div>
|
|
<div class="line"><a id="l01896" name="l01896"></a><span class="lineno"> 1896</span> }</div>
|
|
<div class="line"><a id="l01897" name="l01897"></a><span class="lineno"> 1897</span> <span class="keywordflow">return</span> count;</div>
|
|
<div class="line"><a id="l01898" name="l01898"></a><span class="lineno"> 1898</span>}</div>
|
|
<div class="line"><a id="l01899" name="l01899"></a><span class="lineno"> 1899</span> </div>
|
|
<div class="line"><a id="l01900" name="l01900"></a><span class="lineno"> 1900</span><a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* RoutingModel::CreateSameVehicleCost(<span class="keywordtype">int</span> vehicle_index) {</div>
|
|
<div class="line"><a id="l01901" name="l01901"></a><span class="lineno"> 1901</span> <span class="keyword">const</span> std::vector<int64_t>& indices =</div>
|
|
<div class="line"><a id="l01902" name="l01902"></a><span class="lineno"> 1902</span> same_vehicle_costs_[vehicle_index].indices;</div>
|
|
<div class="line"><a id="l01903" name="l01903"></a><span class="lineno"> 1903</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(!indices.empty());</div>
|
|
<div class="line"><a id="l01904" name="l01904"></a><span class="lineno"> 1904</span> std::vector<IntVar*> vehicle_counts;</div>
|
|
<div class="line"><a id="l01905" name="l01905"></a><span class="lineno"> 1905</span> solver_->MakeIntVarArray(vehicle_vars_.size() + 1, 0, indices.size() + 1,</div>
|
|
<div class="line"><a id="l01906" name="l01906"></a><span class="lineno"> 1906</span> &vehicle_counts);</div>
|
|
<div class="line"><a id="l01907" name="l01907"></a><span class="lineno"> 1907</span> std::vector<int64_t> vehicle_values(vehicle_vars_.size() + 1);</div>
|
|
<div class="line"><a id="l01908" name="l01908"></a><span class="lineno"> 1908</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < vehicle_vars_.size(); ++i) {</div>
|
|
<div class="line"><a id="l01909" name="l01909"></a><span class="lineno"> 1909</span> vehicle_values[i] = i;</div>
|
|
<div class="line"><a id="l01910" name="l01910"></a><span class="lineno"> 1910</span> }</div>
|
|
<div class="line"><a id="l01911" name="l01911"></a><span class="lineno"> 1911</span> vehicle_values[vehicle_vars_.size()] = -1;</div>
|
|
<div class="line"><a id="l01912" name="l01912"></a><span class="lineno"> 1912</span> std::vector<IntVar*> vehicle_vars;</div>
|
|
<div class="line"><a id="l01913" name="l01913"></a><span class="lineno"> 1913</span> vehicle_vars.reserve(indices.size());</div>
|
|
<div class="line"><a id="l01914" name="l01914"></a><span class="lineno"> 1914</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> : indices) {</div>
|
|
<div class="line"><a id="l01915" name="l01915"></a><span class="lineno"> 1915</span> vehicle_vars.push_back(vehicle_vars_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>]);</div>
|
|
<div class="line"><a id="l01916" name="l01916"></a><span class="lineno"> 1916</span> }</div>
|
|
<div class="line"><a id="l01917" name="l01917"></a><span class="lineno"> 1917</span> solver_->AddConstraint(solver_->MakeDistribute(vehicle_vars, vehicle_counts));</div>
|
|
<div class="line"><a id="l01918" name="l01918"></a><span class="lineno"> 1918</span> std::vector<IntVar*> vehicle_used;</div>
|
|
<div class="line"><a id="l01919" name="l01919"></a><span class="lineno"> 1919</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < vehicle_vars_.size() + 1; ++i) {</div>
|
|
<div class="line"><a id="l01920" name="l01920"></a><span class="lineno"> 1920</span> vehicle_used.push_back(</div>
|
|
<div class="line"><a id="l01921" name="l01921"></a><span class="lineno"> 1921</span> solver_->MakeIsGreaterOrEqualCstVar(vehicle_counts[i], 1));</div>
|
|
<div class="line"><a id="l01922" name="l01922"></a><span class="lineno"> 1922</span> }</div>
|
|
<div class="line"><a id="l01923" name="l01923"></a><span class="lineno"> 1923</span> vehicle_used.push_back(solver_->MakeIntConst(-1));</div>
|
|
<div class="line"><a id="l01924" name="l01924"></a><span class="lineno"> 1924</span> <span class="keywordflow">return</span> solver_</div>
|
|
<div class="line"><a id="l01925" name="l01925"></a><span class="lineno"> 1925</span> ->MakeProd(solver_->MakeMax(solver_->MakeSum(vehicle_used), 0),</div>
|
|
<div class="line"><a id="l01926" name="l01926"></a><span class="lineno"> 1926</span> same_vehicle_costs_[vehicle_index].value)</div>
|
|
<div class="line"><a id="l01927" name="l01927"></a><span class="lineno"> 1927</span> ->Var();</div>
|
|
<div class="line"><a id="l01928" name="l01928"></a><span class="lineno"> 1928</span>}</div>
|
|
<div class="line"><a id="l01929" name="l01929"></a><span class="lineno"> 1929</span> </div>
|
|
<div class="line"><a id="l01930" name="l01930"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a1156fa8214dba09e2a2a94862244aa1f"> 1930</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a1156fa8214dba09e2a2a94862244aa1f">RoutingModel::AddLocalSearchOperator</a>(<a class="code hl_class" href="classoperations__research_1_1_local_search_operator.html">LocalSearchOperator</a>* ls_operator) {</div>
|
|
<div class="line"><a id="l01931" name="l01931"></a><span class="lineno"> 1931</span> extra_operators_.push_back(ls_operator);</div>
|
|
<div class="line"><a id="l01932" name="l01932"></a><span class="lineno"> 1932</span>}</div>
|
|
<div class="line"><a id="l01933" name="l01933"></a><span class="lineno"> 1933</span> </div>
|
|
<div class="line"><a id="l01934" name="l01934"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a6aa2251c9948bb8c23fe58704b580b65"> 1934</a></span>int64_t <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a6aa2251c9948bb8c23fe58704b580b65">RoutingModel::GetDepot</a>()<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l01935" name="l01935"></a><span class="lineno"> 1935</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>() > 0 ? <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(0) : -1;</div>
|
|
<div class="line"><a id="l01936" name="l01936"></a><span class="lineno"> 1936</span>}</div>
|
|
<div class="line"><a id="l01937" name="l01937"></a><span class="lineno"> 1937</span> </div>
|
|
<div class="line"><a id="l01938" name="l01938"></a><span class="lineno"> 1938</span><span class="comment">// TODO(user): Remove the need for the homogeneous version once the</span></div>
|
|
<div class="line"><a id="l01939" name="l01939"></a><span class="lineno"> 1939</span><span class="comment">// vehicle var to cost class element constraint is fast enough.</span></div>
|
|
<div class="line"><a id="l01940" name="l01940"></a><span class="lineno"> 1940</span><span class="keywordtype">void</span> RoutingModel::AppendHomogeneousArcCosts(</div>
|
|
<div class="line"><a id="l01941" name="l01941"></a><span class="lineno"> 1941</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_search_parameters.html">RoutingSearchParameters</a>& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>, <span class="keywordtype">int</span> node_index,</div>
|
|
<div class="line"><a id="l01942" name="l01942"></a><span class="lineno"> 1942</span> std::vector<IntVar*>* cost_elements) {</div>
|
|
<div class="line"><a id="l01943" name="l01943"></a><span class="lineno"> 1943</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(cost_elements != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l01944" name="l01944"></a><span class="lineno"> 1944</span> <span class="keyword">const</span> <span class="keyword">auto</span> arc_cost_evaluator = [<span class="keyword">this</span>, node_index](int64_t next_index) {</div>
|
|
<div class="line"><a id="l01945" name="l01945"></a><span class="lineno"> 1945</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a51b526b532fc95cfed13d54ed2d6db95">GetHomogeneousCost</a>(node_index, next_index);</div>
|
|
<div class="line"><a id="l01946" name="l01946"></a><span class="lineno"> 1946</span> };</div>
|
|
<div class="line"><a id="l01947" name="l01947"></a><span class="lineno"> 1947</span> <span class="keywordflow">if</span> (UsesLightPropagation(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>)) {</div>
|
|
<div class="line"><a id="l01948" name="l01948"></a><span class="lineno"> 1948</span> <span class="comment">// Only supporting positive costs.</span></div>
|
|
<div class="line"><a id="l01949" name="l01949"></a><span class="lineno"> 1949</span> <span class="comment">// TODO(user): Detect why changing lower bound to kint64min stalls</span></div>
|
|
<div class="line"><a id="l01950" name="l01950"></a><span class="lineno"> 1950</span> <span class="comment">// the search in GLS in some cases (Solomon instances for instance).</span></div>
|
|
<div class="line"><a id="l01951" name="l01951"></a><span class="lineno"> 1951</span> IntVar* <span class="keyword">const</span> base_cost_var =</div>
|
|
<div class="line"><a id="l01952" name="l01952"></a><span class="lineno"> 1952</span> solver_->MakeIntVar(0, <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>());</div>
|
|
<div class="line"><a id="l01953" name="l01953"></a><span class="lineno"> 1953</span> solver_->AddConstraint(MakeLightElement(</div>
|
|
<div class="line"><a id="l01954" name="l01954"></a><span class="lineno"> 1954</span> solver_.get(), base_cost_var, nexts_[node_index], arc_cost_evaluator,</div>
|
|
<div class="line"><a id="l01955" name="l01955"></a><span class="lineno"> 1955</span> [<span class="keyword">this</span>]() { return enable_deep_serialization_; }));</div>
|
|
<div class="line"><a id="l01956" name="l01956"></a><span class="lineno"> 1956</span> IntVar* <span class="keyword">const</span> <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> =</div>
|
|
<div class="line"><a id="l01957" name="l01957"></a><span class="lineno"> 1957</span> solver_->MakeProd(base_cost_var, active_[node_index])->Var();</div>
|
|
<div class="line"><a id="l01958" name="l01958"></a><span class="lineno"> 1958</span> cost_elements->push_back(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
|
|
<div class="line"><a id="l01959" name="l01959"></a><span class="lineno"> 1959</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l01960" name="l01960"></a><span class="lineno"> 1960</span> IntExpr* <span class="keyword">const</span> expr =</div>
|
|
<div class="line"><a id="l01961" name="l01961"></a><span class="lineno"> 1961</span> solver_->MakeElement(arc_cost_evaluator, nexts_[node_index]);</div>
|
|
<div class="line"><a id="l01962" name="l01962"></a><span class="lineno"> 1962</span> IntVar* <span class="keyword">const</span> <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = solver_->MakeProd(expr, active_[node_index])->Var();</div>
|
|
<div class="line"><a id="l01963" name="l01963"></a><span class="lineno"> 1963</span> cost_elements->push_back(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
|
|
<div class="line"><a id="l01964" name="l01964"></a><span class="lineno"> 1964</span> }</div>
|
|
<div class="line"><a id="l01965" name="l01965"></a><span class="lineno"> 1965</span>}</div>
|
|
<div class="line"><a id="l01966" name="l01966"></a><span class="lineno"> 1966</span> </div>
|
|
<div class="line"><a id="l01967" name="l01967"></a><span class="lineno"> 1967</span><span class="keywordtype">void</span> RoutingModel::AppendArcCosts(<span class="keyword">const</span> RoutingSearchParameters& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>,</div>
|
|
<div class="line"><a id="l01968" name="l01968"></a><span class="lineno"> 1968</span> <span class="keywordtype">int</span> node_index,</div>
|
|
<div class="line"><a id="l01969" name="l01969"></a><span class="lineno"> 1969</span> std::vector<IntVar*>* cost_elements) {</div>
|
|
<div class="line"><a id="l01970" name="l01970"></a><span class="lineno"> 1970</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(cost_elements != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l01971" name="l01971"></a><span class="lineno"> 1971</span> <a class="code hl_define" href="base_2logging_8h.html#ab4f56aa24c4c9cddc47a6abd2d747f9a">DCHECK_GT</a>(vehicles_, 0);</div>
|
|
<div class="line"><a id="l01972" name="l01972"></a><span class="lineno"> 1972</span> <span class="keywordflow">if</span> (UsesLightPropagation(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>)) {</div>
|
|
<div class="line"><a id="l01973" name="l01973"></a><span class="lineno"> 1973</span> <span class="comment">// Only supporting positive costs.</span></div>
|
|
<div class="line"><a id="l01974" name="l01974"></a><span class="lineno"> 1974</span> <span class="comment">// TODO(user): Detect why changing lower bound to kint64min stalls</span></div>
|
|
<div class="line"><a id="l01975" name="l01975"></a><span class="lineno"> 1975</span> <span class="comment">// the search in GLS in some cases (Solomon instances for instance).</span></div>
|
|
<div class="line"><a id="l01976" name="l01976"></a><span class="lineno"> 1976</span> IntVar* <span class="keyword">const</span> base_cost_var =</div>
|
|
<div class="line"><a id="l01977" name="l01977"></a><span class="lineno"> 1977</span> solver_->MakeIntVar(0, <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>());</div>
|
|
<div class="line"><a id="l01978" name="l01978"></a><span class="lineno"> 1978</span> solver_->AddConstraint(MakeLightElement2(</div>
|
|
<div class="line"><a id="l01979" name="l01979"></a><span class="lineno"> 1979</span> solver_.get(), base_cost_var, nexts_[node_index],</div>
|
|
<div class="line"><a id="l01980" name="l01980"></a><span class="lineno"> 1980</span> vehicle_vars_[node_index],</div>
|
|
<div class="line"><a id="l01981" name="l01981"></a><span class="lineno"> 1981</span> [<span class="keyword">this</span>, node_index](int64_t to, int64_t vehicle) {</div>
|
|
<div class="line"><a id="l01982" name="l01982"></a><span class="lineno"> 1982</span> return GetArcCostForVehicle(node_index, to, vehicle);</div>
|
|
<div class="line"><a id="l01983" name="l01983"></a><span class="lineno"> 1983</span> },</div>
|
|
<div class="line"><a id="l01984" name="l01984"></a><span class="lineno"> 1984</span> [<span class="keyword">this</span>]() { return enable_deep_serialization_; }));</div>
|
|
<div class="line"><a id="l01985" name="l01985"></a><span class="lineno"> 1985</span> IntVar* <span class="keyword">const</span> <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> =</div>
|
|
<div class="line"><a id="l01986" name="l01986"></a><span class="lineno"> 1986</span> solver_->MakeProd(base_cost_var, active_[node_index])->Var();</div>
|
|
<div class="line"><a id="l01987" name="l01987"></a><span class="lineno"> 1987</span> cost_elements->push_back(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
|
|
<div class="line"><a id="l01988" name="l01988"></a><span class="lineno"> 1988</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l01989" name="l01989"></a><span class="lineno"> 1989</span> IntVar* <span class="keyword">const</span> vehicle_class_var =</div>
|
|
<div class="line"><a id="l01990" name="l01990"></a><span class="lineno"> 1990</span> solver_</div>
|
|
<div class="line"><a id="l01991" name="l01991"></a><span class="lineno"> 1991</span> ->MakeElement(</div>
|
|
<div class="line"><a id="l01992" name="l01992"></a><span class="lineno"> 1992</span> [<span class="keyword">this</span>](int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>) {</div>
|
|
<div class="line"><a id="l01993" name="l01993"></a><span class="lineno"> 1993</span> <span class="keywordflow">return</span> SafeGetCostClassInt64OfVehicle(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l01994" name="l01994"></a><span class="lineno"> 1994</span> },</div>
|
|
<div class="line"><a id="l01995" name="l01995"></a><span class="lineno"> 1995</span> vehicle_vars_[node_index])</div>
|
|
<div class="line"><a id="l01996" name="l01996"></a><span class="lineno"> 1996</span> ->Var();</div>
|
|
<div class="line"><a id="l01997" name="l01997"></a><span class="lineno"> 1997</span> IntExpr* <span class="keyword">const</span> expr = solver_->MakeElement(</div>
|
|
<div class="line"><a id="l01998" name="l01998"></a><span class="lineno"> 1998</span> [<span class="keyword">this</span>, node_index](int64_t <a class="code hl_variable" href="constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599">next</a>, int64_t <a class="code hl_variable" href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a>) {</div>
|
|
<div class="line"><a id="l01999" name="l01999"></a><span class="lineno"> 1999</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#abfa127093eb53ae531ccb1f4ada6cc8a">GetArcCostForClass</a>(node_index, <a class="code hl_variable" href="constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599">next</a>, <a class="code hl_variable" href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a>);</div>
|
|
<div class="line"><a id="l02000" name="l02000"></a><span class="lineno"> 2000</span> },</div>
|
|
<div class="line"><a id="l02001" name="l02001"></a><span class="lineno"> 2001</span> nexts_[node_index], vehicle_class_var);</div>
|
|
<div class="line"><a id="l02002" name="l02002"></a><span class="lineno"> 2002</span> IntVar* <span class="keyword">const</span> <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = solver_->MakeProd(expr, active_[node_index])->Var();</div>
|
|
<div class="line"><a id="l02003" name="l02003"></a><span class="lineno"> 2003</span> cost_elements->push_back(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
|
|
<div class="line"><a id="l02004" name="l02004"></a><span class="lineno"> 2004</span> }</div>
|
|
<div class="line"><a id="l02005" name="l02005"></a><span class="lineno"> 2005</span>}</div>
|
|
<div class="line"><a id="l02006" name="l02006"></a><span class="lineno"> 2006</span> </div>
|
|
<div class="line"><a id="l02007" name="l02007"></a><span class="lineno"> 2007</span><span class="keywordtype">int</span> RoutingModel::GetVehicleStartClass(int64_t start_index)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l02008" name="l02008"></a><span class="lineno"> 2008</span> <span class="keyword">const</span> <span class="keywordtype">int</span> vehicle = index_to_vehicle_[start_index];</div>
|
|
<div class="line"><a id="l02009" name="l02009"></a><span class="lineno"> 2009</span> <span class="keywordflow">if</span> (vehicle != <a class="code hl_variable" href="namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955">kUnassigned</a>) {</div>
|
|
<div class="line"><a id="l02010" name="l02010"></a><span class="lineno"> 2010</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a114000eadb54d1a6275add6c1e6fcf33">GetVehicleClassIndexOfVehicle</a>(vehicle).value();</div>
|
|
<div class="line"><a id="l02011" name="l02011"></a><span class="lineno"> 2011</span> }</div>
|
|
<div class="line"><a id="l02012" name="l02012"></a><span class="lineno"> 2012</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955">kUnassigned</a>;</div>
|
|
<div class="line"><a id="l02013" name="l02013"></a><span class="lineno"> 2013</span>}</div>
|
|
<div class="line"><a id="l02014" name="l02014"></a><span class="lineno"> 2014</span> </div>
|
|
<div class="line"><a id="l02015" name="l02015"></a><span class="lineno"> 2015</span>std::string RoutingModel::FindErrorInSearchParametersForModel(</div>
|
|
<div class="line"><a id="l02016" name="l02016"></a><span class="lineno"> 2016</span> <span class="keyword">const</span> RoutingSearchParameters& search_parameters)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l02017" name="l02017"></a><span class="lineno"> 2017</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_first_solution_strategy.html#a31bc681b1d8ba03d79e0f08fd310e943">FirstSolutionStrategy::Value</a> first_solution_strategy =</div>
|
|
<div class="line"><a id="l02018" name="l02018"></a><span class="lineno"> 2018</span> search_parameters.first_solution_strategy();</div>
|
|
<div class="line"><a id="l02019" name="l02019"></a><span class="lineno"> 2019</span> <span class="keywordflow">if</span> (GetFirstSolutionDecisionBuilder(search_parameters) == <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l02020" name="l02020"></a><span class="lineno"> 2020</span> <span class="keywordflow">return</span> absl::StrCat(</div>
|
|
<div class="line"><a id="l02021" name="l02021"></a><span class="lineno"> 2021</span> <span class="stringliteral">"Undefined first solution strategy: "</span>,</div>
|
|
<div class="line"><a id="l02022" name="l02022"></a><span class="lineno"> 2022</span> <a class="code hl_function" href="classoperations__research_1_1_first_solution_strategy.html#adc4a0aa5c9965a51b9e07be9c1e328a1">FirstSolutionStrategy::Value_Name</a>(first_solution_strategy),</div>
|
|
<div class="line"><a id="l02023" name="l02023"></a><span class="lineno"> 2023</span> <span class="stringliteral">" (int value: "</span>, first_solution_strategy, <span class="stringliteral">")"</span>);</div>
|
|
<div class="line"><a id="l02024" name="l02024"></a><span class="lineno"> 2024</span> }</div>
|
|
<div class="line"><a id="l02025" name="l02025"></a><span class="lineno"> 2025</span> <span class="keywordflow">if</span> (search_parameters.first_solution_strategy() ==</div>
|
|
<div class="line"><a id="l02026" name="l02026"></a><span class="lineno"> 2026</span> <a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#aca22eabfd47888ab251053351b3b20d5">FirstSolutionStrategy::SWEEP</a> &&</div>
|
|
<div class="line"><a id="l02027" name="l02027"></a><span class="lineno"> 2027</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a641eb9492d9e1682b05fd882635fcfd7">sweep_arranger</a>() == <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l02028" name="l02028"></a><span class="lineno"> 2028</span> <span class="keywordflow">return</span> <span class="stringliteral">"Undefined sweep arranger for ROUTING_SWEEP strategy."</span>;</div>
|
|
<div class="line"><a id="l02029" name="l02029"></a><span class="lineno"> 2029</span> }</div>
|
|
<div class="line"><a id="l02030" name="l02030"></a><span class="lineno"> 2030</span> <span class="keywordflow">return</span> <span class="stringliteral">""</span>;</div>
|
|
<div class="line"><a id="l02031" name="l02031"></a><span class="lineno"> 2031</span>}</div>
|
|
<div class="line"><a id="l02032" name="l02032"></a><span class="lineno"> 2032</span> </div>
|
|
<div class="line"><a id="l02033" name="l02033"></a><span class="lineno"> 2033</span><span class="keywordtype">void</span> RoutingModel::QuietCloseModel() {</div>
|
|
<div class="line"><a id="l02034" name="l02034"></a><span class="lineno"> 2034</span> QuietCloseModelWithParameters(<a class="code hl_function" href="namespaceoperations__research.html#ab59d4ce2b572e1ae576d2aa181433187">DefaultRoutingSearchParameters</a>());</div>
|
|
<div class="line"><a id="l02035" name="l02035"></a><span class="lineno"> 2035</span>}</div>
|
|
<div class="line"><a id="l02036" name="l02036"></a><span class="lineno"> 2036</span> </div>
|
|
<div class="line"><a id="l02037" name="l02037"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#add71470f4175a0859e6e3d69c2a53988"> 2037</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#add71470f4175a0859e6e3d69c2a53988">RoutingModel::CloseModel</a>() {</div>
|
|
<div class="line"><a id="l02038" name="l02038"></a><span class="lineno"> 2038</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa79f8d482de4dd0ef86a1b54999686af">CloseModelWithParameters</a>(<a class="code hl_function" href="namespaceoperations__research.html#ab59d4ce2b572e1ae576d2aa181433187">DefaultRoutingSearchParameters</a>());</div>
|
|
<div class="line"><a id="l02039" name="l02039"></a><span class="lineno"> 2039</span>}</div>
|
|
<div class="line"><a id="l02040" name="l02040"></a><span class="lineno"> 2040</span> </div>
|
|
<div class="line"><a id="l02041" name="l02041"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model_inspector.html"> 2041</a></span><span class="keyword">class </span><a class="code hl_class" href="classoperations__research_1_1_routing_model_inspector.html">RoutingModelInspector</a> : <span class="keyword">public</span> <a class="code hl_class" href="classoperations__research_1_1_model_visitor.html">ModelVisitor</a> {</div>
|
|
<div class="line"><a id="l02042" name="l02042"></a><span class="lineno"> 2042</span> <span class="keyword">public</span>:</div>
|
|
<div class="line"><a id="l02043" name="l02043"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model_inspector.html#a0523ce908e2fa6b2958084a5b05a88c1"> 2043</a></span> <span class="keyword">explicit</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model_inspector.html#a0523ce908e2fa6b2958084a5b05a88c1">RoutingModelInspector</a>(<a class="code hl_class" href="classoperations__research_1_1_routing_model.html">RoutingModel</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) : model_(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>) {</div>
|
|
<div class="line"><a id="l02044" name="l02044"></a><span class="lineno"> 2044</span> same_vehicle_components_.SetNumberOfNodes(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->Size());</div>
|
|
<div class="line"><a id="l02045" name="l02045"></a><span class="lineno"> 2045</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string& <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a> : <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->GetAllDimensionNames()) {</div>
|
|
<div class="line"><a id="l02046" name="l02046"></a><span class="lineno"> 2046</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* <span class="keyword">const</span> dimension = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->GetMutableDimension(<a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>);</div>
|
|
<div class="line"><a id="l02047" name="l02047"></a><span class="lineno"> 2047</span> <span class="keyword">const</span> std::vector<IntVar*>& cumuls = dimension-><a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a2658bab0f635e3b399b100ecd6bc12cb">cumuls</a>();</div>
|
|
<div class="line"><a id="l02048" name="l02048"></a><span class="lineno"> 2048</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < cumuls.size(); ++i) {</div>
|
|
<div class="line"><a id="l02049" name="l02049"></a><span class="lineno"> 2049</span> cumul_to_dim_indices_[cumuls[i]] = {dimension, i};</div>
|
|
<div class="line"><a id="l02050" name="l02050"></a><span class="lineno"> 2050</span> }</div>
|
|
<div class="line"><a id="l02051" name="l02051"></a><span class="lineno"> 2051</span> }</div>
|
|
<div class="line"><a id="l02052" name="l02052"></a><span class="lineno"> 2052</span> <span class="keyword">const</span> std::vector<IntVar*>& vehicle_vars = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->VehicleVars();</div>
|
|
<div class="line"><a id="l02053" name="l02053"></a><span class="lineno"> 2053</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < vehicle_vars.size(); ++i) {</div>
|
|
<div class="line"><a id="l02054" name="l02054"></a><span class="lineno"> 2054</span> vehicle_var_to_indices_[vehicle_vars[i]] = i;</div>
|
|
<div class="line"><a id="l02055" name="l02055"></a><span class="lineno"> 2055</span> }</div>
|
|
<div class="line"><a id="l02056" name="l02056"></a><span class="lineno"> 2056</span> RegisterInspectors();</div>
|
|
<div class="line"><a id="l02057" name="l02057"></a><span class="lineno"> 2057</span> }</div>
|
|
<div class="line"><a id="l02058" name="l02058"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model_inspector.html#a98cecd8eead2c232b65629ea0abb43e5"> 2058</a></span> <a class="code hl_function" href="classoperations__research_1_1_routing_model_inspector.html#a98cecd8eead2c232b65629ea0abb43e5">~RoutingModelInspector</a>()<span class="keyword"> override </span>{}</div>
|
|
<div class="line"><a id="l02059" name="l02059"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model_inspector.html#a93b849189eca7118a5db04c2fe8aa901"> 2059</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model_inspector.html#a93b849189eca7118a5db04c2fe8aa901">EndVisitModel</a>(<span class="keyword">const</span> std::string& solver_name)<span class="keyword"> override </span>{</div>
|
|
<div class="line"><a id="l02060" name="l02060"></a><span class="lineno"> 2060</span> <span class="keyword">const</span> std::vector<int> node_to_same_vehicle_component_id =</div>
|
|
<div class="line"><a id="l02061" name="l02061"></a><span class="lineno"> 2061</span> same_vehicle_components_.GetComponentIds();</div>
|
|
<div class="line"><a id="l02062" name="l02062"></a><span class="lineno"> 2062</span> model_->InitSameVehicleGroups(</div>
|
|
<div class="line"><a id="l02063" name="l02063"></a><span class="lineno"> 2063</span> same_vehicle_components_.GetNumberOfComponents());</div>
|
|
<div class="line"><a id="l02064" name="l02064"></a><span class="lineno"> 2064</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> node = 0; node < model_->Size(); ++node) {</div>
|
|
<div class="line"><a id="l02065" name="l02065"></a><span class="lineno"> 2065</span> model_->SetSameVehicleGroup(node,</div>
|
|
<div class="line"><a id="l02066" name="l02066"></a><span class="lineno"> 2066</span> node_to_same_vehicle_component_id[node]);</div>
|
|
<div class="line"><a id="l02067" name="l02067"></a><span class="lineno"> 2067</span> }</div>
|
|
<div class="line"><a id="l02068" name="l02068"></a><span class="lineno"> 2068</span> <span class="comment">// TODO(user): Perform transitive closure of dimension precedence graphs.</span></div>
|
|
<div class="line"><a id="l02069" name="l02069"></a><span class="lineno"> 2069</span> <span class="comment">// TODO(user): Have a single annotated precedence graph.</span></div>
|
|
<div class="line"><a id="l02070" name="l02070"></a><span class="lineno"> 2070</span> }</div>
|
|
<div class="line"><a id="l02071" name="l02071"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model_inspector.html#a8ed69e6d44dd4141c434a1784120382f"> 2071</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model_inspector.html#a8ed69e6d44dd4141c434a1784120382f">EndVisitConstraint</a>(<span class="keyword">const</span> std::string& type_name,</div>
|
|
<div class="line"><a id="l02072" name="l02072"></a><span class="lineno"> 2072</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_constraint.html">Constraint</a>* <span class="keyword">const</span> constraint)<span class="keyword"> override </span>{</div>
|
|
<div class="line"><a id="l02073" name="l02073"></a><span class="lineno"> 2073</span> <a class="code hl_function" href="namespacegtl.html#a795ebdb62731938c8c31b221f0f074b4">gtl::FindWithDefault</a>(constraint_inspectors_, type_name, []() {})();</div>
|
|
<div class="line"><a id="l02074" name="l02074"></a><span class="lineno"> 2074</span> }</div>
|
|
<div class="line"><a id="l02075" name="l02075"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model_inspector.html#adee845e0e33b4eb085f916eb47246eaa"> 2075</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model_inspector.html#adee845e0e33b4eb085f916eb47246eaa">VisitIntegerExpressionArgument</a>(<span class="keyword">const</span> std::string& type_name,</div>
|
|
<div class="line"><a id="l02076" name="l02076"></a><span class="lineno"> 2076</span> <a class="code hl_class" href="classoperations__research_1_1_int_expr.html">IntExpr</a>* <span class="keyword">const</span> expr)<span class="keyword"> override </span>{</div>
|
|
<div class="line"><a id="l02077" name="l02077"></a><span class="lineno"> 2077</span> <a class="code hl_function" href="namespacegtl.html#a795ebdb62731938c8c31b221f0f074b4">gtl::FindWithDefault</a>(expr_inspectors_, type_name,</div>
|
|
<div class="line"><a id="l02078" name="l02078"></a><span class="lineno"> 2078</span> [](<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_int_expr.html">IntExpr</a>* expr) {})(expr);</div>
|
|
<div class="line"><a id="l02079" name="l02079"></a><span class="lineno"> 2079</span> }</div>
|
|
<div class="line"><a id="l02080" name="l02080"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model_inspector.html#a0c0d4fedf92e938f09d19b1b02015bea"> 2080</a></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model_inspector.html#a0c0d4fedf92e938f09d19b1b02015bea">VisitIntegerArrayArgument</a>(<span class="keyword">const</span> std::string& arg_name,</div>
|
|
<div class="line"><a id="l02081" name="l02081"></a><span class="lineno"> 2081</span> <span class="keyword">const</span> std::vector<int64_t>& values)<span class="keyword"> override </span>{</div>
|
|
<div class="line"><a id="l02082" name="l02082"></a><span class="lineno"> 2082</span> <a class="code hl_function" href="namespacegtl.html#a795ebdb62731938c8c31b221f0f074b4">gtl::FindWithDefault</a>(array_inspectors_, arg_name,</div>
|
|
<div class="line"><a id="l02083" name="l02083"></a><span class="lineno"> 2083</span> [](<span class="keyword">const</span> std::vector<int64_t>& int_array) {})(values);</div>
|
|
<div class="line"><a id="l02084" name="l02084"></a><span class="lineno"> 2084</span> }</div>
|
|
<div class="line"><a id="l02085" name="l02085"></a><span class="lineno"> 2085</span> </div>
|
|
<div class="line"><a id="l02086" name="l02086"></a><span class="lineno"> 2086</span> <span class="keyword">private</span>:</div>
|
|
<div class="line"><a id="l02087" name="l02087"></a><span class="lineno"> 2087</span> <span class="keyword">using</span> ExprInspector = std::function<void(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_int_expr.html">IntExpr</a>*)>;</div>
|
|
<div class="line"><a id="l02088" name="l02088"></a><span class="lineno"> 2088</span> <span class="keyword">using</span> ArrayInspector = std::function<void(<span class="keyword">const</span> std::vector<int64_t>&)>;</div>
|
|
<div class="line"><a id="l02089" name="l02089"></a><span class="lineno"> 2089</span> <span class="keyword">using</span> ConstraintInspector = std::function<void()>;</div>
|
|
<div class="line"><a id="l02090" name="l02090"></a><span class="lineno"> 2090</span> </div>
|
|
<div class="line"><a id="l02091" name="l02091"></a><span class="lineno"> 2091</span> <span class="keywordtype">void</span> RegisterInspectors() {</div>
|
|
<div class="line"><a id="l02092" name="l02092"></a><span class="lineno"> 2092</span> expr_inspectors_[kExpressionArgument] = [<span class="keyword">this</span>](<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_int_expr.html">IntExpr</a>* expr) {</div>
|
|
<div class="line"><a id="l02093" name="l02093"></a><span class="lineno"> 2093</span> <a class="code hl_variable" href="element_8cc.html#a2dac2393bef148b7c15723ef0770d558">expr_</a> = expr;</div>
|
|
<div class="line"><a id="l02094" name="l02094"></a><span class="lineno"> 2094</span> };</div>
|
|
<div class="line"><a id="l02095" name="l02095"></a><span class="lineno"> 2095</span> expr_inspectors_[kLeftArgument] = [<span class="keyword">this</span>](<span class="keyword">const</span> IntExpr* expr) {</div>
|
|
<div class="line"><a id="l02096" name="l02096"></a><span class="lineno"> 2096</span> left_ = expr;</div>
|
|
<div class="line"><a id="l02097" name="l02097"></a><span class="lineno"> 2097</span> };</div>
|
|
<div class="line"><a id="l02098" name="l02098"></a><span class="lineno"> 2098</span> expr_inspectors_[kRightArgument] = [<span class="keyword">this</span>](<span class="keyword">const</span> IntExpr* expr) {</div>
|
|
<div class="line"><a id="l02099" name="l02099"></a><span class="lineno"> 2099</span> right_ = expr;</div>
|
|
<div class="line"><a id="l02100" name="l02100"></a><span class="lineno"> 2100</span> };</div>
|
|
<div class="line"><a id="l02101" name="l02101"></a><span class="lineno"> 2101</span> array_inspectors_[kStartsArgument] =</div>
|
|
<div class="line"><a id="l02102" name="l02102"></a><span class="lineno"> 2102</span> [<span class="keyword">this</span>](<span class="keyword">const</span> std::vector<int64_t>& int_array) {</div>
|
|
<div class="line"><a id="l02103" name="l02103"></a><span class="lineno"> 2103</span> starts_argument_ = int_array;</div>
|
|
<div class="line"><a id="l02104" name="l02104"></a><span class="lineno"> 2104</span> };</div>
|
|
<div class="line"><a id="l02105" name="l02105"></a><span class="lineno"> 2105</span> array_inspectors_[kEndsArgument] =</div>
|
|
<div class="line"><a id="l02106" name="l02106"></a><span class="lineno"> 2106</span> [<span class="keyword">this</span>](<span class="keyword">const</span> std::vector<int64_t>& int_array) {</div>
|
|
<div class="line"><a id="l02107" name="l02107"></a><span class="lineno"> 2107</span> ends_argument_ = int_array;</div>
|
|
<div class="line"><a id="l02108" name="l02108"></a><span class="lineno"> 2108</span> };</div>
|
|
<div class="line"><a id="l02109" name="l02109"></a><span class="lineno"> 2109</span> constraint_inspectors_[kNotMember] = [<span class="keyword">this</span>]() {</div>
|
|
<div class="line"><a id="l02110" name="l02110"></a><span class="lineno"> 2110</span> std::pair<RoutingDimension*, int> dim_index;</div>
|
|
<div class="line"><a id="l02111" name="l02111"></a><span class="lineno"> 2111</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="namespacegtl.html#a6a4238d2e35cf819a8e83d60d331ea64">gtl::FindCopy</a>(cumul_to_dim_indices_, <a class="code hl_variable" href="element_8cc.html#a2dac2393bef148b7c15723ef0770d558">expr_</a>, &dim_index)) {</div>
|
|
<div class="line"><a id="l02112" name="l02112"></a><span class="lineno"> 2112</span> <a class="code hl_friend" href="classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* <span class="keyword">const</span> dimension = dim_index.first;</div>
|
|
<div class="line"><a id="l02113" name="l02113"></a><span class="lineno"> 2113</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = dim_index.second;</div>
|
|
<div class="line"><a id="l02114" name="l02114"></a><span class="lineno"> 2114</span> dimension->forbidden_intervals_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].InsertIntervals(starts_argument_,</div>
|
|
<div class="line"><a id="l02115" name="l02115"></a><span class="lineno"> 2115</span> ends_argument_);</div>
|
|
<div class="line"><a id="l02116" name="l02116"></a><span class="lineno"> 2116</span> <a class="code hl_define" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) << dimension->name() << <span class="stringliteral">" "</span> << <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> << <span class="stringliteral">": "</span></div>
|
|
<div class="line"><a id="l02117" name="l02117"></a><span class="lineno"> 2117</span> << dimension->forbidden_intervals_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].DebugString();</div>
|
|
<div class="line"><a id="l02118" name="l02118"></a><span class="lineno"> 2118</span> }</div>
|
|
<div class="line"><a id="l02119" name="l02119"></a><span class="lineno"> 2119</span> <a class="code hl_variable" href="element_8cc.html#a2dac2393bef148b7c15723ef0770d558">expr_</a> = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l02120" name="l02120"></a><span class="lineno"> 2120</span> starts_argument_.clear();</div>
|
|
<div class="line"><a id="l02121" name="l02121"></a><span class="lineno"> 2121</span> ends_argument_.clear();</div>
|
|
<div class="line"><a id="l02122" name="l02122"></a><span class="lineno"> 2122</span> };</div>
|
|
<div class="line"><a id="l02123" name="l02123"></a><span class="lineno"> 2123</span> constraint_inspectors_[kEquality] = [<span class="keyword">this</span>]() {</div>
|
|
<div class="line"><a id="l02124" name="l02124"></a><span class="lineno"> 2124</span> <span class="keywordtype">int</span> left_index = 0;</div>
|
|
<div class="line"><a id="l02125" name="l02125"></a><span class="lineno"> 2125</span> <span class="keywordtype">int</span> right_index = 0;</div>
|
|
<div class="line"><a id="l02126" name="l02126"></a><span class="lineno"> 2126</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="namespacegtl.html#a6a4238d2e35cf819a8e83d60d331ea64">gtl::FindCopy</a>(vehicle_var_to_indices_, left_, &left_index) &&</div>
|
|
<div class="line"><a id="l02127" name="l02127"></a><span class="lineno"> 2127</span> <a class="code hl_function" href="namespacegtl.html#a6a4238d2e35cf819a8e83d60d331ea64">gtl::FindCopy</a>(vehicle_var_to_indices_, right_, &right_index)) {</div>
|
|
<div class="line"><a id="l02128" name="l02128"></a><span class="lineno"> 2128</span> <a class="code hl_define" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) << <span class="stringliteral">"Vehicle variables for "</span> << left_index << <span class="stringliteral">" and "</span></div>
|
|
<div class="line"><a id="l02129" name="l02129"></a><span class="lineno"> 2129</span> << right_index << <span class="stringliteral">" are equal."</span>;</div>
|
|
<div class="line"><a id="l02130" name="l02130"></a><span class="lineno"> 2130</span> same_vehicle_components_.AddEdge(left_index, right_index);</div>
|
|
<div class="line"><a id="l02131" name="l02131"></a><span class="lineno"> 2131</span> }</div>
|
|
<div class="line"><a id="l02132" name="l02132"></a><span class="lineno"> 2132</span> left_ = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l02133" name="l02133"></a><span class="lineno"> 2133</span> right_ = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l02134" name="l02134"></a><span class="lineno"> 2134</span> };</div>
|
|
<div class="line"><a id="l02135" name="l02135"></a><span class="lineno"> 2135</span> constraint_inspectors_[kLessOrEqual] = [<span class="keyword">this</span>]() {</div>
|
|
<div class="line"><a id="l02136" name="l02136"></a><span class="lineno"> 2136</span> std::pair<RoutingDimension*, int> left_index;</div>
|
|
<div class="line"><a id="l02137" name="l02137"></a><span class="lineno"> 2137</span> std::pair<RoutingDimension*, int> right_index;</div>
|
|
<div class="line"><a id="l02138" name="l02138"></a><span class="lineno"> 2138</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="namespacegtl.html#a6a4238d2e35cf819a8e83d60d331ea64">gtl::FindCopy</a>(cumul_to_dim_indices_, left_, &left_index) &&</div>
|
|
<div class="line"><a id="l02139" name="l02139"></a><span class="lineno"> 2139</span> <a class="code hl_function" href="namespacegtl.html#a6a4238d2e35cf819a8e83d60d331ea64">gtl::FindCopy</a>(cumul_to_dim_indices_, right_, &right_index)) {</div>
|
|
<div class="line"><a id="l02140" name="l02140"></a><span class="lineno"> 2140</span> <a class="code hl_friend" href="classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* <span class="keyword">const</span> dimension = left_index.first;</div>
|
|
<div class="line"><a id="l02141" name="l02141"></a><span class="lineno"> 2141</span> <span class="keywordflow">if</span> (dimension == right_index.first) {</div>
|
|
<div class="line"><a id="l02142" name="l02142"></a><span class="lineno"> 2142</span> <a class="code hl_define" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(2) << <span class="stringliteral">"For dimension "</span> << dimension->name() << <span class="stringliteral">", cumul for "</span></div>
|
|
<div class="line"><a id="l02143" name="l02143"></a><span class="lineno"> 2143</span> << left_index.second << <span class="stringliteral">" is less than "</span> << right_index.second</div>
|
|
<div class="line"><a id="l02144" name="l02144"></a><span class="lineno"> 2144</span> << <span class="stringliteral">"."</span>;</div>
|
|
<div class="line"><a id="l02145" name="l02145"></a><span class="lineno"> 2145</span> dimension->path_precedence_graph_.AddArc(left_index.second,</div>
|
|
<div class="line"><a id="l02146" name="l02146"></a><span class="lineno"> 2146</span> right_index.second);</div>
|
|
<div class="line"><a id="l02147" name="l02147"></a><span class="lineno"> 2147</span> }</div>
|
|
<div class="line"><a id="l02148" name="l02148"></a><span class="lineno"> 2148</span> }</div>
|
|
<div class="line"><a id="l02149" name="l02149"></a><span class="lineno"> 2149</span> left_ = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l02150" name="l02150"></a><span class="lineno"> 2150</span> right_ = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l02151" name="l02151"></a><span class="lineno"> 2151</span> };</div>
|
|
<div class="line"><a id="l02152" name="l02152"></a><span class="lineno"> 2152</span> }</div>
|
|
<div class="line"><a id="l02153" name="l02153"></a><span class="lineno"> 2153</span> </div>
|
|
<div class="line"><a id="l02154" name="l02154"></a><span class="lineno"> 2154</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#af12674b693b7b7cfe271e5b066e10bff">RoutingModel</a>* <span class="keyword">const</span> model_;</div>
|
|
<div class="line"><a id="l02155" name="l02155"></a><span class="lineno"> 2155</span> <a class="code hl_class" href="class_dense_connected_components_finder.html">DenseConnectedComponentsFinder</a> same_vehicle_components_;</div>
|
|
<div class="line"><a id="l02156" name="l02156"></a><span class="lineno"> 2156</span> absl::flat_hash_map<const IntExpr*, std::pair<RoutingDimension*, int>></div>
|
|
<div class="line"><a id="l02157" name="l02157"></a><span class="lineno"> 2157</span> cumul_to_dim_indices_;</div>
|
|
<div class="line"><a id="l02158" name="l02158"></a><span class="lineno"> 2158</span> absl::flat_hash_map<const IntExpr*, int> vehicle_var_to_indices_;</div>
|
|
<div class="line"><a id="l02159" name="l02159"></a><span class="lineno"> 2159</span> absl::flat_hash_map<std::string, ExprInspector> expr_inspectors_;</div>
|
|
<div class="line"><a id="l02160" name="l02160"></a><span class="lineno"> 2160</span> absl::flat_hash_map<std::string, ArrayInspector> array_inspectors_;</div>
|
|
<div class="line"><a id="l02161" name="l02161"></a><span class="lineno"> 2161</span> absl::flat_hash_map<std::string, ConstraintInspector> constraint_inspectors_;</div>
|
|
<div class="line"><a id="l02162" name="l02162"></a><span class="lineno"> 2162</span> <span class="keyword">const</span> IntExpr* <a class="code hl_variable" href="element_8cc.html#a2dac2393bef148b7c15723ef0770d558">expr_</a> = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l02163" name="l02163"></a><span class="lineno"> 2163</span> <span class="keyword">const</span> IntExpr* left_ = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l02164" name="l02164"></a><span class="lineno"> 2164</span> <span class="keyword">const</span> IntExpr* right_ = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l02165" name="l02165"></a><span class="lineno"> 2165</span> std::vector<int64_t> starts_argument_;</div>
|
|
<div class="line"><a id="l02166" name="l02166"></a><span class="lineno"> 2166</span> std::vector<int64_t> ends_argument_;</div>
|
|
<div class="line"><a id="l02167" name="l02167"></a><span class="lineno"> 2167</span>};</div>
|
|
<div class="line"><a id="l02168" name="l02168"></a><span class="lineno"> 2168</span> </div>
|
|
<div class="line"><a id="l02169" name="l02169"></a><span class="lineno"> 2169</span><span class="keywordtype">void</span> RoutingModel::DetectImplicitPickupAndDeliveries() {</div>
|
|
<div class="line"><a id="l02170" name="l02170"></a><span class="lineno"> 2170</span> std::vector<int> non_pickup_delivery_nodes;</div>
|
|
<div class="line"><a id="l02171" name="l02171"></a><span class="lineno"> 2171</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> node = 0; node < <a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#a24926108b770033792d015cb86aeffb3">Size</a>(); ++node) {</div>
|
|
<div class="line"><a id="l02172" name="l02172"></a><span class="lineno"> 2172</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a3582f01eabc65ba4b801215ca6420a7c">IsStart</a>(node) && <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ac6d5e197d4c8db922db0b8e2a8b7074e">GetPickupIndexPairs</a>(node).empty() &&</div>
|
|
<div class="line"><a id="l02173" name="l02173"></a><span class="lineno"> 2173</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a434b15d056c7e1751925eba475e84c32">GetDeliveryIndexPairs</a>(node).empty()) {</div>
|
|
<div class="line"><a id="l02174" name="l02174"></a><span class="lineno"> 2174</span> non_pickup_delivery_nodes.push_back(node);</div>
|
|
<div class="line"><a id="l02175" name="l02175"></a><span class="lineno"> 2175</span> }</div>
|
|
<div class="line"><a id="l02176" name="l02176"></a><span class="lineno"> 2176</span> }</div>
|
|
<div class="line"><a id="l02177" name="l02177"></a><span class="lineno"> 2177</span> <span class="comment">// Needs to be sorted for stability.</span></div>
|
|
<div class="line"><a id="l02178" name="l02178"></a><span class="lineno"> 2178</span> std::set<std::pair<int64_t, int64_t>> implicit_pickup_deliveries;</div>
|
|
<div class="line"><a id="l02179" name="l02179"></a><span class="lineno"> 2179</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_friend" href="classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* <span class="keyword">const</span> dimension : dimensions_) {</div>
|
|
<div class="line"><a id="l02180" name="l02180"></a><span class="lineno"> 2180</span> <span class="keywordflow">if</span> (dimension->class_evaluators_.size() != 1) {</div>
|
|
<div class="line"><a id="l02181" name="l02181"></a><span class="lineno"> 2181</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l02182" name="l02182"></a><span class="lineno"> 2182</span> }</div>
|
|
<div class="line"><a id="l02183" name="l02183"></a><span class="lineno"> 2183</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a204041e5264282d54dfd198011e776d3">TransitCallback1</a>& transit =</div>
|
|
<div class="line"><a id="l02184" name="l02184"></a><span class="lineno"> 2184</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a7bcff3e4ab28854695610b340d5d11c3">UnaryTransitCallbackOrNull</a>(dimension->class_evaluators_[0]);</div>
|
|
<div class="line"><a id="l02185" name="l02185"></a><span class="lineno"> 2185</span> <span class="keywordflow">if</span> (transit == <span class="keyword">nullptr</span>) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l02186" name="l02186"></a><span class="lineno"> 2186</span> absl::flat_hash_map<int64_t, std::vector<int64_t>> nodes_by_positive_demand;</div>
|
|
<div class="line"><a id="l02187" name="l02187"></a><span class="lineno"> 2187</span> absl::flat_hash_map<int64_t, std::vector<int64_t>> nodes_by_negative_demand;</div>
|
|
<div class="line"><a id="l02188" name="l02188"></a><span class="lineno"> 2188</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> node : non_pickup_delivery_nodes) {</div>
|
|
<div class="line"><a id="l02189" name="l02189"></a><span class="lineno"> 2189</span> <span class="keyword">const</span> int64_t <a class="code hl_variable" href="resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20">demand</a> = transit(node);</div>
|
|
<div class="line"><a id="l02190" name="l02190"></a><span class="lineno"> 2190</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20">demand</a> > 0) {</div>
|
|
<div class="line"><a id="l02191" name="l02191"></a><span class="lineno"> 2191</span> nodes_by_positive_demand[<a class="code hl_variable" href="resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20">demand</a>].push_back(node);</div>
|
|
<div class="line"><a id="l02192" name="l02192"></a><span class="lineno"> 2192</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20">demand</a> < 0) {</div>
|
|
<div class="line"><a id="l02193" name="l02193"></a><span class="lineno"> 2193</span> nodes_by_negative_demand[-<a class="code hl_variable" href="resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20">demand</a>].push_back(node);</div>
|
|
<div class="line"><a id="l02194" name="l02194"></a><span class="lineno"> 2194</span> }</div>
|
|
<div class="line"><a id="l02195" name="l02195"></a><span class="lineno"> 2195</span> }</div>
|
|
<div class="line"><a id="l02196" name="l02196"></a><span class="lineno"> 2196</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>& [<a class="code hl_variable" href="resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20">demand</a>, positive_nodes] : nodes_by_positive_demand) {</div>
|
|
<div class="line"><a id="l02197" name="l02197"></a><span class="lineno"> 2197</span> <span class="keyword">const</span> std::vector<int64_t>* <span class="keyword">const</span> negative_nodes =</div>
|
|
<div class="line"><a id="l02198" name="l02198"></a><span class="lineno"> 2198</span> <a class="code hl_function" href="namespacegtl.html#a9f74dcd1ec00022462cbf110edaafc6d">gtl::FindOrNull</a>(nodes_by_negative_demand, <a class="code hl_variable" href="resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20">demand</a>);</div>
|
|
<div class="line"><a id="l02199" name="l02199"></a><span class="lineno"> 2199</span> <span class="keywordflow">if</span> (negative_nodes != <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l02200" name="l02200"></a><span class="lineno"> 2200</span> <span class="keywordflow">for</span> (int64_t positive_node : positive_nodes) {</div>
|
|
<div class="line"><a id="l02201" name="l02201"></a><span class="lineno"> 2201</span> <span class="keywordflow">for</span> (int64_t negative_node : *negative_nodes) {</div>
|
|
<div class="line"><a id="l02202" name="l02202"></a><span class="lineno"> 2202</span> implicit_pickup_deliveries.insert({positive_node, negative_node});</div>
|
|
<div class="line"><a id="l02203" name="l02203"></a><span class="lineno"> 2203</span> }</div>
|
|
<div class="line"><a id="l02204" name="l02204"></a><span class="lineno"> 2204</span> }</div>
|
|
<div class="line"><a id="l02205" name="l02205"></a><span class="lineno"> 2205</span> }</div>
|
|
<div class="line"><a id="l02206" name="l02206"></a><span class="lineno"> 2206</span> }</div>
|
|
<div class="line"><a id="l02207" name="l02207"></a><span class="lineno"> 2207</span> }</div>
|
|
<div class="line"><a id="l02208" name="l02208"></a><span class="lineno"> 2208</span> implicit_pickup_delivery_pairs_without_alternatives_.clear();</div>
|
|
<div class="line"><a id="l02209" name="l02209"></a><span class="lineno"> 2209</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> [pickup, delivery] : implicit_pickup_deliveries) {</div>
|
|
<div class="line"><a id="l02210" name="l02210"></a><span class="lineno"> 2210</span> implicit_pickup_delivery_pairs_without_alternatives_.emplace_back(</div>
|
|
<div class="line"><a id="l02211" name="l02211"></a><span class="lineno"> 2211</span> std::vector<int64_t>({pickup}), std::vector<int64_t>({delivery}));</div>
|
|
<div class="line"><a id="l02212" name="l02212"></a><span class="lineno"> 2212</span> }</div>
|
|
<div class="line"><a id="l02213" name="l02213"></a><span class="lineno"> 2213</span>}</div>
|
|
<div class="line"><a id="l02214" name="l02214"></a><span class="lineno"> 2214</span> </div>
|
|
<div class="line"><a id="l02215" name="l02215"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#aa79f8d482de4dd0ef86a1b54999686af"> 2215</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa79f8d482de4dd0ef86a1b54999686af">RoutingModel::CloseModelWithParameters</a>(</div>
|
|
<div class="line"><a id="l02216" name="l02216"></a><span class="lineno"> 2216</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_search_parameters.html">RoutingSearchParameters</a>& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>) {</div>
|
|
<div class="line"><a id="l02217" name="l02217"></a><span class="lineno"> 2217</span> std::string error = <a class="code hl_function" href="namespaceoperations__research.html#a4955428bea2f2202769a58fdd47a126d">FindErrorInRoutingSearchParameters</a>(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>);</div>
|
|
<div class="line"><a id="l02218" name="l02218"></a><span class="lineno"> 2218</span> <span class="keywordflow">if</span> (!error.empty()) {</div>
|
|
<div class="line"><a id="l02219" name="l02219"></a><span class="lineno"> 2219</span> status_ = <a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70bae78ffdfdfc3eb7331c0ef91bdef8452b">ROUTING_INVALID</a>;</div>
|
|
<div class="line"><a id="l02220" name="l02220"></a><span class="lineno"> 2220</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67">ERROR</a>) << <span class="stringliteral">"Invalid RoutingSearchParameters: "</span> << error;</div>
|
|
<div class="line"><a id="l02221" name="l02221"></a><span class="lineno"> 2221</span> <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l02222" name="l02222"></a><span class="lineno"> 2222</span> }</div>
|
|
<div class="line"><a id="l02223" name="l02223"></a><span class="lineno"> 2223</span> <span class="keywordflow">if</span> (closed_) {</div>
|
|
<div class="line"><a id="l02224" name="l02224"></a><span class="lineno"> 2224</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7">WARNING</a>) << <span class="stringliteral">"Model already closed"</span>;</div>
|
|
<div class="line"><a id="l02225" name="l02225"></a><span class="lineno"> 2225</span> <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l02226" name="l02226"></a><span class="lineno"> 2226</span> }</div>
|
|
<div class="line"><a id="l02227" name="l02227"></a><span class="lineno"> 2227</span> closed_ = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l02228" name="l02228"></a><span class="lineno"> 2228</span> </div>
|
|
<div class="line"><a id="l02229" name="l02229"></a><span class="lineno"> 2229</span> <span class="keywordflow">for</span> (<a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* <span class="keyword">const</span> dimension : dimensions_) {</div>
|
|
<div class="line"><a id="l02230" name="l02230"></a><span class="lineno"> 2230</span> dimension->CloseModel(UsesLightPropagation(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>));</div>
|
|
<div class="line"><a id="l02231" name="l02231"></a><span class="lineno"> 2231</span> }</div>
|
|
<div class="line"><a id="l02232" name="l02232"></a><span class="lineno"> 2232</span> </div>
|
|
<div class="line"><a id="l02233" name="l02233"></a><span class="lineno"> 2233</span> dimension_resource_group_indices_.resize(dimensions_.size());</div>
|
|
<div class="line"><a id="l02234" name="l02234"></a><span class="lineno"> 2234</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> rg_index = 0; rg_index < resource_groups_.size(); rg_index++) {</div>
|
|
<div class="line"><a id="l02235" name="l02235"></a><span class="lineno"> 2235</span> <span class="keywordflow">for</span> (<a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce">DimensionIndex</a> dim_index :</div>
|
|
<div class="line"><a id="l02236" name="l02236"></a><span class="lineno"> 2236</span> resource_groups_[rg_index]-><a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#ad93f7aec147f056b882871e4859d7ed7">GetAffectedDimensionIndices</a>()) {</div>
|
|
<div class="line"><a id="l02237" name="l02237"></a><span class="lineno"> 2237</span> dimension_resource_group_indices_[dim_index].push_back(rg_index);</div>
|
|
<div class="line"><a id="l02238" name="l02238"></a><span class="lineno"> 2238</span> }</div>
|
|
<div class="line"><a id="l02239" name="l02239"></a><span class="lineno"> 2239</span> }</div>
|
|
<div class="line"><a id="l02240" name="l02240"></a><span class="lineno"> 2240</span> </div>
|
|
<div class="line"><a id="l02241" name="l02241"></a><span class="lineno"> 2241</span> ComputeCostClasses(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>);</div>
|
|
<div class="line"><a id="l02242" name="l02242"></a><span class="lineno"> 2242</span> ComputeVehicleClasses();</div>
|
|
<div class="line"><a id="l02243" name="l02243"></a><span class="lineno"> 2243</span> ComputeVehicleTypes();</div>
|
|
<div class="line"><a id="l02244" name="l02244"></a><span class="lineno"> 2244</span> FinalizeVisitTypes();</div>
|
|
<div class="line"><a id="l02245" name="l02245"></a><span class="lineno"> 2245</span> vehicle_start_class_callback_ = [<span class="keyword">this</span>](int64_t start) {</div>
|
|
<div class="line"><a id="l02246" name="l02246"></a><span class="lineno"> 2246</span> <span class="keywordflow">return</span> GetVehicleStartClass(start);</div>
|
|
<div class="line"><a id="l02247" name="l02247"></a><span class="lineno"> 2247</span> };</div>
|
|
<div class="line"><a id="l02248" name="l02248"></a><span class="lineno"> 2248</span> </div>
|
|
<div class="line"><a id="l02249" name="l02249"></a><span class="lineno"> 2249</span> AddNoCycleConstraintInternal();</div>
|
|
<div class="line"><a id="l02250" name="l02250"></a><span class="lineno"> 2250</span> </div>
|
|
<div class="line"><a id="l02251" name="l02251"></a><span class="lineno"> 2251</span> <span class="keyword">const</span> <span class="keywordtype">int</span> size = <a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#a24926108b770033792d015cb86aeffb3">Size</a>();</div>
|
|
<div class="line"><a id="l02252" name="l02252"></a><span class="lineno"> 2252</span> </div>
|
|
<div class="line"><a id="l02253" name="l02253"></a><span class="lineno"> 2253</span> <span class="comment">// Vehicle variable constraints</span></div>
|
|
<div class="line"><a id="l02254" name="l02254"></a><span class="lineno"> 2254</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < vehicles_; ++i) {</div>
|
|
<div class="line"><a id="l02255" name="l02255"></a><span class="lineno"> 2255</span> <span class="keyword">const</span> int64_t start = starts_[i];</div>
|
|
<div class="line"><a id="l02256" name="l02256"></a><span class="lineno"> 2256</span> <span class="keyword">const</span> int64_t end = ends_[i];</div>
|
|
<div class="line"><a id="l02257" name="l02257"></a><span class="lineno"> 2257</span> solver_->AddConstraint(</div>
|
|
<div class="line"><a id="l02258" name="l02258"></a><span class="lineno"> 2258</span> solver_->MakeEquality(vehicle_vars_[start], solver_->MakeIntConst(i)));</div>
|
|
<div class="line"><a id="l02259" name="l02259"></a><span class="lineno"> 2259</span> solver_->AddConstraint(</div>
|
|
<div class="line"><a id="l02260" name="l02260"></a><span class="lineno"> 2260</span> solver_->MakeEquality(vehicle_vars_[end], solver_->MakeIntConst(i)));</div>
|
|
<div class="line"><a id="l02261" name="l02261"></a><span class="lineno"> 2261</span> solver_->AddConstraint(</div>
|
|
<div class="line"><a id="l02262" name="l02262"></a><span class="lineno"> 2262</span> solver_->MakeIsDifferentCstCt(nexts_[start], end, vehicle_active_[i]));</div>
|
|
<div class="line"><a id="l02263" name="l02263"></a><span class="lineno"> 2263</span> <span class="keywordflow">if</span> (consider_empty_route_costs_[i]) {</div>
|
|
<div class="line"><a id="l02264" name="l02264"></a><span class="lineno"> 2264</span> vehicle_costs_considered_[i]->SetMin(1);</div>
|
|
<div class="line"><a id="l02265" name="l02265"></a><span class="lineno"> 2265</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l02266" name="l02266"></a><span class="lineno"> 2266</span> solver_->AddConstraint(solver_->MakeEquality(</div>
|
|
<div class="line"><a id="l02267" name="l02267"></a><span class="lineno"> 2267</span> vehicle_active_[i], vehicle_costs_considered_[i]));</div>
|
|
<div class="line"><a id="l02268" name="l02268"></a><span class="lineno"> 2268</span> }</div>
|
|
<div class="line"><a id="l02269" name="l02269"></a><span class="lineno"> 2269</span> }</div>
|
|
<div class="line"><a id="l02270" name="l02270"></a><span class="lineno"> 2270</span> </div>
|
|
<div class="line"><a id="l02271" name="l02271"></a><span class="lineno"> 2271</span> <span class="comment">// Limit the number of vehicles with non-empty routes.</span></div>
|
|
<div class="line"><a id="l02272" name="l02272"></a><span class="lineno"> 2272</span> <span class="keywordflow">if</span> (vehicles_ > max_active_vehicles_) {</div>
|
|
<div class="line"><a id="l02273" name="l02273"></a><span class="lineno"> 2273</span> solver_->AddConstraint(</div>
|
|
<div class="line"><a id="l02274" name="l02274"></a><span class="lineno"> 2274</span> solver_->MakeSumLessOrEqual(vehicle_active_, max_active_vehicles_));</div>
|
|
<div class="line"><a id="l02275" name="l02275"></a><span class="lineno"> 2275</span> }</div>
|
|
<div class="line"><a id="l02276" name="l02276"></a><span class="lineno"> 2276</span> </div>
|
|
<div class="line"><a id="l02277" name="l02277"></a><span class="lineno"> 2277</span> <span class="comment">// If there is only one vehicle in the model the vehicle variables will have</span></div>
|
|
<div class="line"><a id="l02278" name="l02278"></a><span class="lineno"> 2278</span> <span class="comment">// a maximum domain of [-1, 0]. If a node is performed/active then its vehicle</span></div>
|
|
<div class="line"><a id="l02279" name="l02279"></a><span class="lineno"> 2279</span> <span class="comment">// variable will be reduced to [0] making the path-cumul constraint below</span></div>
|
|
<div class="line"><a id="l02280" name="l02280"></a><span class="lineno"> 2280</span> <span class="comment">// useless. If the node is unperformed/unactive then its vehicle variable will</span></div>
|
|
<div class="line"><a id="l02281" name="l02281"></a><span class="lineno"> 2281</span> <span class="comment">// be reduced to [-1] in any case.</span></div>
|
|
<div class="line"><a id="l02282" name="l02282"></a><span class="lineno"> 2282</span> <span class="keywordflow">if</span> (vehicles_ > 1) {</div>
|
|
<div class="line"><a id="l02283" name="l02283"></a><span class="lineno"> 2283</span> std::vector<IntVar*> zero_transit(size, solver_->MakeIntConst(0));</div>
|
|
<div class="line"><a id="l02284" name="l02284"></a><span class="lineno"> 2284</span> solver_->AddConstraint(solver_->MakeDelayedPathCumul(</div>
|
|
<div class="line"><a id="l02285" name="l02285"></a><span class="lineno"> 2285</span> nexts_, active_, vehicle_vars_, zero_transit));</div>
|
|
<div class="line"><a id="l02286" name="l02286"></a><span class="lineno"> 2286</span> }</div>
|
|
<div class="line"><a id="l02287" name="l02287"></a><span class="lineno"> 2287</span> </div>
|
|
<div class="line"><a id="l02288" name="l02288"></a><span class="lineno"> 2288</span> <span class="comment">// Nodes which are not in a disjunction are mandatory, and those with a</span></div>
|
|
<div class="line"><a id="l02289" name="l02289"></a><span class="lineno"> 2289</span> <span class="comment">// trivially infeasible type are necessarily unperformed</span></div>
|
|
<div class="line"><a id="l02290" name="l02290"></a><span class="lineno"> 2290</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < size; ++i) {</div>
|
|
<div class="line"><a id="l02291" name="l02291"></a><span class="lineno"> 2291</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a9148b93be3892d950af000a9b379940e">GetDisjunctionIndices</a>(i).empty() && active_[i]->Max() != 0) {</div>
|
|
<div class="line"><a id="l02292" name="l02292"></a><span class="lineno"> 2292</span> active_[i]->SetValue(1);</div>
|
|
<div class="line"><a id="l02293" name="l02293"></a><span class="lineno"> 2293</span> }</div>
|
|
<div class="line"><a id="l02294" name="l02294"></a><span class="lineno"> 2294</span> <span class="keyword">const</span> <span class="keywordtype">int</span> type = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5ae82715107922af5fbc18f854d58026">GetVisitType</a>(i);</div>
|
|
<div class="line"><a id="l02295" name="l02295"></a><span class="lineno"> 2295</span> <span class="keywordflow">if</span> (type == <a class="code hl_variable" href="namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955">kUnassigned</a>) {</div>
|
|
<div class="line"><a id="l02296" name="l02296"></a><span class="lineno"> 2296</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l02297" name="l02297"></a><span class="lineno"> 2297</span> }</div>
|
|
<div class="line"><a id="l02298" name="l02298"></a><span class="lineno"> 2298</span> <span class="keyword">const</span> absl::flat_hash_set<VisitTypePolicy>* <span class="keyword">const</span> infeasible_policies =</div>
|
|
<div class="line"><a id="l02299" name="l02299"></a><span class="lineno"> 2299</span> <a class="code hl_function" href="namespacegtl.html#a9f74dcd1ec00022462cbf110edaafc6d">gtl::FindOrNull</a>(trivially_infeasible_visit_types_to_policies_, type);</div>
|
|
<div class="line"><a id="l02300" name="l02300"></a><span class="lineno"> 2300</span> <span class="keywordflow">if</span> (infeasible_policies != <span class="keyword">nullptr</span> &&</div>
|
|
<div class="line"><a id="l02301" name="l02301"></a><span class="lineno"> 2301</span> <a class="code hl_function" href="namespacegtl.html#aae28e97bd1fa93cb0032642550da7455">gtl::ContainsKey</a>(*infeasible_policies, index_to_type_policy_[i])) {</div>
|
|
<div class="line"><a id="l02302" name="l02302"></a><span class="lineno"> 2302</span> active_[i]->SetValue(0);</div>
|
|
<div class="line"><a id="l02303" name="l02303"></a><span class="lineno"> 2303</span> }</div>
|
|
<div class="line"><a id="l02304" name="l02304"></a><span class="lineno"> 2304</span> }</div>
|
|
<div class="line"><a id="l02305" name="l02305"></a><span class="lineno"> 2305</span> </div>
|
|
<div class="line"><a id="l02306" name="l02306"></a><span class="lineno"> 2306</span> <span class="comment">// Reduce domains of vehicle variables</span></div>
|
|
<div class="line"><a id="l02307" name="l02307"></a><span class="lineno"> 2307</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < allowed_vehicles_.size(); ++i) {</div>
|
|
<div class="line"><a id="l02308" name="l02308"></a><span class="lineno"> 2308</span> <span class="keyword">const</span> <span class="keyword">auto</span>& allowed_vehicles = allowed_vehicles_[i];</div>
|
|
<div class="line"><a id="l02309" name="l02309"></a><span class="lineno"> 2309</span> <span class="keywordflow">if</span> (!allowed_vehicles.empty()) {</div>
|
|
<div class="line"><a id="l02310" name="l02310"></a><span class="lineno"> 2310</span> std::vector<int64_t> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>;</div>
|
|
<div class="line"><a id="l02311" name="l02311"></a><span class="lineno"> 2311</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>.reserve(allowed_vehicles.size() + 1);</div>
|
|
<div class="line"><a id="l02312" name="l02312"></a><span class="lineno"> 2312</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>.push_back(-1);</div>
|
|
<div class="line"><a id="l02313" name="l02313"></a><span class="lineno"> 2313</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle : allowed_vehicles) {</div>
|
|
<div class="line"><a id="l02314" name="l02314"></a><span class="lineno"> 2314</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>.push_back(vehicle);</div>
|
|
<div class="line"><a id="l02315" name="l02315"></a><span class="lineno"> 2315</span> }</div>
|
|
<div class="line"><a id="l02316" name="l02316"></a><span class="lineno"> 2316</span> solver_->AddConstraint(solver_->MakeMemberCt(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">VehicleVar</a>(i), <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>));</div>
|
|
<div class="line"><a id="l02317" name="l02317"></a><span class="lineno"> 2317</span> }</div>
|
|
<div class="line"><a id="l02318" name="l02318"></a><span class="lineno"> 2318</span> }</div>
|
|
<div class="line"><a id="l02319" name="l02319"></a><span class="lineno"> 2319</span> </div>
|
|
<div class="line"><a id="l02320" name="l02320"></a><span class="lineno"> 2320</span> <span class="comment">// Reduce domain of next variables.</span></div>
|
|
<div class="line"><a id="l02321" name="l02321"></a><span class="lineno"> 2321</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < size; ++i) {</div>
|
|
<div class="line"><a id="l02322" name="l02322"></a><span class="lineno"> 2322</span> <span class="comment">// No variable can point back to a start.</span></div>
|
|
<div class="line"><a id="l02323" name="l02323"></a><span class="lineno"> 2323</span> solver_->AddConstraint(solver_->RevAlloc(</div>
|
|
<div class="line"><a id="l02324" name="l02324"></a><span class="lineno"> 2324</span> <span class="keyword">new</span> DifferentFromValues(solver_.get(), nexts_[i], starts_)));</div>
|
|
<div class="line"><a id="l02325" name="l02325"></a><span class="lineno"> 2325</span> <span class="comment">// Extra constraint to state an active node can't point to itself.</span></div>
|
|
<div class="line"><a id="l02326" name="l02326"></a><span class="lineno"> 2326</span> solver_->AddConstraint(</div>
|
|
<div class="line"><a id="l02327" name="l02327"></a><span class="lineno"> 2327</span> solver_->MakeIsDifferentCstCt(nexts_[i], i, active_[i]));</div>
|
|
<div class="line"><a id="l02328" name="l02328"></a><span class="lineno"> 2328</span> }</div>
|
|
<div class="line"><a id="l02329" name="l02329"></a><span class="lineno"> 2329</span> </div>
|
|
<div class="line"><a id="l02330" name="l02330"></a><span class="lineno"> 2330</span> <span class="comment">// Add constraints to bind vehicle_vars_[i] to -1 in case that node i is not</span></div>
|
|
<div class="line"><a id="l02331" name="l02331"></a><span class="lineno"> 2331</span> <span class="comment">// active.</span></div>
|
|
<div class="line"><a id="l02332" name="l02332"></a><span class="lineno"> 2332</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < size; ++i) {</div>
|
|
<div class="line"><a id="l02333" name="l02333"></a><span class="lineno"> 2333</span> solver_->AddConstraint(</div>
|
|
<div class="line"><a id="l02334" name="l02334"></a><span class="lineno"> 2334</span> solver_->MakeIsDifferentCstCt(vehicle_vars_[i], -1, active_[i]));</div>
|
|
<div class="line"><a id="l02335" name="l02335"></a><span class="lineno"> 2335</span> }</div>
|
|
<div class="line"><a id="l02336" name="l02336"></a><span class="lineno"> 2336</span> </div>
|
|
<div class="line"><a id="l02337" name="l02337"></a><span class="lineno"> 2337</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab313d84a56c5e9b1b8f28da70b8d4045">HasTypeRegulations</a>()) {</div>
|
|
<div class="line"><a id="l02338" name="l02338"></a><span class="lineno"> 2338</span> solver_->AddConstraint(</div>
|
|
<div class="line"><a id="l02339" name="l02339"></a><span class="lineno"> 2339</span> solver_->RevAlloc(<span class="keyword">new</span> <a class="code hl_class" href="classoperations__research_1_1_type_regulations_constraint.html">TypeRegulationsConstraint</a>(*<span class="keyword">this</span>)));</div>
|
|
<div class="line"><a id="l02340" name="l02340"></a><span class="lineno"> 2340</span> }</div>
|
|
<div class="line"><a id="l02341" name="l02341"></a><span class="lineno"> 2341</span> </div>
|
|
<div class="line"><a id="l02342" name="l02342"></a><span class="lineno"> 2342</span> <span class="comment">// Associate first and "logical" last nodes</span></div>
|
|
<div class="line"><a id="l02343" name="l02343"></a><span class="lineno"> 2343</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < vehicles_; ++i) {</div>
|
|
<div class="line"><a id="l02344" name="l02344"></a><span class="lineno"> 2344</span> std::vector<int64_t> forbidden_ends;</div>
|
|
<div class="line"><a id="l02345" name="l02345"></a><span class="lineno"> 2345</span> forbidden_ends.reserve(vehicles_ - 1);</div>
|
|
<div class="line"><a id="l02346" name="l02346"></a><span class="lineno"> 2346</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> j = 0; j < vehicles_; ++j) {</div>
|
|
<div class="line"><a id="l02347" name="l02347"></a><span class="lineno"> 2347</span> <span class="keywordflow">if</span> (i != j) {</div>
|
|
<div class="line"><a id="l02348" name="l02348"></a><span class="lineno"> 2348</span> forbidden_ends.push_back(ends_[j]);</div>
|
|
<div class="line"><a id="l02349" name="l02349"></a><span class="lineno"> 2349</span> }</div>
|
|
<div class="line"><a id="l02350" name="l02350"></a><span class="lineno"> 2350</span> }</div>
|
|
<div class="line"><a id="l02351" name="l02351"></a><span class="lineno"> 2351</span> solver_->AddConstraint(solver_->RevAlloc(<span class="keyword">new</span> DifferentFromValues(</div>
|
|
<div class="line"><a id="l02352" name="l02352"></a><span class="lineno"> 2352</span> solver_.get(), nexts_[starts_[i]], std::move(forbidden_ends))));</div>
|
|
<div class="line"><a id="l02353" name="l02353"></a><span class="lineno"> 2353</span> }</div>
|
|
<div class="line"><a id="l02354" name="l02354"></a><span class="lineno"> 2354</span> </div>
|
|
<div class="line"><a id="l02355" name="l02355"></a><span class="lineno"> 2355</span> <span class="comment">// Constraining is_bound_to_end_ variables.</span></div>
|
|
<div class="line"><a id="l02356" name="l02356"></a><span class="lineno"> 2356</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> int64_t end : ends_) {</div>
|
|
<div class="line"><a id="l02357" name="l02357"></a><span class="lineno"> 2357</span> is_bound_to_end_[end]->SetValue(1);</div>
|
|
<div class="line"><a id="l02358" name="l02358"></a><span class="lineno"> 2358</span> }</div>
|
|
<div class="line"><a id="l02359" name="l02359"></a><span class="lineno"> 2359</span> </div>
|
|
<div class="line"><a id="l02360" name="l02360"></a><span class="lineno"> 2360</span> std::vector<IntVar*> cost_elements;</div>
|
|
<div class="line"><a id="l02361" name="l02361"></a><span class="lineno"> 2361</span> <span class="comment">// Arc and dimension costs.</span></div>
|
|
<div class="line"><a id="l02362" name="l02362"></a><span class="lineno"> 2362</span> <span class="keywordflow">if</span> (vehicles_ > 0) {</div>
|
|
<div class="line"><a id="l02363" name="l02363"></a><span class="lineno"> 2363</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> node_index = 0; node_index < size; ++node_index) {</div>
|
|
<div class="line"><a id="l02364" name="l02364"></a><span class="lineno"> 2364</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853">CostsAreHomogeneousAcrossVehicles</a>()) {</div>
|
|
<div class="line"><a id="l02365" name="l02365"></a><span class="lineno"> 2365</span> AppendHomogeneousArcCosts(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>, node_index, &cost_elements);</div>
|
|
<div class="line"><a id="l02366" name="l02366"></a><span class="lineno"> 2366</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l02367" name="l02367"></a><span class="lineno"> 2367</span> AppendArcCosts(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>, node_index, &cost_elements);</div>
|
|
<div class="line"><a id="l02368" name="l02368"></a><span class="lineno"> 2368</span> }</div>
|
|
<div class="line"><a id="l02369" name="l02369"></a><span class="lineno"> 2369</span> }</div>
|
|
<div class="line"><a id="l02370" name="l02370"></a><span class="lineno"> 2370</span> <span class="keywordflow">if</span> (vehicle_amortized_cost_factors_set_) {</div>
|
|
<div class="line"><a id="l02371" name="l02371"></a><span class="lineno"> 2371</span> std::vector<IntVar*> route_lengths;</div>
|
|
<div class="line"><a id="l02372" name="l02372"></a><span class="lineno"> 2372</span> solver_->MakeIntVarArray(vehicles_, 0, size, &route_lengths);</div>
|
|
<div class="line"><a id="l02373" name="l02373"></a><span class="lineno"> 2373</span> solver_->AddConstraint(</div>
|
|
<div class="line"><a id="l02374" name="l02374"></a><span class="lineno"> 2374</span> solver_->MakeDistribute(vehicle_vars_, route_lengths));</div>
|
|
<div class="line"><a id="l02375" name="l02375"></a><span class="lineno"> 2375</span> std::vector<IntVar*> vehicle_used;</div>
|
|
<div class="line"><a id="l02376" name="l02376"></a><span class="lineno"> 2376</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < vehicles_; i++) {</div>
|
|
<div class="line"><a id="l02377" name="l02377"></a><span class="lineno"> 2377</span> <span class="comment">// The start/end of the vehicle are always on the route.</span></div>
|
|
<div class="line"><a id="l02378" name="l02378"></a><span class="lineno"> 2378</span> vehicle_used.push_back(</div>
|
|
<div class="line"><a id="l02379" name="l02379"></a><span class="lineno"> 2379</span> solver_->MakeIsGreaterCstVar(route_lengths[i], 2));</div>
|
|
<div class="line"><a id="l02380" name="l02380"></a><span class="lineno"> 2380</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> =</div>
|
|
<div class="line"><a id="l02381" name="l02381"></a><span class="lineno"> 2381</span> solver_</div>
|
|
<div class="line"><a id="l02382" name="l02382"></a><span class="lineno"> 2382</span> ->MakeProd(solver_->MakeOpposite(solver_->MakeSquare(</div>
|
|
<div class="line"><a id="l02383" name="l02383"></a><span class="lineno"> 2383</span> solver_->MakeSum(route_lengths[i], -2))),</div>
|
|
<div class="line"><a id="l02384" name="l02384"></a><span class="lineno"> 2384</span> quadratic_cost_factor_of_vehicle_[i])</div>
|
|
<div class="line"><a id="l02385" name="l02385"></a><span class="lineno"> 2385</span> ->Var();</div>
|
|
<div class="line"><a id="l02386" name="l02386"></a><span class="lineno"> 2386</span> cost_elements.push_back(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
|
|
<div class="line"><a id="l02387" name="l02387"></a><span class="lineno"> 2387</span> }</div>
|
|
<div class="line"><a id="l02388" name="l02388"></a><span class="lineno"> 2388</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> vehicle_usage_cost =</div>
|
|
<div class="line"><a id="l02389" name="l02389"></a><span class="lineno"> 2389</span> solver_->MakeScalProd(vehicle_used, linear_cost_factor_of_vehicle_)</div>
|
|
<div class="line"><a id="l02390" name="l02390"></a><span class="lineno"> 2390</span> ->Var();</div>
|
|
<div class="line"><a id="l02391" name="l02391"></a><span class="lineno"> 2391</span> cost_elements.push_back(vehicle_usage_cost);</div>
|
|
<div class="line"><a id="l02392" name="l02392"></a><span class="lineno"> 2392</span> }</div>
|
|
<div class="line"><a id="l02393" name="l02393"></a><span class="lineno"> 2393</span> }</div>
|
|
<div class="line"><a id="l02394" name="l02394"></a><span class="lineno"> 2394</span> <span class="comment">// Dimension span constraints: cost and limits.</span></div>
|
|
<div class="line"><a id="l02395" name="l02395"></a><span class="lineno"> 2395</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* dimension : dimensions_) {</div>
|
|
<div class="line"><a id="l02396" name="l02396"></a><span class="lineno"> 2396</span> dimension->SetupGlobalSpanCost(&cost_elements);</div>
|
|
<div class="line"><a id="l02397" name="l02397"></a><span class="lineno"> 2397</span> dimension->SetupSlackAndDependentTransitCosts();</div>
|
|
<div class="line"><a id="l02398" name="l02398"></a><span class="lineno"> 2398</span> <span class="keyword">const</span> std::vector<int64_t>& span_costs =</div>
|
|
<div class="line"><a id="l02399" name="l02399"></a><span class="lineno"> 2399</span> dimension->vehicle_span_cost_coefficients();</div>
|
|
<div class="line"><a id="l02400" name="l02400"></a><span class="lineno"> 2400</span> <span class="keyword">const</span> std::vector<int64_t>& span_ubs =</div>
|
|
<div class="line"><a id="l02401" name="l02401"></a><span class="lineno"> 2401</span> dimension->vehicle_span_upper_bounds();</div>
|
|
<div class="line"><a id="l02402" name="l02402"></a><span class="lineno"> 2402</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> has_span_constraint =</div>
|
|
<div class="line"><a id="l02403" name="l02403"></a><span class="lineno"> 2403</span> std::any_of(span_costs.begin(), span_costs.end(),</div>
|
|
<div class="line"><a id="l02404" name="l02404"></a><span class="lineno"> 2404</span> [](int64_t coeff) { return coeff != 0; }) ||</div>
|
|
<div class="line"><a id="l02405" name="l02405"></a><span class="lineno"> 2405</span> std::any_of(span_ubs.begin(), span_ubs.end(),</div>
|
|
<div class="line"><a id="l02406" name="l02406"></a><span class="lineno"> 2406</span> [](int64_t <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>) {</div>
|
|
<div class="line"><a id="l02407" name="l02407"></a><span class="lineno"> 2407</span> return value < std::numeric_limits<int64_t>::max();</div>
|
|
<div class="line"><a id="l02408" name="l02408"></a><span class="lineno"> 2408</span> }) ||</div>
|
|
<div class="line"><a id="l02409" name="l02409"></a><span class="lineno"> 2409</span> dimension->HasSoftSpanUpperBounds() ||</div>
|
|
<div class="line"><a id="l02410" name="l02410"></a><span class="lineno"> 2410</span> dimension->HasQuadraticCostSoftSpanUpperBounds();</div>
|
|
<div class="line"><a id="l02411" name="l02411"></a><span class="lineno"> 2411</span> <span class="keywordflow">if</span> (has_span_constraint) {</div>
|
|
<div class="line"><a id="l02412" name="l02412"></a><span class="lineno"> 2412</span> std::vector<IntVar*> spans(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(), <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l02413" name="l02413"></a><span class="lineno"> 2413</span> std::vector<IntVar*> total_slacks(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(), <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l02414" name="l02414"></a><span class="lineno"> 2414</span> <span class="comment">// Generate variables only where needed.</span></div>
|
|
<div class="line"><a id="l02415" name="l02415"></a><span class="lineno"> 2415</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++vehicle) {</div>
|
|
<div class="line"><a id="l02416" name="l02416"></a><span class="lineno"> 2416</span> <span class="keywordflow">if</span> (span_ubs[vehicle] < <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>()) {</div>
|
|
<div class="line"><a id="l02417" name="l02417"></a><span class="lineno"> 2417</span> spans[vehicle] = solver_->MakeIntVar(0, span_ubs[vehicle], <span class="stringliteral">""</span>);</div>
|
|
<div class="line"><a id="l02418" name="l02418"></a><span class="lineno"> 2418</span> }</div>
|
|
<div class="line"><a id="l02419" name="l02419"></a><span class="lineno"> 2419</span> <span class="keywordflow">if</span> (span_costs[vehicle] != 0) {</div>
|
|
<div class="line"><a id="l02420" name="l02420"></a><span class="lineno"> 2420</span> total_slacks[vehicle] = solver_->MakeIntVar(0, span_ubs[vehicle], <span class="stringliteral">""</span>);</div>
|
|
<div class="line"><a id="l02421" name="l02421"></a><span class="lineno"> 2421</span> }</div>
|
|
<div class="line"><a id="l02422" name="l02422"></a><span class="lineno"> 2422</span> }</div>
|
|
<div class="line"><a id="l02423" name="l02423"></a><span class="lineno"> 2423</span> <span class="keywordflow">if</span> (dimension->HasSoftSpanUpperBounds()) {</div>
|
|
<div class="line"><a id="l02424" name="l02424"></a><span class="lineno"> 2424</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++vehicle) {</div>
|
|
<div class="line"><a id="l02425" name="l02425"></a><span class="lineno"> 2425</span> <span class="keywordflow">if</span> (spans[vehicle]) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l02426" name="l02426"></a><span class="lineno"> 2426</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1_simple_bound_costs_1_1_bound_cost.html">SimpleBoundCosts::BoundCost</a> bound_cost =</div>
|
|
<div class="line"><a id="l02427" name="l02427"></a><span class="lineno"> 2427</span> dimension->GetSoftSpanUpperBoundForVehicle(vehicle);</div>
|
|
<div class="line"><a id="l02428" name="l02428"></a><span class="lineno"> 2428</span> <span class="keywordflow">if</span> (bound_cost.<a class="code hl_variable" href="structoperations__research_1_1_simple_bound_costs_1_1_bound_cost.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a> == 0) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l02429" name="l02429"></a><span class="lineno"> 2429</span> spans[vehicle] = solver_->MakeIntVar(0, span_ubs[vehicle]);</div>
|
|
<div class="line"><a id="l02430" name="l02430"></a><span class="lineno"> 2430</span> }</div>
|
|
<div class="line"><a id="l02431" name="l02431"></a><span class="lineno"> 2431</span> }</div>
|
|
<div class="line"><a id="l02432" name="l02432"></a><span class="lineno"> 2432</span> <span class="keywordflow">if</span> (dimension->HasQuadraticCostSoftSpanUpperBounds()) {</div>
|
|
<div class="line"><a id="l02433" name="l02433"></a><span class="lineno"> 2433</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++vehicle) {</div>
|
|
<div class="line"><a id="l02434" name="l02434"></a><span class="lineno"> 2434</span> <span class="keywordflow">if</span> (spans[vehicle]) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l02435" name="l02435"></a><span class="lineno"> 2435</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1_simple_bound_costs_1_1_bound_cost.html">SimpleBoundCosts::BoundCost</a> bound_cost =</div>
|
|
<div class="line"><a id="l02436" name="l02436"></a><span class="lineno"> 2436</span> dimension->GetQuadraticCostSoftSpanUpperBoundForVehicle(vehicle);</div>
|
|
<div class="line"><a id="l02437" name="l02437"></a><span class="lineno"> 2437</span> <span class="keywordflow">if</span> (bound_cost.<a class="code hl_variable" href="structoperations__research_1_1_simple_bound_costs_1_1_bound_cost.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a> == 0) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l02438" name="l02438"></a><span class="lineno"> 2438</span> spans[vehicle] = solver_->MakeIntVar(0, span_ubs[vehicle]);</div>
|
|
<div class="line"><a id="l02439" name="l02439"></a><span class="lineno"> 2439</span> }</div>
|
|
<div class="line"><a id="l02440" name="l02440"></a><span class="lineno"> 2440</span> }</div>
|
|
<div class="line"><a id="l02441" name="l02441"></a><span class="lineno"> 2441</span> solver_->AddConstraint(</div>
|
|
<div class="line"><a id="l02442" name="l02442"></a><span class="lineno"> 2442</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a4ffedcd1ce5dc6b224edff0b417aad5c">MakePathSpansAndTotalSlacks</a>(dimension, spans, total_slacks));</div>
|
|
<div class="line"><a id="l02443" name="l02443"></a><span class="lineno"> 2443</span> <span class="comment">// If a vehicle's span is constrained, its start/end cumuls must be</span></div>
|
|
<div class="line"><a id="l02444" name="l02444"></a><span class="lineno"> 2444</span> <span class="comment">// instantiated.</span></div>
|
|
<div class="line"><a id="l02445" name="l02445"></a><span class="lineno"> 2445</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++vehicle) {</div>
|
|
<div class="line"><a id="l02446" name="l02446"></a><span class="lineno"> 2446</span> <span class="keywordflow">if</span> (!spans[vehicle] && !total_slacks[vehicle]) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l02447" name="l02447"></a><span class="lineno"> 2447</span> <span class="keywordflow">if</span> (spans[vehicle]) {</div>
|
|
<div class="line"><a id="l02448" name="l02448"></a><span class="lineno"> 2448</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8fc98154baec00fd3be88c9d6a0234dc">AddVariableTargetToFinalizer</a>(spans[vehicle],</div>
|
|
<div class="line"><a id="l02449" name="l02449"></a><span class="lineno"> 2449</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits<int64_t>::min</a>());</div>
|
|
<div class="line"><a id="l02450" name="l02450"></a><span class="lineno"> 2450</span> }</div>
|
|
<div class="line"><a id="l02451" name="l02451"></a><span class="lineno"> 2451</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8fc98154baec00fd3be88c9d6a0234dc">AddVariableTargetToFinalizer</a>(dimension->CumulVar(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afb80fd36c1fb57d2db049403483e2074">End</a>(vehicle)),</div>
|
|
<div class="line"><a id="l02452" name="l02452"></a><span class="lineno"> 2452</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits<int64_t>::min</a>());</div>
|
|
<div class="line"><a id="l02453" name="l02453"></a><span class="lineno"> 2453</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8fc98154baec00fd3be88c9d6a0234dc">AddVariableTargetToFinalizer</a>(dimension->CumulVar(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(vehicle)),</div>
|
|
<div class="line"><a id="l02454" name="l02454"></a><span class="lineno"> 2454</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>());</div>
|
|
<div class="line"><a id="l02455" name="l02455"></a><span class="lineno"> 2455</span> }</div>
|
|
<div class="line"><a id="l02456" name="l02456"></a><span class="lineno"> 2456</span> <span class="comment">// Add costs of variables.</span></div>
|
|
<div class="line"><a id="l02457" name="l02457"></a><span class="lineno"> 2457</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++vehicle) {</div>
|
|
<div class="line"><a id="l02458" name="l02458"></a><span class="lineno"> 2458</span> <span class="keywordflow">if</span> (span_costs[vehicle] == 0) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l02459" name="l02459"></a><span class="lineno"> 2459</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(total_slacks[vehicle] != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l02460" name="l02460"></a><span class="lineno"> 2460</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> slack_amount =</div>
|
|
<div class="line"><a id="l02461" name="l02461"></a><span class="lineno"> 2461</span> solver_</div>
|
|
<div class="line"><a id="l02462" name="l02462"></a><span class="lineno"> 2462</span> ->MakeProd(vehicle_costs_considered_[vehicle],</div>
|
|
<div class="line"><a id="l02463" name="l02463"></a><span class="lineno"> 2463</span> total_slacks[vehicle])</div>
|
|
<div class="line"><a id="l02464" name="l02464"></a><span class="lineno"> 2464</span> ->Var();</div>
|
|
<div class="line"><a id="l02465" name="l02465"></a><span class="lineno"> 2465</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> slack_cost =</div>
|
|
<div class="line"><a id="l02466" name="l02466"></a><span class="lineno"> 2466</span> solver_->MakeProd(slack_amount, span_costs[vehicle])->Var();</div>
|
|
<div class="line"><a id="l02467" name="l02467"></a><span class="lineno"> 2467</span> cost_elements.push_back(slack_cost);</div>
|
|
<div class="line"><a id="l02468" name="l02468"></a><span class="lineno"> 2468</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab81fff41f3dde630902e1c4e2f534732">AddWeightedVariableMinimizedByFinalizer</a>(slack_amount,</div>
|
|
<div class="line"><a id="l02469" name="l02469"></a><span class="lineno"> 2469</span> span_costs[vehicle]);</div>
|
|
<div class="line"><a id="l02470" name="l02470"></a><span class="lineno"> 2470</span> }</div>
|
|
<div class="line"><a id="l02471" name="l02471"></a><span class="lineno"> 2471</span> <span class="keywordflow">if</span> (dimension->HasSoftSpanUpperBounds()) {</div>
|
|
<div class="line"><a id="l02472" name="l02472"></a><span class="lineno"> 2472</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++vehicle) {</div>
|
|
<div class="line"><a id="l02473" name="l02473"></a><span class="lineno"> 2473</span> <span class="keyword">const</span> <span class="keyword">auto</span> bound_cost =</div>
|
|
<div class="line"><a id="l02474" name="l02474"></a><span class="lineno"> 2474</span> dimension->GetSoftSpanUpperBoundForVehicle(vehicle);</div>
|
|
<div class="line"><a id="l02475" name="l02475"></a><span class="lineno"> 2475</span> <span class="keywordflow">if</span> (bound_cost.cost == 0 ||</div>
|
|
<div class="line"><a id="l02476" name="l02476"></a><span class="lineno"> 2476</span> bound_cost.bound == <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>())</div>
|
|
<div class="line"><a id="l02477" name="l02477"></a><span class="lineno"> 2477</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l02478" name="l02478"></a><span class="lineno"> 2478</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(spans[vehicle] != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l02479" name="l02479"></a><span class="lineno"> 2479</span> <span class="comment">// Additional cost is vehicle_cost_considered_[vehicle] *</span></div>
|
|
<div class="line"><a id="l02480" name="l02480"></a><span class="lineno"> 2480</span> <span class="comment">// max(0, spans[vehicle] - bound_cost.bound) * bound_cost.cost.</span></div>
|
|
<div class="line"><a id="l02481" name="l02481"></a><span class="lineno"> 2481</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> span_violation_amount =</div>
|
|
<div class="line"><a id="l02482" name="l02482"></a><span class="lineno"> 2482</span> solver_</div>
|
|
<div class="line"><a id="l02483" name="l02483"></a><span class="lineno"> 2483</span> ->MakeProd(</div>
|
|
<div class="line"><a id="l02484" name="l02484"></a><span class="lineno"> 2484</span> vehicle_costs_considered_[vehicle],</div>
|
|
<div class="line"><a id="l02485" name="l02485"></a><span class="lineno"> 2485</span> solver_->MakeMax(</div>
|
|
<div class="line"><a id="l02486" name="l02486"></a><span class="lineno"> 2486</span> solver_->MakeSum(spans[vehicle], -bound_cost.bound),</div>
|
|
<div class="line"><a id="l02487" name="l02487"></a><span class="lineno"> 2487</span> 0))</div>
|
|
<div class="line"><a id="l02488" name="l02488"></a><span class="lineno"> 2488</span> ->Var();</div>
|
|
<div class="line"><a id="l02489" name="l02489"></a><span class="lineno"> 2489</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> span_violation_cost =</div>
|
|
<div class="line"><a id="l02490" name="l02490"></a><span class="lineno"> 2490</span> solver_->MakeProd(span_violation_amount, bound_cost.cost)->Var();</div>
|
|
<div class="line"><a id="l02491" name="l02491"></a><span class="lineno"> 2491</span> cost_elements.push_back(span_violation_cost);</div>
|
|
<div class="line"><a id="l02492" name="l02492"></a><span class="lineno"> 2492</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab81fff41f3dde630902e1c4e2f534732">AddWeightedVariableMinimizedByFinalizer</a>(span_violation_amount,</div>
|
|
<div class="line"><a id="l02493" name="l02493"></a><span class="lineno"> 2493</span> bound_cost.cost);</div>
|
|
<div class="line"><a id="l02494" name="l02494"></a><span class="lineno"> 2494</span> }</div>
|
|
<div class="line"><a id="l02495" name="l02495"></a><span class="lineno"> 2495</span> }</div>
|
|
<div class="line"><a id="l02496" name="l02496"></a><span class="lineno"> 2496</span> <span class="keywordflow">if</span> (dimension->HasQuadraticCostSoftSpanUpperBounds()) {</div>
|
|
<div class="line"><a id="l02497" name="l02497"></a><span class="lineno"> 2497</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++vehicle) {</div>
|
|
<div class="line"><a id="l02498" name="l02498"></a><span class="lineno"> 2498</span> <span class="keyword">const</span> <span class="keyword">auto</span> bound_cost =</div>
|
|
<div class="line"><a id="l02499" name="l02499"></a><span class="lineno"> 2499</span> dimension->GetQuadraticCostSoftSpanUpperBoundForVehicle(vehicle);</div>
|
|
<div class="line"><a id="l02500" name="l02500"></a><span class="lineno"> 2500</span> <span class="keywordflow">if</span> (bound_cost.cost == 0 ||</div>
|
|
<div class="line"><a id="l02501" name="l02501"></a><span class="lineno"> 2501</span> bound_cost.bound == <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>())</div>
|
|
<div class="line"><a id="l02502" name="l02502"></a><span class="lineno"> 2502</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l02503" name="l02503"></a><span class="lineno"> 2503</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(spans[vehicle] != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l02504" name="l02504"></a><span class="lineno"> 2504</span> <span class="comment">// Additional cost is vehicle_cost_considered_[vehicle] *</span></div>
|
|
<div class="line"><a id="l02505" name="l02505"></a><span class="lineno"> 2505</span> <span class="comment">// max(0, spans[vehicle] - bound_cost.bound)^2 * bound_cost.cost.</span></div>
|
|
<div class="line"><a id="l02506" name="l02506"></a><span class="lineno"> 2506</span> <a class="code hl_class" href="classoperations__research_1_1_int_expr.html">IntExpr</a>* max0 = solver_->MakeMax(</div>
|
|
<div class="line"><a id="l02507" name="l02507"></a><span class="lineno"> 2507</span> solver_->MakeSum(spans[vehicle], -bound_cost.bound), 0);</div>
|
|
<div class="line"><a id="l02508" name="l02508"></a><span class="lineno"> 2508</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> squared_span_violation_amount =</div>
|
|
<div class="line"><a id="l02509" name="l02509"></a><span class="lineno"> 2509</span> solver_</div>
|
|
<div class="line"><a id="l02510" name="l02510"></a><span class="lineno"> 2510</span> ->MakeProd(vehicle_costs_considered_[vehicle],</div>
|
|
<div class="line"><a id="l02511" name="l02511"></a><span class="lineno"> 2511</span> solver_->MakeSquare(max0))</div>
|
|
<div class="line"><a id="l02512" name="l02512"></a><span class="lineno"> 2512</span> ->Var();</div>
|
|
<div class="line"><a id="l02513" name="l02513"></a><span class="lineno"> 2513</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> span_violation_cost =</div>
|
|
<div class="line"><a id="l02514" name="l02514"></a><span class="lineno"> 2514</span> solver_->MakeProd(squared_span_violation_amount, bound_cost.cost)</div>
|
|
<div class="line"><a id="l02515" name="l02515"></a><span class="lineno"> 2515</span> ->Var();</div>
|
|
<div class="line"><a id="l02516" name="l02516"></a><span class="lineno"> 2516</span> cost_elements.push_back(span_violation_cost);</div>
|
|
<div class="line"><a id="l02517" name="l02517"></a><span class="lineno"> 2517</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab81fff41f3dde630902e1c4e2f534732">AddWeightedVariableMinimizedByFinalizer</a>(squared_span_violation_amount,</div>
|
|
<div class="line"><a id="l02518" name="l02518"></a><span class="lineno"> 2518</span> bound_cost.cost);</div>
|
|
<div class="line"><a id="l02519" name="l02519"></a><span class="lineno"> 2519</span> }</div>
|
|
<div class="line"><a id="l02520" name="l02520"></a><span class="lineno"> 2520</span> }</div>
|
|
<div class="line"><a id="l02521" name="l02521"></a><span class="lineno"> 2521</span> }</div>
|
|
<div class="line"><a id="l02522" name="l02522"></a><span class="lineno"> 2522</span> }</div>
|
|
<div class="line"><a id="l02523" name="l02523"></a><span class="lineno"> 2523</span> <span class="comment">// Penalty costs</span></div>
|
|
<div class="line"><a id="l02524" name="l02524"></a><span class="lineno"> 2524</span> <span class="keywordflow">for</span> (<a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#afa7cbbd4db2dd5d0bec3393efc9ebac1">DisjunctionIndex</a> i(0); i < disjunctions_.size(); ++i) {</div>
|
|
<div class="line"><a id="l02525" name="l02525"></a><span class="lineno"> 2525</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* penalty_var = CreateDisjunction(i);</div>
|
|
<div class="line"><a id="l02526" name="l02526"></a><span class="lineno"> 2526</span> <span class="keywordflow">if</span> (penalty_var != <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l02527" name="l02527"></a><span class="lineno"> 2527</span> cost_elements.push_back(penalty_var);</div>
|
|
<div class="line"><a id="l02528" name="l02528"></a><span class="lineno"> 2528</span> }</div>
|
|
<div class="line"><a id="l02529" name="l02529"></a><span class="lineno"> 2529</span> }</div>
|
|
<div class="line"><a id="l02530" name="l02530"></a><span class="lineno"> 2530</span> <span class="comment">// Soft cumul lower/upper bound costs</span></div>
|
|
<div class="line"><a id="l02531" name="l02531"></a><span class="lineno"> 2531</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* dimension : dimensions_) {</div>
|
|
<div class="line"><a id="l02532" name="l02532"></a><span class="lineno"> 2532</span> dimension->SetupCumulVarSoftLowerBoundCosts(&cost_elements);</div>
|
|
<div class="line"><a id="l02533" name="l02533"></a><span class="lineno"> 2533</span> dimension->SetupCumulVarSoftUpperBoundCosts(&cost_elements);</div>
|
|
<div class="line"><a id="l02534" name="l02534"></a><span class="lineno"> 2534</span> dimension->SetupCumulVarPiecewiseLinearCosts(&cost_elements);</div>
|
|
<div class="line"><a id="l02535" name="l02535"></a><span class="lineno"> 2535</span> }</div>
|
|
<div class="line"><a id="l02536" name="l02536"></a><span class="lineno"> 2536</span> <span class="comment">// Same vehicle costs</span></div>
|
|
<div class="line"><a id="l02537" name="l02537"></a><span class="lineno"> 2537</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < same_vehicle_costs_.size(); ++i) {</div>
|
|
<div class="line"><a id="l02538" name="l02538"></a><span class="lineno"> 2538</span> cost_elements.push_back(CreateSameVehicleCost(i));</div>
|
|
<div class="line"><a id="l02539" name="l02539"></a><span class="lineno"> 2539</span> }</div>
|
|
<div class="line"><a id="l02540" name="l02540"></a><span class="lineno"> 2540</span> cost_ = solver_->MakeSum(cost_elements)->Var();</div>
|
|
<div class="line"><a id="l02541" name="l02541"></a><span class="lineno"> 2541</span> cost_->set_name(<span class="stringliteral">"Cost"</span>);</div>
|
|
<div class="line"><a id="l02542" name="l02542"></a><span class="lineno"> 2542</span> </div>
|
|
<div class="line"><a id="l02543" name="l02543"></a><span class="lineno"> 2543</span> <span class="comment">// Pickup-delivery precedences</span></div>
|
|
<div class="line"><a id="l02544" name="l02544"></a><span class="lineno"> 2544</span> std::vector<std::pair<int, int>> pickup_delivery_precedences;</div>
|
|
<div class="line"><a id="l02545" name="l02545"></a><span class="lineno"> 2545</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>& pair : pickup_delivery_pairs_) {</div>
|
|
<div class="line"><a id="l02546" name="l02546"></a><span class="lineno"> 2546</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(!pair.first.empty() && !pair.second.empty());</div>
|
|
<div class="line"><a id="l02547" name="l02547"></a><span class="lineno"> 2547</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> pickup : pair.first) {</div>
|
|
<div class="line"><a id="l02548" name="l02548"></a><span class="lineno"> 2548</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> delivery : pair.second) {</div>
|
|
<div class="line"><a id="l02549" name="l02549"></a><span class="lineno"> 2549</span> pickup_delivery_precedences.emplace_back(pickup, delivery);</div>
|
|
<div class="line"><a id="l02550" name="l02550"></a><span class="lineno"> 2550</span> }</div>
|
|
<div class="line"><a id="l02551" name="l02551"></a><span class="lineno"> 2551</span> }</div>
|
|
<div class="line"><a id="l02552" name="l02552"></a><span class="lineno"> 2552</span> }</div>
|
|
<div class="line"><a id="l02553" name="l02553"></a><span class="lineno"> 2553</span> std::vector<int> lifo_vehicles;</div>
|
|
<div class="line"><a id="l02554" name="l02554"></a><span class="lineno"> 2554</span> std::vector<int> fifo_vehicles;</div>
|
|
<div class="line"><a id="l02555" name="l02555"></a><span class="lineno"> 2555</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < vehicles_; ++i) {</div>
|
|
<div class="line"><a id="l02556" name="l02556"></a><span class="lineno"> 2556</span> <span class="keywordflow">switch</span> (vehicle_pickup_delivery_policy_[i]) {</div>
|
|
<div class="line"><a id="l02557" name="l02557"></a><span class="lineno"> 2557</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83a2fecd02405f5ff0769292822ad17a955">PICKUP_AND_DELIVERY_NO_ORDER</a>:</div>
|
|
<div class="line"><a id="l02558" name="l02558"></a><span class="lineno"> 2558</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l02559" name="l02559"></a><span class="lineno"> 2559</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83a272376ed085de7d28d36fa1013394cc8">PICKUP_AND_DELIVERY_LIFO</a>:</div>
|
|
<div class="line"><a id="l02560" name="l02560"></a><span class="lineno"> 2560</span> lifo_vehicles.push_back(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(i));</div>
|
|
<div class="line"><a id="l02561" name="l02561"></a><span class="lineno"> 2561</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l02562" name="l02562"></a><span class="lineno"> 2562</span> <span class="keywordflow">case</span> <a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83a5c55a9aa52a754be8eb1b9d29af97a8a">PICKUP_AND_DELIVERY_FIFO</a>:</div>
|
|
<div class="line"><a id="l02563" name="l02563"></a><span class="lineno"> 2563</span> fifo_vehicles.push_back(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(i));</div>
|
|
<div class="line"><a id="l02564" name="l02564"></a><span class="lineno"> 2564</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l02565" name="l02565"></a><span class="lineno"> 2565</span> }</div>
|
|
<div class="line"><a id="l02566" name="l02566"></a><span class="lineno"> 2566</span> }</div>
|
|
<div class="line"><a id="l02567" name="l02567"></a><span class="lineno"> 2567</span> solver_->AddConstraint(solver_->MakePathPrecedenceConstraint(</div>
|
|
<div class="line"><a id="l02568" name="l02568"></a><span class="lineno"> 2568</span> nexts_, pickup_delivery_precedences, lifo_vehicles, fifo_vehicles));</div>
|
|
<div class="line"><a id="l02569" name="l02569"></a><span class="lineno"> 2569</span> </div>
|
|
<div class="line"><a id="l02570" name="l02570"></a><span class="lineno"> 2570</span> <span class="comment">// Detect constraints</span></div>
|
|
<div class="line"><a id="l02571" name="l02571"></a><span class="lineno"> 2571</span> enable_deep_serialization_ = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l02572" name="l02572"></a><span class="lineno"> 2572</span> std::unique_ptr<RoutingModelInspector> inspector(</div>
|
|
<div class="line"><a id="l02573" name="l02573"></a><span class="lineno"> 2573</span> <span class="keyword">new</span> <a class="code hl_friend" href="classoperations__research_1_1_routing_model.html#a00141bd90e555aea59a9e98cfbcda6eb">RoutingModelInspector</a>(<span class="keyword">this</span>));</div>
|
|
<div class="line"><a id="l02574" name="l02574"></a><span class="lineno"> 2574</span> solver_->Accept(inspector.get());</div>
|
|
<div class="line"><a id="l02575" name="l02575"></a><span class="lineno"> 2575</span> enable_deep_serialization_ = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l02576" name="l02576"></a><span class="lineno"> 2576</span> </div>
|
|
<div class="line"><a id="l02577" name="l02577"></a><span class="lineno"> 2577</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* <span class="keyword">const</span> dimension : dimensions_) {</div>
|
|
<div class="line"><a id="l02578" name="l02578"></a><span class="lineno"> 2578</span> <span class="comment">// Dimension path precedences, discovered by model inspection (which must be</span></div>
|
|
<div class="line"><a id="l02579" name="l02579"></a><span class="lineno"> 2579</span> <span class="comment">// performed before adding path transit precedences).</span></div>
|
|
<div class="line"><a id="l02580" name="l02580"></a><span class="lineno"> 2580</span> <span class="keyword">const</span> <a class="code hl_class" href="classutil_1_1_reverse_arc_list_graph.html">ReverseArcListGraph<int, int></a>& graph =</div>
|
|
<div class="line"><a id="l02581" name="l02581"></a><span class="lineno"> 2581</span> dimension->GetPathPrecedenceGraph();</div>
|
|
<div class="line"><a id="l02582" name="l02582"></a><span class="lineno"> 2582</span> std::vector<std::pair<int, int>> path_precedences;</div>
|
|
<div class="line"><a id="l02583" name="l02583"></a><span class="lineno"> 2583</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> <a class="code hl_variable" href="routing__flow_8cc.html#a64e7efc5529154ba56903e75f5300990">tail</a> : graph.<a class="code hl_function" href="classutil_1_1_base_graph.html#a8a40f2c75615a26ba71e94dd7d42f481">AllNodes</a>()) {</div>
|
|
<div class="line"><a id="l02584" name="l02584"></a><span class="lineno"> 2584</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> <a class="code hl_variable" href="routing__flow_8cc.html#afca32f65388659a4b0956496169488b4">head</a> : graph[<a class="code hl_variable" href="routing__flow_8cc.html#a64e7efc5529154ba56903e75f5300990">tail</a>]) {</div>
|
|
<div class="line"><a id="l02585" name="l02585"></a><span class="lineno"> 2585</span> path_precedences.emplace_back(<a class="code hl_variable" href="routing__flow_8cc.html#a64e7efc5529154ba56903e75f5300990">tail</a>, <a class="code hl_variable" href="routing__flow_8cc.html#afca32f65388659a4b0956496169488b4">head</a>);</div>
|
|
<div class="line"><a id="l02586" name="l02586"></a><span class="lineno"> 2586</span> }</div>
|
|
<div class="line"><a id="l02587" name="l02587"></a><span class="lineno"> 2587</span> }</div>
|
|
<div class="line"><a id="l02588" name="l02588"></a><span class="lineno"> 2588</span> <span class="keywordflow">if</span> (!path_precedences.empty()) {</div>
|
|
<div class="line"><a id="l02589" name="l02589"></a><span class="lineno"> 2589</span> solver_->AddConstraint(solver_->MakePathTransitPrecedenceConstraint(</div>
|
|
<div class="line"><a id="l02590" name="l02590"></a><span class="lineno"> 2590</span> nexts_, dimension->transits(), path_precedences));</div>
|
|
<div class="line"><a id="l02591" name="l02591"></a><span class="lineno"> 2591</span> }</div>
|
|
<div class="line"><a id="l02592" name="l02592"></a><span class="lineno"> 2592</span> </div>
|
|
<div class="line"><a id="l02593" name="l02593"></a><span class="lineno"> 2593</span> <span class="comment">// Dimension node precedences.</span></div>
|
|
<div class="line"><a id="l02594" name="l02594"></a><span class="lineno"> 2594</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1_routing_dimension_1_1_node_precedence.html">RoutingDimension::NodePrecedence</a>& node_precedence :</div>
|
|
<div class="line"><a id="l02595" name="l02595"></a><span class="lineno"> 2595</span> dimension->GetNodePrecedences()) {</div>
|
|
<div class="line"><a id="l02596" name="l02596"></a><span class="lineno"> 2596</span> <span class="keyword">const</span> int64_t first_node = node_precedence.first_node;</div>
|
|
<div class="line"><a id="l02597" name="l02597"></a><span class="lineno"> 2597</span> <span class="keyword">const</span> int64_t second_node = node_precedence.second_node;</div>
|
|
<div class="line"><a id="l02598" name="l02598"></a><span class="lineno"> 2598</span> <a class="code hl_class" href="classoperations__research_1_1_int_expr.html">IntExpr</a>* <span class="keyword">const</span> nodes_are_selected =</div>
|
|
<div class="line"><a id="l02599" name="l02599"></a><span class="lineno"> 2599</span> solver_->MakeMin(active_[first_node], active_[second_node]);</div>
|
|
<div class="line"><a id="l02600" name="l02600"></a><span class="lineno"> 2600</span> <a class="code hl_class" href="classoperations__research_1_1_int_expr.html">IntExpr</a>* <span class="keyword">const</span> cumul_difference = solver_->MakeDifference(</div>
|
|
<div class="line"><a id="l02601" name="l02601"></a><span class="lineno"> 2601</span> dimension->CumulVar(second_node), dimension->CumulVar(first_node));</div>
|
|
<div class="line"><a id="l02602" name="l02602"></a><span class="lineno"> 2602</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> cumul_difference_is_ge_offset =</div>
|
|
<div class="line"><a id="l02603" name="l02603"></a><span class="lineno"> 2603</span> solver_->MakeIsGreaterOrEqualCstVar(cumul_difference,</div>
|
|
<div class="line"><a id="l02604" name="l02604"></a><span class="lineno"> 2604</span> node_precedence.offset);</div>
|
|
<div class="line"><a id="l02605" name="l02605"></a><span class="lineno"> 2605</span> <span class="comment">// Forces the implication: both nodes are active => cumul difference</span></div>
|
|
<div class="line"><a id="l02606" name="l02606"></a><span class="lineno"> 2606</span> <span class="comment">// constraint is active.</span></div>
|
|
<div class="line"><a id="l02607" name="l02607"></a><span class="lineno"> 2607</span> solver_->AddConstraint(solver_->MakeLessOrEqual(</div>
|
|
<div class="line"><a id="l02608" name="l02608"></a><span class="lineno"> 2608</span> nodes_are_selected-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#a8a1d9ddd5f5fc8f2a02b8a8700d3e3b1">Var</a>(), cumul_difference_is_ge_offset));</div>
|
|
<div class="line"><a id="l02609" name="l02609"></a><span class="lineno"> 2609</span> }</div>
|
|
<div class="line"><a id="l02610" name="l02610"></a><span class="lineno"> 2610</span> }</div>
|
|
<div class="line"><a id="l02611" name="l02611"></a><span class="lineno"> 2611</span> </div>
|
|
<div class="line"><a id="l02612" name="l02612"></a><span class="lineno"> 2612</span> DetectImplicitPickupAndDeliveries();</div>
|
|
<div class="line"><a id="l02613" name="l02613"></a><span class="lineno"> 2613</span> </div>
|
|
<div class="line"><a id="l02614" name="l02614"></a><span class="lineno"> 2614</span> <span class="comment">// Store the local/global cumul optimizers, along with their offsets.</span></div>
|
|
<div class="line"><a id="l02615" name="l02615"></a><span class="lineno"> 2615</span> StoreDimensionCumulOptimizers(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>);</div>
|
|
<div class="line"><a id="l02616" name="l02616"></a><span class="lineno"> 2616</span> </div>
|
|
<div class="line"><a id="l02617" name="l02617"></a><span class="lineno"> 2617</span> <span class="comment">// Keep this out of SetupSearch as this contains static search objects.</span></div>
|
|
<div class="line"><a id="l02618" name="l02618"></a><span class="lineno"> 2618</span> <span class="comment">// This will allow calling SetupSearch multiple times with different search</span></div>
|
|
<div class="line"><a id="l02619" name="l02619"></a><span class="lineno"> 2619</span> <span class="comment">// parameters.</span></div>
|
|
<div class="line"><a id="l02620" name="l02620"></a><span class="lineno"> 2620</span> CreateNeighborhoodOperators(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>);</div>
|
|
<div class="line"><a id="l02621" name="l02621"></a><span class="lineno"> 2621</span> CreateFirstSolutionDecisionBuilders(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>);</div>
|
|
<div class="line"><a id="l02622" name="l02622"></a><span class="lineno"> 2622</span> error = FindErrorInSearchParametersForModel(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>);</div>
|
|
<div class="line"><a id="l02623" name="l02623"></a><span class="lineno"> 2623</span> <span class="keywordflow">if</span> (!error.empty()) {</div>
|
|
<div class="line"><a id="l02624" name="l02624"></a><span class="lineno"> 2624</span> status_ = <a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70bae78ffdfdfc3eb7331c0ef91bdef8452b">ROUTING_INVALID</a>;</div>
|
|
<div class="line"><a id="l02625" name="l02625"></a><span class="lineno"> 2625</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67">ERROR</a>) << <span class="stringliteral">"Invalid RoutingSearchParameters for this model: "</span> << error;</div>
|
|
<div class="line"><a id="l02626" name="l02626"></a><span class="lineno"> 2626</span> <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l02627" name="l02627"></a><span class="lineno"> 2627</span> }</div>
|
|
<div class="line"><a id="l02628" name="l02628"></a><span class="lineno"> 2628</span> SetupSearch(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>);</div>
|
|
<div class="line"><a id="l02629" name="l02629"></a><span class="lineno"> 2629</span>}</div>
|
|
<div class="line"><a id="l02630" name="l02630"></a><span class="lineno"> 2630</span> </div>
|
|
<div class="line"><a id="l02631" name="l02631"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a0e23be986e4c3b96a50c8798aa5f536d"> 2631</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0e23be986e4c3b96a50c8798aa5f536d">RoutingModel::AddSearchMonitor</a>(<a class="code hl_class" href="classoperations__research_1_1_search_monitor.html">SearchMonitor</a>* <span class="keyword">const</span> monitor) {</div>
|
|
<div class="line"><a id="l02632" name="l02632"></a><span class="lineno"> 2632</span> monitors_.push_back(monitor);</div>
|
|
<div class="line"><a id="l02633" name="l02633"></a><span class="lineno"> 2633</span>}</div>
|
|
<div class="line"><a id="l02634" name="l02634"></a><span class="lineno"> 2634</span> </div>
|
|
<div class="line"><a id="l02635" name="l02635"></a><span class="lineno"> 2635</span><span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a id="l02636" name="l02636"></a><span class="lineno"> 2636</span><span class="keyword">class </span>AtSolutionCallbackMonitor : <span class="keyword">public</span> <a class="code hl_class" href="classoperations__research_1_1_search_monitor.html">SearchMonitor</a> {</div>
|
|
<div class="line"><a id="l02637" name="l02637"></a><span class="lineno"> 2637</span> <span class="keyword">public</span>:</div>
|
|
<div class="line"><a id="l02638" name="l02638"></a><span class="lineno"> 2638</span> AtSolutionCallbackMonitor(<a class="code hl_class" href="classoperations__research_1_1_solver.html">Solver</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>, std::function<<span class="keywordtype">void</span>()> <a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>)</div>
|
|
<div class="line"><a id="l02639" name="l02639"></a><span class="lineno"> 2639</span> : <a class="code hl_class" href="classoperations__research_1_1_search_monitor.html">SearchMonitor</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>), callback_(<a class="code hl_namespace" href="namespacestd.html">std</a>::move(<a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>)) {}</div>
|
|
<div class="line"><a id="l02640" name="l02640"></a><span class="lineno"> 2640</span> <span class="keywordtype">bool</span> AtSolution()<span class="keyword"> override </span>{</div>
|
|
<div class="line"><a id="l02641" name="l02641"></a><span class="lineno"> 2641</span> callback_();</div>
|
|
<div class="line"><a id="l02642" name="l02642"></a><span class="lineno"> 2642</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l02643" name="l02643"></a><span class="lineno"> 2643</span> }</div>
|
|
<div class="line"><a id="l02644" name="l02644"></a><span class="lineno"> 2644</span> </div>
|
|
<div class="line"><a id="l02645" name="l02645"></a><span class="lineno"> 2645</span> <span class="keyword">private</span>:</div>
|
|
<div class="line"><a id="l02646" name="l02646"></a><span class="lineno"> 2646</span> std::function<void()> callback_;</div>
|
|
<div class="line"><a id="l02647" name="l02647"></a><span class="lineno"> 2647</span>};</div>
|
|
<div class="line"><a id="l02648" name="l02648"></a><span class="lineno"> 2648</span>} <span class="comment">// namespace</span></div>
|
|
<div class="line"><a id="l02649" name="l02649"></a><span class="lineno"> 2649</span> </div>
|
|
<div class="line"><a id="l02650" name="l02650"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a086605d9650ce3c576d8a9c45ce0b9fc"> 2650</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a086605d9650ce3c576d8a9c45ce0b9fc">RoutingModel::AddAtSolutionCallback</a>(std::function<<span class="keywordtype">void</span>()> <a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>) {</div>
|
|
<div class="line"><a id="l02651" name="l02651"></a><span class="lineno"> 2651</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0e23be986e4c3b96a50c8798aa5f536d">AddSearchMonitor</a>(solver_->RevAlloc(</div>
|
|
<div class="line"><a id="l02652" name="l02652"></a><span class="lineno"> 2652</span> <span class="keyword">new</span> AtSolutionCallbackMonitor(solver_.get(), std::move(<a class="code hl_variable" href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a>))));</div>
|
|
<div class="line"><a id="l02653" name="l02653"></a><span class="lineno"> 2653</span>}</div>
|
|
<div class="line"><a id="l02654" name="l02654"></a><span class="lineno"> 2654</span> </div>
|
|
<div class="line"><a id="l02655" name="l02655"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#ae3bb9f7055b5dabd24e2ea7c6a377a6a"> 2655</a></span><span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ae3bb9f7055b5dabd24e2ea7c6a377a6a">RoutingModel::Solve</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* assignment) {</div>
|
|
<div class="line"><a id="l02656" name="l02656"></a><span class="lineno"> 2656</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a674ab7782c46ba72034c73932b1dbd38">SolveFromAssignmentWithParameters</a>(assignment,</div>
|
|
<div class="line"><a id="l02657" name="l02657"></a><span class="lineno"> 2657</span> <a class="code hl_function" href="namespaceoperations__research.html#ab59d4ce2b572e1ae576d2aa181433187">DefaultRoutingSearchParameters</a>());</div>
|
|
<div class="line"><a id="l02658" name="l02658"></a><span class="lineno"> 2658</span>}</div>
|
|
<div class="line"><a id="l02659" name="l02659"></a><span class="lineno"> 2659</span> </div>
|
|
<div class="line"><a id="l02660" name="l02660"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a8c5267a8f35e062c163b61bcae31857b"> 2660</a></span><span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8c5267a8f35e062c163b61bcae31857b">RoutingModel::SolveWithParameters</a>(</div>
|
|
<div class="line"><a id="l02661" name="l02661"></a><span class="lineno"> 2661</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_search_parameters.html">RoutingSearchParameters</a>& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>,</div>
|
|
<div class="line"><a id="l02662" name="l02662"></a><span class="lineno"> 2662</span> std::vector<const Assignment*>* solutions) {</div>
|
|
<div class="line"><a id="l02663" name="l02663"></a><span class="lineno"> 2663</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a674ab7782c46ba72034c73932b1dbd38">SolveFromAssignmentWithParameters</a>(<span class="keyword">nullptr</span>, <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>, solutions);</div>
|
|
<div class="line"><a id="l02664" name="l02664"></a><span class="lineno"> 2664</span>}</div>
|
|
<div class="line"><a id="l02665" name="l02665"></a><span class="lineno"> 2665</span> </div>
|
|
<div class="line"><a id="l02666" name="l02666"></a><span class="lineno"> 2666</span><span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a id="l02667" name="l02667"></a><span class="lineno"> 2667</span>absl::Duration GetTimeLimit(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_search_parameters.html">RoutingSearchParameters</a>& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>) {</div>
|
|
<div class="line"><a id="l02668" name="l02668"></a><span class="lineno"> 2668</span> <span class="keywordflow">if</span> (!<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.has_time_limit()) <span class="keywordflow">return</span> absl::InfiniteDuration();</div>
|
|
<div class="line"><a id="l02669" name="l02669"></a><span class="lineno"> 2669</span> <span class="keywordflow">return</span> <a class="code hl_function" href="namespaceutil__time.html#a801584734c5b3898f94cf932202b2eb7">util_time::DecodeGoogleApiProto</a>(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.time_limit()).value();</div>
|
|
<div class="line"><a id="l02670" name="l02670"></a><span class="lineno"> 2670</span>}</div>
|
|
<div class="line"><a id="l02671" name="l02671"></a><span class="lineno"> 2671</span> </div>
|
|
<div class="line"><a id="l02672" name="l02672"></a><span class="lineno"> 2672</span>absl::Duration GetLnsTimeLimit(<span class="keyword">const</span> RoutingSearchParameters& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>) {</div>
|
|
<div class="line"><a id="l02673" name="l02673"></a><span class="lineno"> 2673</span> <span class="keywordflow">if</span> (!<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.has_lns_time_limit()) <span class="keywordflow">return</span> absl::InfiniteDuration();</div>
|
|
<div class="line"><a id="l02674" name="l02674"></a><span class="lineno"> 2674</span> <span class="keywordflow">return</span> <a class="code hl_function" href="namespaceutil__time.html#a801584734c5b3898f94cf932202b2eb7">util_time::DecodeGoogleApiProto</a>(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.lns_time_limit()).value();</div>
|
|
<div class="line"><a id="l02675" name="l02675"></a><span class="lineno"> 2675</span>}</div>
|
|
<div class="line"><a id="l02676" name="l02676"></a><span class="lineno"> 2676</span> </div>
|
|
<div class="line"><a id="l02677" name="l02677"></a><span class="lineno"> 2677</span>} <span class="comment">// namespace</span></div>
|
|
<div class="line"><a id="l02678" name="l02678"></a><span class="lineno"> 2678</span> </div>
|
|
<div class="line"><a id="l02679" name="l02679"></a><span class="lineno"> 2679</span><span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a id="l02680" name="l02680"></a><span class="lineno"> 2680</span><span class="keywordtype">void</span> MakeAllUnperformedInAssignment(<span class="keyword">const</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#af12674b693b7b7cfe271e5b066e10bff">RoutingModel</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>,</div>
|
|
<div class="line"><a id="l02681" name="l02681"></a><span class="lineno"> 2681</span> Assignment* assignment) {</div>
|
|
<div class="line"><a id="l02682" name="l02682"></a><span class="lineno"> 2682</span> assignment->Clear();</div>
|
|
<div class="line"><a id="l02683" name="l02683"></a><span class="lineno"> 2683</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->Nexts().size(); ++i) {</div>
|
|
<div class="line"><a id="l02684" name="l02684"></a><span class="lineno"> 2684</span> <span class="keywordflow">if</span> (!<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->IsStart(i)) {</div>
|
|
<div class="line"><a id="l02685" name="l02685"></a><span class="lineno"> 2685</span> assignment->Add(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->NextVar(i))->SetValue(i);</div>
|
|
<div class="line"><a id="l02686" name="l02686"></a><span class="lineno"> 2686</span> }</div>
|
|
<div class="line"><a id="l02687" name="l02687"></a><span class="lineno"> 2687</span> }</div>
|
|
<div class="line"><a id="l02688" name="l02688"></a><span class="lineno"> 2688</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->vehicles(); ++vehicle) {</div>
|
|
<div class="line"><a id="l02689" name="l02689"></a><span class="lineno"> 2689</span> assignment->Add(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->NextVar(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->Start(vehicle)))</div>
|
|
<div class="line"><a id="l02690" name="l02690"></a><span class="lineno"> 2690</span> ->SetValue(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->End(vehicle));</div>
|
|
<div class="line"><a id="l02691" name="l02691"></a><span class="lineno"> 2691</span> }</div>
|
|
<div class="line"><a id="l02692" name="l02692"></a><span class="lineno"> 2692</span>}</div>
|
|
<div class="line"><a id="l02693" name="l02693"></a><span class="lineno"> 2693</span>} <span class="comment">// namespace</span></div>
|
|
<div class="line"><a id="l02694" name="l02694"></a><span class="lineno"> 2694</span> </div>
|
|
<div class="line"><a id="l02695" name="l02695"></a><span class="lineno"> 2695</span><span class="keywordtype">bool</span> RoutingModel::AppendAssignmentIfFeasible(</div>
|
|
<div class="line"><a id="l02696" name="l02696"></a><span class="lineno"> 2696</span> <span class="keyword">const</span> Assignment& assignment,</div>
|
|
<div class="line"><a id="l02697" name="l02697"></a><span class="lineno"> 2697</span> std::vector<std::unique_ptr<Assignment>>* assignments) {</div>
|
|
<div class="line"><a id="l02698" name="l02698"></a><span class="lineno"> 2698</span> tmp_assignment_->CopyIntersection(&assignment);</div>
|
|
<div class="line"><a id="l02699" name="l02699"></a><span class="lineno"> 2699</span> solver_->Solve(restore_tmp_assignment_, collect_one_assignment_,</div>
|
|
<div class="line"><a id="l02700" name="l02700"></a><span class="lineno"> 2700</span> GetOrCreateLimit());</div>
|
|
<div class="line"><a id="l02701" name="l02701"></a><span class="lineno"> 2701</span> <span class="keywordflow">if</span> (collect_one_assignment_->solution_count() == 1) {</div>
|
|
<div class="line"><a id="l02702" name="l02702"></a><span class="lineno"> 2702</span> assignments->push_back(absl::make_unique<Assignment>(solver_.get()));</div>
|
|
<div class="line"><a id="l02703" name="l02703"></a><span class="lineno"> 2703</span> assignments->back()->Copy(collect_one_assignment_->solution(0));</div>
|
|
<div class="line"><a id="l02704" name="l02704"></a><span class="lineno"> 2704</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l02705" name="l02705"></a><span class="lineno"> 2705</span> }</div>
|
|
<div class="line"><a id="l02706" name="l02706"></a><span class="lineno"> 2706</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l02707" name="l02707"></a><span class="lineno"> 2707</span>}</div>
|
|
<div class="line"><a id="l02708" name="l02708"></a><span class="lineno"> 2708</span> </div>
|
|
<div class="line"><a id="l02709" name="l02709"></a><span class="lineno"> 2709</span><span class="keywordtype">void</span> RoutingModel::LogSolution(<span class="keyword">const</span> RoutingSearchParameters& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>,</div>
|
|
<div class="line"><a id="l02710" name="l02710"></a><span class="lineno"> 2710</span> <span class="keyword">const</span> std::string& description,</div>
|
|
<div class="line"><a id="l02711" name="l02711"></a><span class="lineno"> 2711</span> int64_t solution_cost, int64_t start_time_ms) {</div>
|
|
<div class="line"><a id="l02712" name="l02712"></a><span class="lineno"> 2712</span> <span class="keyword">const</span> std::string memory_str = <a class="code hl_function" href="namespaceoperations__research.html#acb92bdbce12d475f965f6db3c5f5b7b5">MemoryUsage</a>();</div>
|
|
<div class="line"><a id="l02713" name="l02713"></a><span class="lineno"> 2713</span> <span class="keyword">const</span> <span class="keywordtype">double</span> cost_scaling_factor = <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.log_cost_scaling_factor();</div>
|
|
<div class="line"><a id="l02714" name="l02714"></a><span class="lineno"> 2714</span> <span class="keyword">const</span> <span class="keywordtype">double</span> cost_offset = <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.log_cost_offset();</div>
|
|
<div class="line"><a id="l02715" name="l02715"></a><span class="lineno"> 2715</span> <span class="keyword">const</span> std::string cost_string =</div>
|
|
<div class="line"><a id="l02716" name="l02716"></a><span class="lineno"> 2716</span> cost_scaling_factor == 1.0 && cost_offset == 0.0</div>
|
|
<div class="line"><a id="l02717" name="l02717"></a><span class="lineno"> 2717</span> ? absl::StrCat(solution_cost)</div>
|
|
<div class="line"><a id="l02718" name="l02718"></a><span class="lineno"> 2718</span> : <a class="code hl_namespace" href="namespaceabsl.html">absl</a>::StrFormat(</div>
|
|
<div class="line"><a id="l02719" name="l02719"></a><span class="lineno"> 2719</span> <span class="stringliteral">"%d (%.8lf)"</span>, solution_cost,</div>
|
|
<div class="line"><a id="l02720" name="l02720"></a><span class="lineno"> 2720</span> cost_scaling_factor * (solution_cost + cost_offset));</div>
|
|
<div class="line"><a id="l02721" name="l02721"></a><span class="lineno"> 2721</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#ab4a2cbab234914b320b7fae11b6e8cb9">INFO</a>) << absl::StrFormat(</div>
|
|
<div class="line"><a id="l02722" name="l02722"></a><span class="lineno"> 2722</span> <span class="stringliteral">"%s (%s, time = %d ms, memory used = %s)"</span>, description, cost_string,</div>
|
|
<div class="line"><a id="l02723" name="l02723"></a><span class="lineno"> 2723</span> solver_->wall_time() - start_time_ms, memory_str);</div>
|
|
<div class="line"><a id="l02724" name="l02724"></a><span class="lineno"> 2724</span>}</div>
|
|
<div class="line"><a id="l02725" name="l02725"></a><span class="lineno"> 2725</span> </div>
|
|
<div class="line"><a id="l02726" name="l02726"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a674ab7782c46ba72034c73932b1dbd38"> 2726</a></span><span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a674ab7782c46ba72034c73932b1dbd38">RoutingModel::SolveFromAssignmentWithParameters</a>(</div>
|
|
<div class="line"><a id="l02727" name="l02727"></a><span class="lineno"> 2727</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* assignment, <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_search_parameters.html">RoutingSearchParameters</a>& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>,</div>
|
|
<div class="line"><a id="l02728" name="l02728"></a><span class="lineno"> 2728</span> std::vector<const Assignment*>* solutions) {</div>
|
|
<div class="line"><a id="l02729" name="l02729"></a><span class="lineno"> 2729</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a090a12711254bafc2cc797f8f6b21a8c">SolveFromAssignmentsWithParameters</a>({assignment}, <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>,</div>
|
|
<div class="line"><a id="l02730" name="l02730"></a><span class="lineno"> 2730</span> solutions);</div>
|
|
<div class="line"><a id="l02731" name="l02731"></a><span class="lineno"> 2731</span>}</div>
|
|
<div class="line"><a id="l02732" name="l02732"></a><span class="lineno"> 2732</span> </div>
|
|
<div class="line"><a id="l02733" name="l02733"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a090a12711254bafc2cc797f8f6b21a8c"> 2733</a></span><span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a090a12711254bafc2cc797f8f6b21a8c">RoutingModel::SolveFromAssignmentsWithParameters</a>(</div>
|
|
<div class="line"><a id="l02734" name="l02734"></a><span class="lineno"> 2734</span> <span class="keyword">const</span> std::vector<const Assignment*>& assignments,</div>
|
|
<div class="line"><a id="l02735" name="l02735"></a><span class="lineno"> 2735</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_search_parameters.html">RoutingSearchParameters</a>& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>,</div>
|
|
<div class="line"><a id="l02736" name="l02736"></a><span class="lineno"> 2736</span> std::vector<const Assignment*>* solutions) {</div>
|
|
<div class="line"><a id="l02737" name="l02737"></a><span class="lineno"> 2737</span> <span class="keyword">const</span> int64_t start_time_ms = solver_->wall_time();</div>
|
|
<div class="line"><a id="l02738" name="l02738"></a><span class="lineno"> 2738</span> QuietCloseModelWithParameters(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>);</div>
|
|
<div class="line"><a id="l02739" name="l02739"></a><span class="lineno"> 2739</span> <a class="code hl_define" href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a>(1) << <span class="stringliteral">"Search parameters:\n"</span> << <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.DebugString();</div>
|
|
<div class="line"><a id="l02740" name="l02740"></a><span class="lineno"> 2740</span> <span class="keywordflow">if</span> (solutions != <span class="keyword">nullptr</span>) solutions->clear();</div>
|
|
<div class="line"><a id="l02741" name="l02741"></a><span class="lineno"> 2741</span> <span class="keywordflow">if</span> (status_ == <a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70bae78ffdfdfc3eb7331c0ef91bdef8452b">ROUTING_INVALID</a>) {</div>
|
|
<div class="line"><a id="l02742" name="l02742"></a><span class="lineno"> 2742</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l02743" name="l02743"></a><span class="lineno"> 2743</span> }</div>
|
|
<div class="line"><a id="l02744" name="l02744"></a><span class="lineno"> 2744</span> <span class="keyword">const</span> <span class="keyword">auto</span> update_time_limits = [<span class="keyword">this</span>, start_time_ms, &<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>]() {</div>
|
|
<div class="line"><a id="l02745" name="l02745"></a><span class="lineno"> 2745</span> <span class="keyword">const</span> absl::Duration elapsed_time =</div>
|
|
<div class="line"><a id="l02746" name="l02746"></a><span class="lineno"> 2746</span> absl::Milliseconds(solver_->wall_time() - start_time_ms);</div>
|
|
<div class="line"><a id="l02747" name="l02747"></a><span class="lineno"> 2747</span> <span class="keyword">const</span> absl::Duration time_left = GetTimeLimit(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>) - elapsed_time;</div>
|
|
<div class="line"><a id="l02748" name="l02748"></a><span class="lineno"> 2748</span> <span class="keywordflow">if</span> (time_left >= absl::ZeroDuration()) {</div>
|
|
<div class="line"><a id="l02749" name="l02749"></a><span class="lineno"> 2749</span> <a class="code hl_variable" href="expressions_8cc.html#aae6e045630301833144e9075260cb2b9">limit_</a>->UpdateLimits(time_left, <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(),</div>
|
|
<div class="line"><a id="l02750" name="l02750"></a><span class="lineno"> 2750</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(),</div>
|
|
<div class="line"><a id="l02751" name="l02751"></a><span class="lineno"> 2751</span> <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.solution_limit());</div>
|
|
<div class="line"><a id="l02752" name="l02752"></a><span class="lineno"> 2752</span> ls_limit_->UpdateLimits(time_left, <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(),</div>
|
|
<div class="line"><a id="l02753" name="l02753"></a><span class="lineno"> 2753</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(), 1);</div>
|
|
<div class="line"><a id="l02754" name="l02754"></a><span class="lineno"> 2754</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l02755" name="l02755"></a><span class="lineno"> 2755</span> }</div>
|
|
<div class="line"><a id="l02756" name="l02756"></a><span class="lineno"> 2756</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l02757" name="l02757"></a><span class="lineno"> 2757</span> };</div>
|
|
<div class="line"><a id="l02758" name="l02758"></a><span class="lineno"> 2758</span> <span class="keywordflow">if</span> (!update_time_limits()) {</div>
|
|
<div class="line"><a id="l02759" name="l02759"></a><span class="lineno"> 2759</span> status_ = <a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70baf6452d79d02ab06bc8d722d25825cae3">ROUTING_FAIL_TIMEOUT</a>;</div>
|
|
<div class="line"><a id="l02760" name="l02760"></a><span class="lineno"> 2760</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l02761" name="l02761"></a><span class="lineno"> 2761</span> }</div>
|
|
<div class="line"><a id="l02762" name="l02762"></a><span class="lineno"> 2762</span> lns_limit_->UpdateLimits(</div>
|
|
<div class="line"><a id="l02763" name="l02763"></a><span class="lineno"> 2763</span> GetLnsTimeLimit(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>), <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(),</div>
|
|
<div class="line"><a id="l02764" name="l02764"></a><span class="lineno"> 2764</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(), <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>());</div>
|
|
<div class="line"><a id="l02765" name="l02765"></a><span class="lineno"> 2765</span> <span class="comment">// NOTE: Allow more time for the first solution's scheduling, since if it</span></div>
|
|
<div class="line"><a id="l02766" name="l02766"></a><span class="lineno"> 2766</span> <span class="comment">// fails, we won't have anything to build upon.</span></div>
|
|
<div class="line"><a id="l02767" name="l02767"></a><span class="lineno"> 2767</span> <span class="comment">// We set this time limit based on whether local/global dimension optimizers</span></div>
|
|
<div class="line"><a id="l02768" name="l02768"></a><span class="lineno"> 2768</span> <span class="comment">// are used in the finalizer to avoid going over the general time limit.</span></div>
|
|
<div class="line"><a id="l02769" name="l02769"></a><span class="lineno"> 2769</span> <span class="comment">// TODO(user): Adapt this when absolute timeouts are given to the model.</span></div>
|
|
<div class="line"><a id="l02770" name="l02770"></a><span class="lineno"> 2770</span> <span class="keyword">const</span> <span class="keywordtype">int</span> time_limit_shares = 1 + !global_dimension_optimizers_.empty() +</div>
|
|
<div class="line"><a id="l02771" name="l02771"></a><span class="lineno"> 2771</span> !local_dimension_optimizers_.empty();</div>
|
|
<div class="line"><a id="l02772" name="l02772"></a><span class="lineno"> 2772</span> <span class="keyword">const</span> absl::Duration first_solution_lns_time_limit =</div>
|
|
<div class="line"><a id="l02773" name="l02773"></a><span class="lineno"> 2773</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(GetTimeLimit(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>) / time_limit_shares,</div>
|
|
<div class="line"><a id="l02774" name="l02774"></a><span class="lineno"> 2774</span> GetLnsTimeLimit(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>));</div>
|
|
<div class="line"><a id="l02775" name="l02775"></a><span class="lineno"> 2775</span> first_solution_lns_limit_->UpdateLimits(</div>
|
|
<div class="line"><a id="l02776" name="l02776"></a><span class="lineno"> 2776</span> first_solution_lns_time_limit, <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(),</div>
|
|
<div class="line"><a id="l02777" name="l02777"></a><span class="lineno"> 2777</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(), <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>());</div>
|
|
<div class="line"><a id="l02778" name="l02778"></a><span class="lineno"> 2778</span> </div>
|
|
<div class="line"><a id="l02779" name="l02779"></a><span class="lineno"> 2779</span> std::vector<std::unique_ptr<Assignment>> solution_pool;</div>
|
|
<div class="line"><a id="l02780" name="l02780"></a><span class="lineno"> 2780</span> std::vector<const Assignment*> first_solution_assignments;</div>
|
|
<div class="line"><a id="l02781" name="l02781"></a><span class="lineno"> 2781</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* assignment : assignments) {</div>
|
|
<div class="line"><a id="l02782" name="l02782"></a><span class="lineno"> 2782</span> <span class="keywordflow">if</span> (assignment != <span class="keyword">nullptr</span>) first_solution_assignments.push_back(assignment);</div>
|
|
<div class="line"><a id="l02783" name="l02783"></a><span class="lineno"> 2783</span> }</div>
|
|
<div class="line"><a id="l02784" name="l02784"></a><span class="lineno"> 2784</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.use_cp() == <a class="code hl_enumvalue" href="namespaceoperations__research.html#ab13458305fa2eb87238ff66066eecd5da7149f32738efcef1bf4db3d635d804b0">BOOL_TRUE</a>) {</div>
|
|
<div class="line"><a id="l02785" name="l02785"></a><span class="lineno"> 2785</span> <span class="keywordflow">if</span> (first_solution_assignments.empty()) {</div>
|
|
<div class="line"><a id="l02786" name="l02786"></a><span class="lineno"> 2786</span> <span class="keywordtype">bool</span> solution_found = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l02787" name="l02787"></a><span class="lineno"> 2787</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a> matching(solver_.get());</div>
|
|
<div class="line"><a id="l02788" name="l02788"></a><span class="lineno"> 2788</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ac8347e84488d1b5eb7b5e6972fb32be3">IsMatchingModel</a>() && SolveMatchingModel(&matching, <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>) &&</div>
|
|
<div class="line"><a id="l02789" name="l02789"></a><span class="lineno"> 2789</span> AppendAssignmentIfFeasible(matching, &solution_pool)) {</div>
|
|
<div class="line"><a id="l02790" name="l02790"></a><span class="lineno"> 2790</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.log_search()) {</div>
|
|
<div class="line"><a id="l02791" name="l02791"></a><span class="lineno"> 2791</span> LogSolution(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>, <span class="stringliteral">"Min-Cost Flow Solution"</span>,</div>
|
|
<div class="line"><a id="l02792" name="l02792"></a><span class="lineno"> 2792</span> solution_pool.back()->ObjectiveValue(), start_time_ms);</div>
|
|
<div class="line"><a id="l02793" name="l02793"></a><span class="lineno"> 2793</span> }</div>
|
|
<div class="line"><a id="l02794" name="l02794"></a><span class="lineno"> 2794</span> solution_found = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l02795" name="l02795"></a><span class="lineno"> 2795</span> }</div>
|
|
<div class="line"><a id="l02796" name="l02796"></a><span class="lineno"> 2796</span> <span class="keywordflow">if</span> (!solution_found) {</div>
|
|
<div class="line"><a id="l02797" name="l02797"></a><span class="lineno"> 2797</span> <span class="comment">// Build trivial solutions to which we can come back too in case the</span></div>
|
|
<div class="line"><a id="l02798" name="l02798"></a><span class="lineno"> 2798</span> <span class="comment">// solver does not manage to build something better.</span></div>
|
|
<div class="line"><a id="l02799" name="l02799"></a><span class="lineno"> 2799</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a> unperformed(solver_.get());</div>
|
|
<div class="line"><a id="l02800" name="l02800"></a><span class="lineno"> 2800</span> MakeAllUnperformedInAssignment(<span class="keyword">this</span>, &unperformed);</div>
|
|
<div class="line"><a id="l02801" name="l02801"></a><span class="lineno"> 2801</span> <span class="keywordflow">if</span> (AppendAssignmentIfFeasible(unperformed, &solution_pool) &&</div>
|
|
<div class="line"><a id="l02802" name="l02802"></a><span class="lineno"> 2802</span> <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.log_search()) {</div>
|
|
<div class="line"><a id="l02803" name="l02803"></a><span class="lineno"> 2803</span> LogSolution(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>, <span class="stringliteral">"All Unperformed Solution"</span>,</div>
|
|
<div class="line"><a id="l02804" name="l02804"></a><span class="lineno"> 2804</span> solution_pool.back()->ObjectiveValue(), start_time_ms);</div>
|
|
<div class="line"><a id="l02805" name="l02805"></a><span class="lineno"> 2805</span> }</div>
|
|
<div class="line"><a id="l02806" name="l02806"></a><span class="lineno"> 2806</span> <span class="keywordflow">if</span> (update_time_limits()) {</div>
|
|
<div class="line"><a id="l02807" name="l02807"></a><span class="lineno"> 2807</span> solver_->Solve(solve_db_, monitors_);</div>
|
|
<div class="line"><a id="l02808" name="l02808"></a><span class="lineno"> 2808</span> }</div>
|
|
<div class="line"><a id="l02809" name="l02809"></a><span class="lineno"> 2809</span> }</div>
|
|
<div class="line"><a id="l02810" name="l02810"></a><span class="lineno"> 2810</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l02811" name="l02811"></a><span class="lineno"> 2811</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* assignment : first_solution_assignments) {</div>
|
|
<div class="line"><a id="l02812" name="l02812"></a><span class="lineno"> 2812</span> assignment_->CopyIntersection(assignment);</div>
|
|
<div class="line"><a id="l02813" name="l02813"></a><span class="lineno"> 2813</span> solver_->Solve(improve_db_, monitors_);</div>
|
|
<div class="line"><a id="l02814" name="l02814"></a><span class="lineno"> 2814</span> <span class="keywordflow">if</span> (collect_assignments_->solution_count() >= 1 ||</div>
|
|
<div class="line"><a id="l02815" name="l02815"></a><span class="lineno"> 2815</span> !update_time_limits()) {</div>
|
|
<div class="line"><a id="l02816" name="l02816"></a><span class="lineno"> 2816</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l02817" name="l02817"></a><span class="lineno"> 2817</span> }</div>
|
|
<div class="line"><a id="l02818" name="l02818"></a><span class="lineno"> 2818</span> }</div>
|
|
<div class="line"><a id="l02819" name="l02819"></a><span class="lineno"> 2819</span> }</div>
|
|
<div class="line"><a id="l02820" name="l02820"></a><span class="lineno"> 2820</span> }</div>
|
|
<div class="line"><a id="l02821" name="l02821"></a><span class="lineno"> 2821</span> </div>
|
|
<div class="line"><a id="l02822" name="l02822"></a><span class="lineno"> 2822</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.use_cp_sat() == <a class="code hl_enumvalue" href="namespaceoperations__research.html#ab13458305fa2eb87238ff66066eecd5da7149f32738efcef1bf4db3d635d804b0">BOOL_TRUE</a> ||</div>
|
|
<div class="line"><a id="l02823" name="l02823"></a><span class="lineno"> 2823</span> <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.use_generalized_cp_sat() == <a class="code hl_enumvalue" href="namespaceoperations__research.html#ab13458305fa2eb87238ff66066eecd5da7149f32738efcef1bf4db3d635d804b0">BOOL_TRUE</a>) {</div>
|
|
<div class="line"><a id="l02824" name="l02824"></a><span class="lineno"> 2824</span> <span class="keyword">const</span> <span class="keywordtype">int</span> solution_count = collect_assignments_->solution_count();</div>
|
|
<div class="line"><a id="l02825" name="l02825"></a><span class="lineno"> 2825</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* <span class="keyword">const</span> cp_solution =</div>
|
|
<div class="line"><a id="l02826" name="l02826"></a><span class="lineno"> 2826</span> solution_count >= 1 ? collect_assignments_->solution(solution_count - 1)</div>
|
|
<div class="line"><a id="l02827" name="l02827"></a><span class="lineno"> 2827</span> : <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l02828" name="l02828"></a><span class="lineno"> 2828</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a> sat_solution(solver_.get());</div>
|
|
<div class="line"><a id="l02829" name="l02829"></a><span class="lineno"> 2829</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="namespaceoperations__research.html#a082573f2b119f85031afcc6b9096b102">SolveModelWithSat</a>(*<span class="keyword">this</span>, <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>, cp_solution, &sat_solution) &&</div>
|
|
<div class="line"><a id="l02830" name="l02830"></a><span class="lineno"> 2830</span> AppendAssignmentIfFeasible(sat_solution, &solution_pool) &&</div>
|
|
<div class="line"><a id="l02831" name="l02831"></a><span class="lineno"> 2831</span> <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.log_search()) {</div>
|
|
<div class="line"><a id="l02832" name="l02832"></a><span class="lineno"> 2832</span> LogSolution(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>, <span class="stringliteral">"SAT"</span>, solution_pool.back()->ObjectiveValue(),</div>
|
|
<div class="line"><a id="l02833" name="l02833"></a><span class="lineno"> 2833</span> start_time_ms);</div>
|
|
<div class="line"><a id="l02834" name="l02834"></a><span class="lineno"> 2834</span> }</div>
|
|
<div class="line"><a id="l02835" name="l02835"></a><span class="lineno"> 2835</span> }</div>
|
|
<div class="line"><a id="l02836" name="l02836"></a><span class="lineno"> 2836</span> </div>
|
|
<div class="line"><a id="l02837" name="l02837"></a><span class="lineno"> 2837</span> <span class="keyword">const</span> absl::Duration elapsed_time =</div>
|
|
<div class="line"><a id="l02838" name="l02838"></a><span class="lineno"> 2838</span> absl::Milliseconds(solver_->wall_time() - start_time_ms);</div>
|
|
<div class="line"><a id="l02839" name="l02839"></a><span class="lineno"> 2839</span> <span class="keyword">const</span> <span class="keywordtype">int</span> solution_count = collect_assignments_->solution_count();</div>
|
|
<div class="line"><a id="l02840" name="l02840"></a><span class="lineno"> 2840</span> <span class="keywordflow">if</span> (solution_count >= 1 || !solution_pool.empty()) {</div>
|
|
<div class="line"><a id="l02841" name="l02841"></a><span class="lineno"> 2841</span> status_ = <a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba09515ee36ef4715f09f3aa67f685011e">ROUTING_SUCCESS</a>;</div>
|
|
<div class="line"><a id="l02842" name="l02842"></a><span class="lineno"> 2842</span> <span class="keywordflow">if</span> (solutions != <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l02843" name="l02843"></a><span class="lineno"> 2843</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < solution_count; ++i) {</div>
|
|
<div class="line"><a id="l02844" name="l02844"></a><span class="lineno"> 2844</span> solutions->push_back(</div>
|
|
<div class="line"><a id="l02845" name="l02845"></a><span class="lineno"> 2845</span> solver_->MakeAssignment(collect_assignments_->solution(i)));</div>
|
|
<div class="line"><a id="l02846" name="l02846"></a><span class="lineno"> 2846</span> }</div>
|
|
<div class="line"><a id="l02847" name="l02847"></a><span class="lineno"> 2847</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>& solution : solution_pool) {</div>
|
|
<div class="line"><a id="l02848" name="l02848"></a><span class="lineno"> 2848</span> <span class="keywordflow">if</span> (solutions->empty() ||</div>
|
|
<div class="line"><a id="l02849" name="l02849"></a><span class="lineno"> 2849</span> solution->ObjectiveValue() < solutions->back()->ObjectiveValue()) {</div>
|
|
<div class="line"><a id="l02850" name="l02850"></a><span class="lineno"> 2850</span> solutions->push_back(solver_->MakeAssignment(solution.get()));</div>
|
|
<div class="line"><a id="l02851" name="l02851"></a><span class="lineno"> 2851</span> }</div>
|
|
<div class="line"><a id="l02852" name="l02852"></a><span class="lineno"> 2852</span> }</div>
|
|
<div class="line"><a id="l02853" name="l02853"></a><span class="lineno"> 2853</span> <span class="keywordflow">return</span> solutions->back();</div>
|
|
<div class="line"><a id="l02854" name="l02854"></a><span class="lineno"> 2854</span> }</div>
|
|
<div class="line"><a id="l02855" name="l02855"></a><span class="lineno"> 2855</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* best_assignment =</div>
|
|
<div class="line"><a id="l02856" name="l02856"></a><span class="lineno"> 2856</span> solution_count >= 1 ? collect_assignments_->solution(solution_count - 1)</div>
|
|
<div class="line"><a id="l02857" name="l02857"></a><span class="lineno"> 2857</span> : <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l02858" name="l02858"></a><span class="lineno"> 2858</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>& solution : solution_pool) {</div>
|
|
<div class="line"><a id="l02859" name="l02859"></a><span class="lineno"> 2859</span> <span class="keywordflow">if</span> (best_assignment == <span class="keyword">nullptr</span> ||</div>
|
|
<div class="line"><a id="l02860" name="l02860"></a><span class="lineno"> 2860</span> solution-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#a673faac1a261ca2414930dddbfaef92b">ObjectiveValue</a>() < best_assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#a673faac1a261ca2414930dddbfaef92b">ObjectiveValue</a>()) {</div>
|
|
<div class="line"><a id="l02861" name="l02861"></a><span class="lineno"> 2861</span> best_assignment = solution.get();</div>
|
|
<div class="line"><a id="l02862" name="l02862"></a><span class="lineno"> 2862</span> }</div>
|
|
<div class="line"><a id="l02863" name="l02863"></a><span class="lineno"> 2863</span> }</div>
|
|
<div class="line"><a id="l02864" name="l02864"></a><span class="lineno"> 2864</span> <span class="keywordflow">return</span> solver_->MakeAssignment(best_assignment);</div>
|
|
<div class="line"><a id="l02865" name="l02865"></a><span class="lineno"> 2865</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l02866" name="l02866"></a><span class="lineno"> 2866</span> <span class="keywordflow">if</span> (elapsed_time >= GetTimeLimit(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>)) {</div>
|
|
<div class="line"><a id="l02867" name="l02867"></a><span class="lineno"> 2867</span> status_ = <a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70baf6452d79d02ab06bc8d722d25825cae3">ROUTING_FAIL_TIMEOUT</a>;</div>
|
|
<div class="line"><a id="l02868" name="l02868"></a><span class="lineno"> 2868</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l02869" name="l02869"></a><span class="lineno"> 2869</span> status_ = <a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70baba9b2029e549c14c8a6b9f6201e329fd">ROUTING_FAIL</a>;</div>
|
|
<div class="line"><a id="l02870" name="l02870"></a><span class="lineno"> 2870</span> }</div>
|
|
<div class="line"><a id="l02871" name="l02871"></a><span class="lineno"> 2871</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l02872" name="l02872"></a><span class="lineno"> 2872</span> }</div>
|
|
<div class="line"><a id="l02873" name="l02873"></a><span class="lineno"> 2873</span>}</div>
|
|
<div class="line"><a id="l02874" name="l02874"></a><span class="lineno"> 2874</span> </div>
|
|
<div class="line"><a id="l02875" name="l02875"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#ac1a2ab630f6b13644ca6853c7893f413"> 2875</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ac1a2ab630f6b13644ca6853c7893f413">RoutingModel::SetAssignmentFromOtherModelAssignment</a>(</div>
|
|
<div class="line"><a id="l02876" name="l02876"></a><span class="lineno"> 2876</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* target_assignment, <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_model.html">RoutingModel</a>* source_model,</div>
|
|
<div class="line"><a id="l02877" name="l02877"></a><span class="lineno"> 2877</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* source_assignment) {</div>
|
|
<div class="line"><a id="l02878" name="l02878"></a><span class="lineno"> 2878</span> <span class="keyword">const</span> <span class="keywordtype">int</span> size = <a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#a24926108b770033792d015cb86aeffb3">Size</a>();</div>
|
|
<div class="line"><a id="l02879" name="l02879"></a><span class="lineno"> 2879</span> <a class="code hl_define" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(size, source_model-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a572bd92c25ebc67c72137fd59e53f6d6">Size</a>());</div>
|
|
<div class="line"><a id="l02880" name="l02880"></a><span class="lineno"> 2880</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(target_assignment-><a class="code hl_function" href="classoperations__research_1_1_propagation_base_object.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>(), solver_.get());</div>
|
|
<div class="line"><a id="l02881" name="l02881"></a><span class="lineno"> 2881</span> </div>
|
|
<div class="line"><a id="l02882" name="l02882"></a><span class="lineno"> 2882</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853">CostsAreHomogeneousAcrossVehicles</a>()) {</div>
|
|
<div class="line"><a id="l02883" name="l02883"></a><span class="lineno"> 2883</span> <a class="code hl_function" href="namespaceoperations__research.html#a57f1befcdc8fc2b6f9741369a1beb136">SetAssignmentFromAssignment</a>(target_assignment, <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a911482cb7495f22638a02066adf13c8b">Nexts</a>(), source_assignment,</div>
|
|
<div class="line"><a id="l02884" name="l02884"></a><span class="lineno"> 2884</span> source_model-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a911482cb7495f22638a02066adf13c8b">Nexts</a>());</div>
|
|
<div class="line"><a id="l02885" name="l02885"></a><span class="lineno"> 2885</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l02886" name="l02886"></a><span class="lineno"> 2886</span> std::vector<IntVar*> source_vars(size + size + vehicles_);</div>
|
|
<div class="line"><a id="l02887" name="l02887"></a><span class="lineno"> 2887</span> std::vector<IntVar*> target_vars(size + size + vehicles_);</div>
|
|
<div class="line"><a id="l02888" name="l02888"></a><span class="lineno"> 2888</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = 0; <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < size; <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>++) {</div>
|
|
<div class="line"><a id="l02889" name="l02889"></a><span class="lineno"> 2889</span> source_vars[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>] = source_model-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l02890" name="l02890"></a><span class="lineno"> 2890</span> target_vars[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>] = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l02891" name="l02891"></a><span class="lineno"> 2891</span> }</div>
|
|
<div class="line"><a id="l02892" name="l02892"></a><span class="lineno"> 2892</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = 0; <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < size + vehicles_; <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>++) {</div>
|
|
<div class="line"><a id="l02893" name="l02893"></a><span class="lineno"> 2893</span> source_vars[size + <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>] = source_model-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">VehicleVar</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l02894" name="l02894"></a><span class="lineno"> 2894</span> target_vars[size + <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>] = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">VehicleVar</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l02895" name="l02895"></a><span class="lineno"> 2895</span> }</div>
|
|
<div class="line"><a id="l02896" name="l02896"></a><span class="lineno"> 2896</span> <a class="code hl_function" href="namespaceoperations__research.html#a57f1befcdc8fc2b6f9741369a1beb136">SetAssignmentFromAssignment</a>(target_assignment, target_vars,</div>
|
|
<div class="line"><a id="l02897" name="l02897"></a><span class="lineno"> 2897</span> source_assignment, source_vars);</div>
|
|
<div class="line"><a id="l02898" name="l02898"></a><span class="lineno"> 2898</span> }</div>
|
|
<div class="line"><a id="l02899" name="l02899"></a><span class="lineno"> 2899</span> </div>
|
|
<div class="line"><a id="l02900" name="l02900"></a><span class="lineno"> 2900</span> target_assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#a86601a2dad7a051d7b387ffa789898ff">AddObjective</a>(cost_);</div>
|
|
<div class="line"><a id="l02901" name="l02901"></a><span class="lineno"> 2901</span>}</div>
|
|
<div class="line"><a id="l02902" name="l02902"></a><span class="lineno"> 2902</span> </div>
|
|
<div class="line"><a id="l02903" name="l02903"></a><span class="lineno"> 2903</span><span class="comment">// Computing a lower bound to the cost of a vehicle routing problem solving a</span></div>
|
|
<div class="line"><a id="l02904" name="l02904"></a><span class="lineno"> 2904</span><span class="comment">// a linear assignment problem (minimum-cost perfect bipartite matching).</span></div>
|
|
<div class="line"><a id="l02905" name="l02905"></a><span class="lineno"> 2905</span><span class="comment">// A bipartite graph is created with left nodes representing the nodes of the</span></div>
|
|
<div class="line"><a id="l02906" name="l02906"></a><span class="lineno"> 2906</span><span class="comment">// routing problem and right nodes representing possible node successors; an</span></div>
|
|
<div class="line"><a id="l02907" name="l02907"></a><span class="lineno"> 2907</span><span class="comment">// arc between a left node l and a right node r is created if r can be the</span></div>
|
|
<div class="line"><a id="l02908" name="l02908"></a><span class="lineno"> 2908</span><span class="comment">// node folowing l in a route (Next(l) = r); the cost of the arc is the transit</span></div>
|
|
<div class="line"><a id="l02909" name="l02909"></a><span class="lineno"> 2909</span><span class="comment">// cost between l and r in the routing problem.</span></div>
|
|
<div class="line"><a id="l02910" name="l02910"></a><span class="lineno"> 2910</span><span class="comment">// This is a lower bound given the solution to assignment problem does not</span></div>
|
|
<div class="line"><a id="l02911" name="l02911"></a><span class="lineno"> 2911</span><span class="comment">// necessarily produce a (set of) closed route(s) from a starting node to an</span></div>
|
|
<div class="line"><a id="l02912" name="l02912"></a><span class="lineno"> 2912</span><span class="comment">// ending node.</span></div>
|
|
<div class="line"><a id="l02913" name="l02913"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a045b5c068a5676ef3d3af9357621d7f7"> 2913</a></span>int64_t <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a045b5c068a5676ef3d3af9357621d7f7">RoutingModel::ComputeLowerBound</a>() {</div>
|
|
<div class="line"><a id="l02914" name="l02914"></a><span class="lineno"> 2914</span> <span class="keywordflow">if</span> (!closed_) {</div>
|
|
<div class="line"><a id="l02915" name="l02915"></a><span class="lineno"> 2915</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7">WARNING</a>) << <span class="stringliteral">"Non-closed model not supported."</span>;</div>
|
|
<div class="line"><a id="l02916" name="l02916"></a><span class="lineno"> 2916</span> <span class="keywordflow">return</span> 0;</div>
|
|
<div class="line"><a id="l02917" name="l02917"></a><span class="lineno"> 2917</span> }</div>
|
|
<div class="line"><a id="l02918" name="l02918"></a><span class="lineno"> 2918</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853">CostsAreHomogeneousAcrossVehicles</a>()) {</div>
|
|
<div class="line"><a id="l02919" name="l02919"></a><span class="lineno"> 2919</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7">WARNING</a>) << <span class="stringliteral">"Non-homogeneous vehicle costs not supported"</span>;</div>
|
|
<div class="line"><a id="l02920" name="l02920"></a><span class="lineno"> 2920</span> <span class="keywordflow">return</span> 0;</div>
|
|
<div class="line"><a id="l02921" name="l02921"></a><span class="lineno"> 2921</span> }</div>
|
|
<div class="line"><a id="l02922" name="l02922"></a><span class="lineno"> 2922</span> <span class="keywordflow">if</span> (!disjunctions_.empty()) {</div>
|
|
<div class="line"><a id="l02923" name="l02923"></a><span class="lineno"> 2923</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7">WARNING</a>)</div>
|
|
<div class="line"><a id="l02924" name="l02924"></a><span class="lineno"> 2924</span> << <span class="stringliteral">"Node disjunction constraints or optional nodes not supported."</span>;</div>
|
|
<div class="line"><a id="l02925" name="l02925"></a><span class="lineno"> 2925</span> <span class="keywordflow">return</span> 0;</div>
|
|
<div class="line"><a id="l02926" name="l02926"></a><span class="lineno"> 2926</span> }</div>
|
|
<div class="line"><a id="l02927" name="l02927"></a><span class="lineno"> 2927</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_nodes = <a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#a24926108b770033792d015cb86aeffb3">Size</a>() + vehicles_;</div>
|
|
<div class="line"><a id="l02928" name="l02928"></a><span class="lineno"> 2928</span> <a class="code hl_class" href="classoperations__research_1_1_forward_ebert_graph.html">ForwardStarGraph</a> graph(2 * num_nodes, num_nodes * num_nodes);</div>
|
|
<div class="line"><a id="l02929" name="l02929"></a><span class="lineno"> 2929</span> <a class="code hl_class" href="classoperations__research_1_1_linear_sum_assignment.html">LinearSumAssignment<ForwardStarGraph></a> linear_sum_assignment(graph, num_nodes);</div>
|
|
<div class="line"><a id="l02930" name="l02930"></a><span class="lineno"> 2930</span> <span class="comment">// Adding arcs for non-end nodes, based on possible values of next variables.</span></div>
|
|
<div class="line"><a id="l02931" name="l02931"></a><span class="lineno"> 2931</span> <span class="comment">// Left nodes in the bipartite are indexed from 0 to num_nodes - 1; right</span></div>
|
|
<div class="line"><a id="l02932" name="l02932"></a><span class="lineno"> 2932</span> <span class="comment">// nodes are indexed from num_nodes to 2 * num_nodes - 1.</span></div>
|
|
<div class="line"><a id="l02933" name="l02933"></a><span class="lineno"> 2933</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> <a class="code hl_variable" href="routing__flow_8cc.html#a64e7efc5529154ba56903e75f5300990">tail</a> = 0; <a class="code hl_variable" href="routing__flow_8cc.html#a64e7efc5529154ba56903e75f5300990">tail</a> < <a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#a24926108b770033792d015cb86aeffb3">Size</a>(); ++<a class="code hl_variable" href="routing__flow_8cc.html#a64e7efc5529154ba56903e75f5300990">tail</a>) {</div>
|
|
<div class="line"><a id="l02934" name="l02934"></a><span class="lineno"> 2934</span> std::unique_ptr<IntVarIterator> iterator(</div>
|
|
<div class="line"><a id="l02935" name="l02935"></a><span class="lineno"> 2935</span> nexts_[<a class="code hl_variable" href="routing__flow_8cc.html#a64e7efc5529154ba56903e75f5300990">tail</a>]->MakeDomainIterator(<span class="keyword">false</span>));</div>
|
|
<div class="line"><a id="l02936" name="l02936"></a><span class="lineno"> 2936</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> int64_t <a class="code hl_variable" href="routing__flow_8cc.html#afca32f65388659a4b0956496169488b4">head</a> : <a class="code hl_class" href="classoperations__research_1_1_init_and_get_values.html">InitAndGetValues</a>(iterator.get())) {</div>
|
|
<div class="line"><a id="l02937" name="l02937"></a><span class="lineno"> 2937</span> <span class="comment">// Given there are no disjunction constraints, a node cannot point to</span></div>
|
|
<div class="line"><a id="l02938" name="l02938"></a><span class="lineno"> 2938</span> <span class="comment">// itself. Doing this explicitly given that outside the search,</span></div>
|
|
<div class="line"><a id="l02939" name="l02939"></a><span class="lineno"> 2939</span> <span class="comment">// propagation hasn't removed this value from next variables yet.</span></div>
|
|
<div class="line"><a id="l02940" name="l02940"></a><span class="lineno"> 2940</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="routing__flow_8cc.html#afca32f65388659a4b0956496169488b4">head</a> == <a class="code hl_variable" href="routing__flow_8cc.html#a64e7efc5529154ba56903e75f5300990">tail</a>) {</div>
|
|
<div class="line"><a id="l02941" name="l02941"></a><span class="lineno"> 2941</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l02942" name="l02942"></a><span class="lineno"> 2942</span> }</div>
|
|
<div class="line"><a id="l02943" name="l02943"></a><span class="lineno"> 2943</span> <span class="comment">// The index of a right node in the bipartite graph is the index</span></div>
|
|
<div class="line"><a id="l02944" name="l02944"></a><span class="lineno"> 2944</span> <span class="comment">// of the successor offset by the number of nodes.</span></div>
|
|
<div class="line"><a id="l02945" name="l02945"></a><span class="lineno"> 2945</span> <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceoperations__research.html#aecf320bda6e95d1edaf3a546673e3e6b">ArcIndex</a> arc = graph.<a class="code hl_function" href="classoperations__research_1_1_ebert_graph_base.html#a7b505ba4a01bce342d049f5a8674da72">AddArc</a>(<a class="code hl_variable" href="routing__flow_8cc.html#a64e7efc5529154ba56903e75f5300990">tail</a>, num_nodes + <a class="code hl_variable" href="routing__flow_8cc.html#afca32f65388659a4b0956496169488b4">head</a>);</div>
|
|
<div class="line"><a id="l02946" name="l02946"></a><span class="lineno"> 2946</span> <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceoperations__research.html#aee97ac67f280d35acdef2c5d461a85c3">CostValue</a> <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a> = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a51b526b532fc95cfed13d54ed2d6db95">GetHomogeneousCost</a>(<a class="code hl_variable" href="routing__flow_8cc.html#a64e7efc5529154ba56903e75f5300990">tail</a>, <a class="code hl_variable" href="routing__flow_8cc.html#afca32f65388659a4b0956496169488b4">head</a>);</div>
|
|
<div class="line"><a id="l02947" name="l02947"></a><span class="lineno"> 2947</span> linear_sum_assignment.<a class="code hl_function" href="classoperations__research_1_1_linear_sum_assignment.html#a77a0519df5fb71834593bb661b72921c">SetArcCost</a>(arc, <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a>);</div>
|
|
<div class="line"><a id="l02948" name="l02948"></a><span class="lineno"> 2948</span> }</div>
|
|
<div class="line"><a id="l02949" name="l02949"></a><span class="lineno"> 2949</span> }</div>
|
|
<div class="line"><a id="l02950" name="l02950"></a><span class="lineno"> 2950</span> <span class="comment">// The linear assignment library requires having as many left and right nodes.</span></div>
|
|
<div class="line"><a id="l02951" name="l02951"></a><span class="lineno"> 2951</span> <span class="comment">// Therefore we are creating fake assignments for end nodes, forced to point</span></div>
|
|
<div class="line"><a id="l02952" name="l02952"></a><span class="lineno"> 2952</span> <span class="comment">// to the equivalent start node with a cost of 0.</span></div>
|
|
<div class="line"><a id="l02953" name="l02953"></a><span class="lineno"> 2953</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> <a class="code hl_variable" href="routing__flow_8cc.html#a64e7efc5529154ba56903e75f5300990">tail</a> = <a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#a24926108b770033792d015cb86aeffb3">Size</a>(); <a class="code hl_variable" href="routing__flow_8cc.html#a64e7efc5529154ba56903e75f5300990">tail</a> < num_nodes; ++<a class="code hl_variable" href="routing__flow_8cc.html#a64e7efc5529154ba56903e75f5300990">tail</a>) {</div>
|
|
<div class="line"><a id="l02954" name="l02954"></a><span class="lineno"> 2954</span> <span class="keyword">const</span> <a class="code hl_typedef" href="namespaceoperations__research.html#aecf320bda6e95d1edaf3a546673e3e6b">ArcIndex</a> arc = graph.<a class="code hl_function" href="classoperations__research_1_1_ebert_graph_base.html#a7b505ba4a01bce342d049f5a8674da72">AddArc</a>(<a class="code hl_variable" href="routing__flow_8cc.html#a64e7efc5529154ba56903e75f5300990">tail</a>, num_nodes + starts_[<a class="code hl_variable" href="routing__flow_8cc.html#a64e7efc5529154ba56903e75f5300990">tail</a> - <a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#a24926108b770033792d015cb86aeffb3">Size</a>()]);</div>
|
|
<div class="line"><a id="l02955" name="l02955"></a><span class="lineno"> 2955</span> linear_sum_assignment.<a class="code hl_function" href="classoperations__research_1_1_linear_sum_assignment.html#a77a0519df5fb71834593bb661b72921c">SetArcCost</a>(arc, 0);</div>
|
|
<div class="line"><a id="l02956" name="l02956"></a><span class="lineno"> 2956</span> }</div>
|
|
<div class="line"><a id="l02957" name="l02957"></a><span class="lineno"> 2957</span> <span class="keywordflow">if</span> (linear_sum_assignment.<a class="code hl_function" href="classoperations__research_1_1_linear_sum_assignment.html#a63b3d12e721188086870cc42cc46a258">ComputeAssignment</a>()) {</div>
|
|
<div class="line"><a id="l02958" name="l02958"></a><span class="lineno"> 2958</span> <span class="keywordflow">return</span> linear_sum_assignment.<a class="code hl_function" href="classoperations__research_1_1_linear_sum_assignment.html#a5afb9dde1c31f5f053cc83bf6e594db0">GetCost</a>();</div>
|
|
<div class="line"><a id="l02959" name="l02959"></a><span class="lineno"> 2959</span> }</div>
|
|
<div class="line"><a id="l02960" name="l02960"></a><span class="lineno"> 2960</span> <span class="keywordflow">return</span> 0;</div>
|
|
<div class="line"><a id="l02961" name="l02961"></a><span class="lineno"> 2961</span>}</div>
|
|
<div class="line"><a id="l02962" name="l02962"></a><span class="lineno"> 2962</span> </div>
|
|
<div class="line"><a id="l02963" name="l02963"></a><span class="lineno"> 2963</span><span class="keywordtype">bool</span> RoutingModel::RouteCanBeUsedByVehicle(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>& assignment,</div>
|
|
<div class="line"><a id="l02964" name="l02964"></a><span class="lineno"> 2964</span> <span class="keywordtype">int</span> start_index, <span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l02965" name="l02965"></a><span class="lineno"> 2965</span> <span class="keywordtype">int</span> current_index =</div>
|
|
<div class="line"><a id="l02966" name="l02966"></a><span class="lineno"> 2966</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a3582f01eabc65ba4b801215ca6420a7c">IsStart</a>(start_index) ? <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa1e8634ca9564e23a832de7479ba34ba">Next</a>(assignment, start_index) : start_index;</div>
|
|
<div class="line"><a id="l02967" name="l02967"></a><span class="lineno"> 2967</span> <span class="keywordflow">while</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(current_index)) {</div>
|
|
<div class="line"><a id="l02968" name="l02968"></a><span class="lineno"> 2968</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> vehicle_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">VehicleVar</a>(current_index);</div>
|
|
<div class="line"><a id="l02969" name="l02969"></a><span class="lineno"> 2969</span> <span class="keywordflow">if</span> (!vehicle_var-><a class="code hl_function" href="classoperations__research_1_1_int_var.html#a0723abf37f7a5a8a604fd1bcd96a7be0">Contains</a>(vehicle)) {</div>
|
|
<div class="line"><a id="l02970" name="l02970"></a><span class="lineno"> 2970</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l02971" name="l02971"></a><span class="lineno"> 2971</span> }</div>
|
|
<div class="line"><a id="l02972" name="l02972"></a><span class="lineno"> 2972</span> <span class="keyword">const</span> <span class="keywordtype">int</span> next_index = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa1e8634ca9564e23a832de7479ba34ba">Next</a>(assignment, current_index);</div>
|
|
<div class="line"><a id="l02973" name="l02973"></a><span class="lineno"> 2973</span> <a class="code hl_define" href="base_2logging_8h.html#ab25e01a2942b821d66371fc68d53f2eb">CHECK_NE</a>(next_index, current_index) << <span class="stringliteral">"Inactive node inside a route"</span>;</div>
|
|
<div class="line"><a id="l02974" name="l02974"></a><span class="lineno"> 2974</span> current_index = next_index;</div>
|
|
<div class="line"><a id="l02975" name="l02975"></a><span class="lineno"> 2975</span> }</div>
|
|
<div class="line"><a id="l02976" name="l02976"></a><span class="lineno"> 2976</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l02977" name="l02977"></a><span class="lineno"> 2977</span>}</div>
|
|
<div class="line"><a id="l02978" name="l02978"></a><span class="lineno"> 2978</span> </div>
|
|
<div class="line"><a id="l02979" name="l02979"></a><span class="lineno"> 2979</span><span class="keywordtype">bool</span> RoutingModel::ReplaceUnusedVehicle(</div>
|
|
<div class="line"><a id="l02980" name="l02980"></a><span class="lineno"> 2980</span> <span class="keywordtype">int</span> unused_vehicle, <span class="keywordtype">int</span> active_vehicle,</div>
|
|
<div class="line"><a id="l02981" name="l02981"></a><span class="lineno"> 2981</span> Assignment* <span class="keyword">const</span> compact_assignment)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l02982" name="l02982"></a><span class="lineno"> 2982</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(compact_assignment != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l02983" name="l02983"></a><span class="lineno"> 2983</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aedb8dca94b15e5465fef1667d1a81db6">IsVehicleUsed</a>(*compact_assignment, unused_vehicle));</div>
|
|
<div class="line"><a id="l02984" name="l02984"></a><span class="lineno"> 2984</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aedb8dca94b15e5465fef1667d1a81db6">IsVehicleUsed</a>(*compact_assignment, active_vehicle));</div>
|
|
<div class="line"><a id="l02985" name="l02985"></a><span class="lineno"> 2985</span> <span class="comment">// Swap NextVars at start nodes.</span></div>
|
|
<div class="line"><a id="l02986" name="l02986"></a><span class="lineno"> 2986</span> <span class="keyword">const</span> <span class="keywordtype">int</span> unused_vehicle_start = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(unused_vehicle);</div>
|
|
<div class="line"><a id="l02987" name="l02987"></a><span class="lineno"> 2987</span> IntVar* <span class="keyword">const</span> unused_vehicle_start_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(unused_vehicle_start);</div>
|
|
<div class="line"><a id="l02988" name="l02988"></a><span class="lineno"> 2988</span> <span class="keyword">const</span> <span class="keywordtype">int</span> unused_vehicle_end = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afb80fd36c1fb57d2db049403483e2074">End</a>(unused_vehicle);</div>
|
|
<div class="line"><a id="l02989" name="l02989"></a><span class="lineno"> 2989</span> <span class="keyword">const</span> <span class="keywordtype">int</span> active_vehicle_start = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(active_vehicle);</div>
|
|
<div class="line"><a id="l02990" name="l02990"></a><span class="lineno"> 2990</span> <span class="keyword">const</span> <span class="keywordtype">int</span> active_vehicle_end = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afb80fd36c1fb57d2db049403483e2074">End</a>(active_vehicle);</div>
|
|
<div class="line"><a id="l02991" name="l02991"></a><span class="lineno"> 2991</span> IntVar* <span class="keyword">const</span> active_vehicle_start_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(active_vehicle_start);</div>
|
|
<div class="line"><a id="l02992" name="l02992"></a><span class="lineno"> 2992</span> <span class="keyword">const</span> <span class="keywordtype">int</span> active_vehicle_next =</div>
|
|
<div class="line"><a id="l02993" name="l02993"></a><span class="lineno"> 2993</span> compact_assignment->Value(active_vehicle_start_var);</div>
|
|
<div class="line"><a id="l02994" name="l02994"></a><span class="lineno"> 2994</span> compact_assignment->SetValue(unused_vehicle_start_var, active_vehicle_next);</div>
|
|
<div class="line"><a id="l02995" name="l02995"></a><span class="lineno"> 2995</span> compact_assignment->SetValue(active_vehicle_start_var, <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afb80fd36c1fb57d2db049403483e2074">End</a>(active_vehicle));</div>
|
|
<div class="line"><a id="l02996" name="l02996"></a><span class="lineno"> 2996</span> </div>
|
|
<div class="line"><a id="l02997" name="l02997"></a><span class="lineno"> 2997</span> <span class="comment">// Update VehicleVars along the route, update the last NextVar.</span></div>
|
|
<div class="line"><a id="l02998" name="l02998"></a><span class="lineno"> 2998</span> <span class="keywordtype">int</span> current_index = active_vehicle_next;</div>
|
|
<div class="line"><a id="l02999" name="l02999"></a><span class="lineno"> 2999</span> <span class="keywordflow">while</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(current_index)) {</div>
|
|
<div class="line"><a id="l03000" name="l03000"></a><span class="lineno"> 3000</span> IntVar* <span class="keyword">const</span> vehicle_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">VehicleVar</a>(current_index);</div>
|
|
<div class="line"><a id="l03001" name="l03001"></a><span class="lineno"> 3001</span> compact_assignment->SetValue(vehicle_var, unused_vehicle);</div>
|
|
<div class="line"><a id="l03002" name="l03002"></a><span class="lineno"> 3002</span> <span class="keyword">const</span> <span class="keywordtype">int</span> next_index = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa1e8634ca9564e23a832de7479ba34ba">Next</a>(*compact_assignment, current_index);</div>
|
|
<div class="line"><a id="l03003" name="l03003"></a><span class="lineno"> 3003</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(next_index)) {</div>
|
|
<div class="line"><a id="l03004" name="l03004"></a><span class="lineno"> 3004</span> IntVar* <span class="keyword">const</span> last_next_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(current_index);</div>
|
|
<div class="line"><a id="l03005" name="l03005"></a><span class="lineno"> 3005</span> compact_assignment->SetValue(last_next_var, <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afb80fd36c1fb57d2db049403483e2074">End</a>(unused_vehicle));</div>
|
|
<div class="line"><a id="l03006" name="l03006"></a><span class="lineno"> 3006</span> }</div>
|
|
<div class="line"><a id="l03007" name="l03007"></a><span class="lineno"> 3007</span> current_index = next_index;</div>
|
|
<div class="line"><a id="l03008" name="l03008"></a><span class="lineno"> 3008</span> }</div>
|
|
<div class="line"><a id="l03009" name="l03009"></a><span class="lineno"> 3009</span> </div>
|
|
<div class="line"><a id="l03010" name="l03010"></a><span class="lineno"> 3010</span> <span class="comment">// Update dimensions: update transits at the start.</span></div>
|
|
<div class="line"><a id="l03011" name="l03011"></a><span class="lineno"> 3011</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_friend" href="classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* <span class="keyword">const</span> dimension : dimensions_) {</div>
|
|
<div class="line"><a id="l03012" name="l03012"></a><span class="lineno"> 3012</span> <span class="keyword">const</span> std::vector<IntVar*>& transit_variables = dimension->transits();</div>
|
|
<div class="line"><a id="l03013" name="l03013"></a><span class="lineno"> 3013</span> IntVar* <span class="keyword">const</span> unused_vehicle_transit_var =</div>
|
|
<div class="line"><a id="l03014" name="l03014"></a><span class="lineno"> 3014</span> transit_variables[unused_vehicle_start];</div>
|
|
<div class="line"><a id="l03015" name="l03015"></a><span class="lineno"> 3015</span> IntVar* <span class="keyword">const</span> active_vehicle_transit_var =</div>
|
|
<div class="line"><a id="l03016" name="l03016"></a><span class="lineno"> 3016</span> transit_variables[active_vehicle_start];</div>
|
|
<div class="line"><a id="l03017" name="l03017"></a><span class="lineno"> 3017</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> contains_unused_vehicle_transit_var =</div>
|
|
<div class="line"><a id="l03018" name="l03018"></a><span class="lineno"> 3018</span> compact_assignment->Contains(unused_vehicle_transit_var);</div>
|
|
<div class="line"><a id="l03019" name="l03019"></a><span class="lineno"> 3019</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> contains_active_vehicle_transit_var =</div>
|
|
<div class="line"><a id="l03020" name="l03020"></a><span class="lineno"> 3020</span> compact_assignment->Contains(active_vehicle_transit_var);</div>
|
|
<div class="line"><a id="l03021" name="l03021"></a><span class="lineno"> 3021</span> <span class="keywordflow">if</span> (contains_unused_vehicle_transit_var !=</div>
|
|
<div class="line"><a id="l03022" name="l03022"></a><span class="lineno"> 3022</span> contains_active_vehicle_transit_var) {</div>
|
|
<div class="line"><a id="l03023" name="l03023"></a><span class="lineno"> 3023</span> <span class="comment">// TODO(user): clarify the expected trigger rate of this LOG.</span></div>
|
|
<div class="line"><a id="l03024" name="l03024"></a><span class="lineno"> 3024</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#ab4a2cbab234914b320b7fae11b6e8cb9">INFO</a>) << <span class="stringliteral">"The assignment contains transit variable for dimension '"</span></div>
|
|
<div class="line"><a id="l03025" name="l03025"></a><span class="lineno"> 3025</span> << dimension->name() << <span class="stringliteral">"' for some vehicles, but not for all"</span>;</div>
|
|
<div class="line"><a id="l03026" name="l03026"></a><span class="lineno"> 3026</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l03027" name="l03027"></a><span class="lineno"> 3027</span> }</div>
|
|
<div class="line"><a id="l03028" name="l03028"></a><span class="lineno"> 3028</span> <span class="keywordflow">if</span> (contains_unused_vehicle_transit_var) {</div>
|
|
<div class="line"><a id="l03029" name="l03029"></a><span class="lineno"> 3029</span> <span class="keyword">const</span> int64_t old_unused_vehicle_transit =</div>
|
|
<div class="line"><a id="l03030" name="l03030"></a><span class="lineno"> 3030</span> compact_assignment->Value(unused_vehicle_transit_var);</div>
|
|
<div class="line"><a id="l03031" name="l03031"></a><span class="lineno"> 3031</span> <span class="keyword">const</span> int64_t old_active_vehicle_transit =</div>
|
|
<div class="line"><a id="l03032" name="l03032"></a><span class="lineno"> 3032</span> compact_assignment->Value(active_vehicle_transit_var);</div>
|
|
<div class="line"><a id="l03033" name="l03033"></a><span class="lineno"> 3033</span> compact_assignment->SetValue(unused_vehicle_transit_var,</div>
|
|
<div class="line"><a id="l03034" name="l03034"></a><span class="lineno"> 3034</span> old_active_vehicle_transit);</div>
|
|
<div class="line"><a id="l03035" name="l03035"></a><span class="lineno"> 3035</span> compact_assignment->SetValue(active_vehicle_transit_var,</div>
|
|
<div class="line"><a id="l03036" name="l03036"></a><span class="lineno"> 3036</span> old_unused_vehicle_transit);</div>
|
|
<div class="line"><a id="l03037" name="l03037"></a><span class="lineno"> 3037</span> }</div>
|
|
<div class="line"><a id="l03038" name="l03038"></a><span class="lineno"> 3038</span> </div>
|
|
<div class="line"><a id="l03039" name="l03039"></a><span class="lineno"> 3039</span> <span class="comment">// Update dimensions: update cumuls at the end.</span></div>
|
|
<div class="line"><a id="l03040" name="l03040"></a><span class="lineno"> 3040</span> <span class="keyword">const</span> std::vector<IntVar*>& cumul_variables = dimension->cumuls();</div>
|
|
<div class="line"><a id="l03041" name="l03041"></a><span class="lineno"> 3041</span> IntVar* <span class="keyword">const</span> unused_vehicle_cumul_var =</div>
|
|
<div class="line"><a id="l03042" name="l03042"></a><span class="lineno"> 3042</span> cumul_variables[unused_vehicle_end];</div>
|
|
<div class="line"><a id="l03043" name="l03043"></a><span class="lineno"> 3043</span> IntVar* <span class="keyword">const</span> active_vehicle_cumul_var =</div>
|
|
<div class="line"><a id="l03044" name="l03044"></a><span class="lineno"> 3044</span> cumul_variables[active_vehicle_end];</div>
|
|
<div class="line"><a id="l03045" name="l03045"></a><span class="lineno"> 3045</span> <span class="keyword">const</span> int64_t old_unused_vehicle_cumul =</div>
|
|
<div class="line"><a id="l03046" name="l03046"></a><span class="lineno"> 3046</span> compact_assignment->Value(unused_vehicle_cumul_var);</div>
|
|
<div class="line"><a id="l03047" name="l03047"></a><span class="lineno"> 3047</span> <span class="keyword">const</span> int64_t old_active_vehicle_cumul =</div>
|
|
<div class="line"><a id="l03048" name="l03048"></a><span class="lineno"> 3048</span> compact_assignment->Value(active_vehicle_cumul_var);</div>
|
|
<div class="line"><a id="l03049" name="l03049"></a><span class="lineno"> 3049</span> compact_assignment->SetValue(unused_vehicle_cumul_var,</div>
|
|
<div class="line"><a id="l03050" name="l03050"></a><span class="lineno"> 3050</span> old_active_vehicle_cumul);</div>
|
|
<div class="line"><a id="l03051" name="l03051"></a><span class="lineno"> 3051</span> compact_assignment->SetValue(active_vehicle_cumul_var,</div>
|
|
<div class="line"><a id="l03052" name="l03052"></a><span class="lineno"> 3052</span> old_unused_vehicle_cumul);</div>
|
|
<div class="line"><a id="l03053" name="l03053"></a><span class="lineno"> 3053</span> }</div>
|
|
<div class="line"><a id="l03054" name="l03054"></a><span class="lineno"> 3054</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l03055" name="l03055"></a><span class="lineno"> 3055</span>}</div>
|
|
<div class="line"><a id="l03056" name="l03056"></a><span class="lineno"> 3056</span> </div>
|
|
<div class="line"><a id="l03057" name="l03057"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a3ea07f9778e02e7160c30bfb0f08736b"> 3057</a></span><a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a3ea07f9778e02e7160c30bfb0f08736b">RoutingModel::CompactAssignment</a>(</div>
|
|
<div class="line"><a id="l03058" name="l03058"></a><span class="lineno"> 3058</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>& assignment)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03059" name="l03059"></a><span class="lineno"> 3059</span> <span class="keywordflow">return</span> CompactAssignmentInternal(assignment, <span class="keyword">false</span>);</div>
|
|
<div class="line"><a id="l03060" name="l03060"></a><span class="lineno"> 3060</span>}</div>
|
|
<div class="line"><a id="l03061" name="l03061"></a><span class="lineno"> 3061</span> </div>
|
|
<div class="line"><a id="l03062" name="l03062"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a9a9f45350da93a613c6226f7d09d4353"> 3062</a></span><a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a9a9f45350da93a613c6226f7d09d4353">RoutingModel::CompactAndCheckAssignment</a>(</div>
|
|
<div class="line"><a id="l03063" name="l03063"></a><span class="lineno"> 3063</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>& assignment)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03064" name="l03064"></a><span class="lineno"> 3064</span> <span class="keywordflow">return</span> CompactAssignmentInternal(assignment, <span class="keyword">true</span>);</div>
|
|
<div class="line"><a id="l03065" name="l03065"></a><span class="lineno"> 3065</span>}</div>
|
|
<div class="line"><a id="l03066" name="l03066"></a><span class="lineno"> 3066</span> </div>
|
|
<div class="line"><a id="l03067" name="l03067"></a><span class="lineno"> 3067</span><a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* RoutingModel::CompactAssignmentInternal(</div>
|
|
<div class="line"><a id="l03068" name="l03068"></a><span class="lineno"> 3068</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>& assignment, <span class="keywordtype">bool</span> check_compact_assignment)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03069" name="l03069"></a><span class="lineno"> 3069</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(assignment.<a class="code hl_function" href="classoperations__research_1_1_propagation_base_object.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>(), solver_.get());</div>
|
|
<div class="line"><a id="l03070" name="l03070"></a><span class="lineno"> 3070</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853">CostsAreHomogeneousAcrossVehicles</a>()) {</div>
|
|
<div class="line"><a id="l03071" name="l03071"></a><span class="lineno"> 3071</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7">WARNING</a>)</div>
|
|
<div class="line"><a id="l03072" name="l03072"></a><span class="lineno"> 3072</span> << <span class="stringliteral">"The costs are not homogeneous, routes cannot be rearranged"</span>;</div>
|
|
<div class="line"><a id="l03073" name="l03073"></a><span class="lineno"> 3073</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l03074" name="l03074"></a><span class="lineno"> 3074</span> }</div>
|
|
<div class="line"><a id="l03075" name="l03075"></a><span class="lineno"> 3075</span> </div>
|
|
<div class="line"><a id="l03076" name="l03076"></a><span class="lineno"> 3076</span> std::unique_ptr<Assignment> compact_assignment(<span class="keyword">new</span> Assignment(&assignment));</div>
|
|
<div class="line"><a id="l03077" name="l03077"></a><span class="lineno"> 3077</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < vehicles_ - 1; ++vehicle) {</div>
|
|
<div class="line"><a id="l03078" name="l03078"></a><span class="lineno"> 3078</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aedb8dca94b15e5465fef1667d1a81db6">IsVehicleUsed</a>(*compact_assignment, vehicle)) {</div>
|
|
<div class="line"><a id="l03079" name="l03079"></a><span class="lineno"> 3079</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l03080" name="l03080"></a><span class="lineno"> 3080</span> }</div>
|
|
<div class="line"><a id="l03081" name="l03081"></a><span class="lineno"> 3081</span> <span class="keyword">const</span> <span class="keywordtype">int</span> vehicle_start = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(vehicle);</div>
|
|
<div class="line"><a id="l03082" name="l03082"></a><span class="lineno"> 3082</span> <span class="keyword">const</span> <span class="keywordtype">int</span> vehicle_end = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afb80fd36c1fb57d2db049403483e2074">End</a>(vehicle);</div>
|
|
<div class="line"><a id="l03083" name="l03083"></a><span class="lineno"> 3083</span> <span class="comment">// Find the last vehicle, that can swap routes with this one.</span></div>
|
|
<div class="line"><a id="l03084" name="l03084"></a><span class="lineno"> 3084</span> <span class="keywordtype">int</span> swap_vehicle = vehicles_ - 1;</div>
|
|
<div class="line"><a id="l03085" name="l03085"></a><span class="lineno"> 3085</span> <span class="keywordtype">bool</span> has_more_vehicles_with_route = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l03086" name="l03086"></a><span class="lineno"> 3086</span> <span class="keywordflow">for</span> (; swap_vehicle > vehicle; --swap_vehicle) {</div>
|
|
<div class="line"><a id="l03087" name="l03087"></a><span class="lineno"> 3087</span> <span class="comment">// If a vehicle was already swapped, it will appear in compact_assignment</span></div>
|
|
<div class="line"><a id="l03088" name="l03088"></a><span class="lineno"> 3088</span> <span class="comment">// as unused.</span></div>
|
|
<div class="line"><a id="l03089" name="l03089"></a><span class="lineno"> 3089</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aedb8dca94b15e5465fef1667d1a81db6">IsVehicleUsed</a>(*compact_assignment, swap_vehicle) ||</div>
|
|
<div class="line"><a id="l03090" name="l03090"></a><span class="lineno"> 3090</span> !<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aedb8dca94b15e5465fef1667d1a81db6">IsVehicleUsed</a>(*compact_assignment, swap_vehicle)) {</div>
|
|
<div class="line"><a id="l03091" name="l03091"></a><span class="lineno"> 3091</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l03092" name="l03092"></a><span class="lineno"> 3092</span> }</div>
|
|
<div class="line"><a id="l03093" name="l03093"></a><span class="lineno"> 3093</span> has_more_vehicles_with_route = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l03094" name="l03094"></a><span class="lineno"> 3094</span> <span class="keyword">const</span> <span class="keywordtype">int</span> swap_vehicle_start = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(swap_vehicle);</div>
|
|
<div class="line"><a id="l03095" name="l03095"></a><span class="lineno"> 3095</span> <span class="keyword">const</span> <span class="keywordtype">int</span> swap_vehicle_end = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afb80fd36c1fb57d2db049403483e2074">End</a>(swap_vehicle);</div>
|
|
<div class="line"><a id="l03096" name="l03096"></a><span class="lineno"> 3096</span> <span class="keywordflow">if</span> (manager_.IndexToNode(vehicle_start) !=</div>
|
|
<div class="line"><a id="l03097" name="l03097"></a><span class="lineno"> 3097</span> manager_.IndexToNode(swap_vehicle_start) ||</div>
|
|
<div class="line"><a id="l03098" name="l03098"></a><span class="lineno"> 3098</span> manager_.IndexToNode(vehicle_end) !=</div>
|
|
<div class="line"><a id="l03099" name="l03099"></a><span class="lineno"> 3099</span> manager_.IndexToNode(swap_vehicle_end)) {</div>
|
|
<div class="line"><a id="l03100" name="l03100"></a><span class="lineno"> 3100</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l03101" name="l03101"></a><span class="lineno"> 3101</span> }</div>
|
|
<div class="line"><a id="l03102" name="l03102"></a><span class="lineno"> 3102</span> </div>
|
|
<div class="line"><a id="l03103" name="l03103"></a><span class="lineno"> 3103</span> <span class="comment">// Check that updating VehicleVars is OK.</span></div>
|
|
<div class="line"><a id="l03104" name="l03104"></a><span class="lineno"> 3104</span> <span class="keywordflow">if</span> (RouteCanBeUsedByVehicle(*compact_assignment, swap_vehicle_start,</div>
|
|
<div class="line"><a id="l03105" name="l03105"></a><span class="lineno"> 3105</span> vehicle)) {</div>
|
|
<div class="line"><a id="l03106" name="l03106"></a><span class="lineno"> 3106</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l03107" name="l03107"></a><span class="lineno"> 3107</span> }</div>
|
|
<div class="line"><a id="l03108" name="l03108"></a><span class="lineno"> 3108</span> }</div>
|
|
<div class="line"><a id="l03109" name="l03109"></a><span class="lineno"> 3109</span> </div>
|
|
<div class="line"><a id="l03110" name="l03110"></a><span class="lineno"> 3110</span> <span class="keywordflow">if</span> (swap_vehicle == vehicle) {</div>
|
|
<div class="line"><a id="l03111" name="l03111"></a><span class="lineno"> 3111</span> <span class="keywordflow">if</span> (has_more_vehicles_with_route) {</div>
|
|
<div class="line"><a id="l03112" name="l03112"></a><span class="lineno"> 3112</span> <span class="comment">// No route can be assigned to this vehicle, but there are more vehicles</span></div>
|
|
<div class="line"><a id="l03113" name="l03113"></a><span class="lineno"> 3113</span> <span class="comment">// with a route left. This would leave a gap in the indices.</span></div>
|
|
<div class="line"><a id="l03114" name="l03114"></a><span class="lineno"> 3114</span> <span class="comment">// TODO(user): clarify the expected trigger rate of this LOG.</span></div>
|
|
<div class="line"><a id="l03115" name="l03115"></a><span class="lineno"> 3115</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#ab4a2cbab234914b320b7fae11b6e8cb9">INFO</a>) << <span class="stringliteral">"No vehicle that can be swapped with "</span> << vehicle</div>
|
|
<div class="line"><a id="l03116" name="l03116"></a><span class="lineno"> 3116</span> << <span class="stringliteral">" was found"</span>;</div>
|
|
<div class="line"><a id="l03117" name="l03117"></a><span class="lineno"> 3117</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l03118" name="l03118"></a><span class="lineno"> 3118</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l03119" name="l03119"></a><span class="lineno"> 3119</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l03120" name="l03120"></a><span class="lineno"> 3120</span> }</div>
|
|
<div class="line"><a id="l03121" name="l03121"></a><span class="lineno"> 3121</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l03122" name="l03122"></a><span class="lineno"> 3122</span> <span class="keywordflow">if</span> (!ReplaceUnusedVehicle(vehicle, swap_vehicle,</div>
|
|
<div class="line"><a id="l03123" name="l03123"></a><span class="lineno"> 3123</span> compact_assignment.get())) {</div>
|
|
<div class="line"><a id="l03124" name="l03124"></a><span class="lineno"> 3124</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l03125" name="l03125"></a><span class="lineno"> 3125</span> }</div>
|
|
<div class="line"><a id="l03126" name="l03126"></a><span class="lineno"> 3126</span> }</div>
|
|
<div class="line"><a id="l03127" name="l03127"></a><span class="lineno"> 3127</span> }</div>
|
|
<div class="line"><a id="l03128" name="l03128"></a><span class="lineno"> 3128</span> <span class="keywordflow">if</span> (check_compact_assignment &&</div>
|
|
<div class="line"><a id="l03129" name="l03129"></a><span class="lineno"> 3129</span> !solver_->CheckAssignment(compact_assignment.get())) {</div>
|
|
<div class="line"><a id="l03130" name="l03130"></a><span class="lineno"> 3130</span> <span class="comment">// TODO(user): clarify the expected trigger rate of this LOG.</span></div>
|
|
<div class="line"><a id="l03131" name="l03131"></a><span class="lineno"> 3131</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7">WARNING</a>) << <span class="stringliteral">"The compacted assignment is not a valid solution"</span>;</div>
|
|
<div class="line"><a id="l03132" name="l03132"></a><span class="lineno"> 3132</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l03133" name="l03133"></a><span class="lineno"> 3133</span> }</div>
|
|
<div class="line"><a id="l03134" name="l03134"></a><span class="lineno"> 3134</span> <span class="keywordflow">return</span> compact_assignment.release();</div>
|
|
<div class="line"><a id="l03135" name="l03135"></a><span class="lineno"> 3135</span>}</div>
|
|
<div class="line"><a id="l03136" name="l03136"></a><span class="lineno"> 3136</span> </div>
|
|
<div class="line"><a id="l03137" name="l03137"></a><span class="lineno"> 3137</span><span class="keywordtype">int</span> RoutingModel::FindNextActive(<span class="keywordtype">int</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>,</div>
|
|
<div class="line"><a id="l03138" name="l03138"></a><span class="lineno"> 3138</span> <span class="keyword">const</span> std::vector<int64_t>& indices)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03139" name="l03139"></a><span class="lineno"> 3139</span> ++<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>;</div>
|
|
<div class="line"><a id="l03140" name="l03140"></a><span class="lineno"> 3140</span> <a class="code hl_define" href="base_2logging_8h.html#ae4db23f10f5d4aad6d735f5a74cd6f8c">CHECK_LE</a>(0, <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l03141" name="l03141"></a><span class="lineno"> 3141</span> <span class="keyword">const</span> <span class="keywordtype">int</span> size = indices.size();</div>
|
|
<div class="line"><a id="l03142" name="l03142"></a><span class="lineno"> 3142</span> <span class="keywordflow">while</span> (<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < size && <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab1d54f34a26afd08eeef25e8725dd7c2">ActiveVar</a>(indices[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>])->Max() == 0) {</div>
|
|
<div class="line"><a id="l03143" name="l03143"></a><span class="lineno"> 3143</span> ++<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>;</div>
|
|
<div class="line"><a id="l03144" name="l03144"></a><span class="lineno"> 3144</span> }</div>
|
|
<div class="line"><a id="l03145" name="l03145"></a><span class="lineno"> 3145</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>;</div>
|
|
<div class="line"><a id="l03146" name="l03146"></a><span class="lineno"> 3146</span>}</div>
|
|
<div class="line"><a id="l03147" name="l03147"></a><span class="lineno"> 3147</span> </div>
|
|
<div class="line"><a id="l03148" name="l03148"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a7fcd2e6d28a2ac1d07f052bc8840a477"> 3148</a></span><a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a7fcd2e6d28a2ac1d07f052bc8840a477">RoutingModel::ApplyLocks</a>(<span class="keyword">const</span> std::vector<int64_t>& locks) {</div>
|
|
<div class="line"><a id="l03149" name="l03149"></a><span class="lineno"> 3149</span> <span class="comment">// TODO(user): Replace calls to this method with calls to</span></div>
|
|
<div class="line"><a id="l03150" name="l03150"></a><span class="lineno"> 3150</span> <span class="comment">// ApplyLocksToAllVehicles and remove this method?</span></div>
|
|
<div class="line"><a id="l03151" name="l03151"></a><span class="lineno"> 3151</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(vehicles_, 1);</div>
|
|
<div class="line"><a id="l03152" name="l03152"></a><span class="lineno"> 3152</span> preassignment_->Clear();</div>
|
|
<div class="line"><a id="l03153" name="l03153"></a><span class="lineno"> 3153</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* next_var = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l03154" name="l03154"></a><span class="lineno"> 3154</span> <span class="keywordtype">int</span> lock_index = FindNextActive(-1, locks);</div>
|
|
<div class="line"><a id="l03155" name="l03155"></a><span class="lineno"> 3155</span> <span class="keyword">const</span> <span class="keywordtype">int</span> size = locks.size();</div>
|
|
<div class="line"><a id="l03156" name="l03156"></a><span class="lineno"> 3156</span> <span class="keywordflow">if</span> (lock_index < size) {</div>
|
|
<div class="line"><a id="l03157" name="l03157"></a><span class="lineno"> 3157</span> next_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(locks[lock_index]);</div>
|
|
<div class="line"><a id="l03158" name="l03158"></a><span class="lineno"> 3158</span> preassignment_->Add(next_var);</div>
|
|
<div class="line"><a id="l03159" name="l03159"></a><span class="lineno"> 3159</span> <span class="keywordflow">for</span> (lock_index = FindNextActive(lock_index, locks); lock_index < size;</div>
|
|
<div class="line"><a id="l03160" name="l03160"></a><span class="lineno"> 3160</span> lock_index = FindNextActive(lock_index, locks)) {</div>
|
|
<div class="line"><a id="l03161" name="l03161"></a><span class="lineno"> 3161</span> preassignment_->SetValue(next_var, locks[lock_index]);</div>
|
|
<div class="line"><a id="l03162" name="l03162"></a><span class="lineno"> 3162</span> next_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(locks[lock_index]);</div>
|
|
<div class="line"><a id="l03163" name="l03163"></a><span class="lineno"> 3163</span> preassignment_->Add(next_var);</div>
|
|
<div class="line"><a id="l03164" name="l03164"></a><span class="lineno"> 3164</span> }</div>
|
|
<div class="line"><a id="l03165" name="l03165"></a><span class="lineno"> 3165</span> }</div>
|
|
<div class="line"><a id="l03166" name="l03166"></a><span class="lineno"> 3166</span> <span class="keywordflow">return</span> next_var;</div>
|
|
<div class="line"><a id="l03167" name="l03167"></a><span class="lineno"> 3167</span>}</div>
|
|
<div class="line"><a id="l03168" name="l03168"></a><span class="lineno"> 3168</span> </div>
|
|
<div class="line"><a id="l03169" name="l03169"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#ab9242d96967ff3b4e5bec3241831552b"> 3169</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab9242d96967ff3b4e5bec3241831552b">RoutingModel::ApplyLocksToAllVehicles</a>(</div>
|
|
<div class="line"><a id="l03170" name="l03170"></a><span class="lineno"> 3170</span> <span class="keyword">const</span> std::vector<std::vector<int64_t>>& locks, <span class="keywordtype">bool</span> close_routes) {</div>
|
|
<div class="line"><a id="l03171" name="l03171"></a><span class="lineno"> 3171</span> preassignment_->Clear();</div>
|
|
<div class="line"><a id="l03172" name="l03172"></a><span class="lineno"> 3172</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5b158fd970a1fb0cd98f6c3c324aa7d2">RoutesToAssignment</a>(locks, <span class="keyword">true</span>, close_routes, preassignment_);</div>
|
|
<div class="line"><a id="l03173" name="l03173"></a><span class="lineno"> 3173</span>}</div>
|
|
<div class="line"><a id="l03174" name="l03174"></a><span class="lineno"> 3174</span> </div>
|
|
<div class="line"><a id="l03175" name="l03175"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#ab207970f71285b3169cbb67aa4fb04f8"> 3175</a></span>int64_t <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab207970f71285b3169cbb67aa4fb04f8">RoutingModel::GetNumberOfDecisionsInFirstSolution</a>(</div>
|
|
<div class="line"><a id="l03176" name="l03176"></a><span class="lineno"> 3176</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_search_parameters.html">RoutingSearchParameters</a>& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03177" name="l03177"></a><span class="lineno"> 3177</span> <a class="code hl_class" href="classoperations__research_1_1_int_var_filtered_decision_builder.html">IntVarFilteredDecisionBuilder</a>* <span class="keyword">const</span> decision_builder =</div>
|
|
<div class="line"><a id="l03178" name="l03178"></a><span class="lineno"> 3178</span> GetFilteredFirstSolutionDecisionBuilderOrNull(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>);</div>
|
|
<div class="line"><a id="l03179" name="l03179"></a><span class="lineno"> 3179</span> <span class="keywordflow">return</span> decision_builder != <span class="keyword">nullptr</span> ? decision_builder-><a class="code hl_function" href="classoperations__research_1_1_int_var_filtered_decision_builder.html#aac2118d22c4275990bdd1fec28a2a8d3">number_of_decisions</a>()</div>
|
|
<div class="line"><a id="l03180" name="l03180"></a><span class="lineno"> 3180</span> : 0;</div>
|
|
<div class="line"><a id="l03181" name="l03181"></a><span class="lineno"> 3181</span>}</div>
|
|
<div class="line"><a id="l03182" name="l03182"></a><span class="lineno"> 3182</span> </div>
|
|
<div class="line"><a id="l03183" name="l03183"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#acc939d4c1da0e5db1bb694eda1d95994"> 3183</a></span>int64_t <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acc939d4c1da0e5db1bb694eda1d95994">RoutingModel::GetNumberOfRejectsInFirstSolution</a>(</div>
|
|
<div class="line"><a id="l03184" name="l03184"></a><span class="lineno"> 3184</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_search_parameters.html">RoutingSearchParameters</a>& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03185" name="l03185"></a><span class="lineno"> 3185</span> <a class="code hl_class" href="classoperations__research_1_1_int_var_filtered_decision_builder.html">IntVarFilteredDecisionBuilder</a>* <span class="keyword">const</span> decision_builder =</div>
|
|
<div class="line"><a id="l03186" name="l03186"></a><span class="lineno"> 3186</span> GetFilteredFirstSolutionDecisionBuilderOrNull(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>);</div>
|
|
<div class="line"><a id="l03187" name="l03187"></a><span class="lineno"> 3187</span> <span class="keywordflow">return</span> decision_builder != <span class="keyword">nullptr</span> ? decision_builder-><a class="code hl_function" href="classoperations__research_1_1_int_var_filtered_decision_builder.html#afd4b70bcd23086d4968db3a1d822ee2c">number_of_rejects</a>()</div>
|
|
<div class="line"><a id="l03188" name="l03188"></a><span class="lineno"> 3188</span> : 0;</div>
|
|
<div class="line"><a id="l03189" name="l03189"></a><span class="lineno"> 3189</span>}</div>
|
|
<div class="line"><a id="l03190" name="l03190"></a><span class="lineno"> 3190</span> </div>
|
|
<div class="line"><a id="l03191" name="l03191"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#acfcef421e8c8cd243157543f741d6a73"> 3191</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acfcef421e8c8cd243157543f741d6a73">RoutingModel::WriteAssignment</a>(<span class="keyword">const</span> std::string& file_name)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03192" name="l03192"></a><span class="lineno"> 3192</span> <span class="keywordflow">if</span> (collect_assignments_->solution_count() == 1 && assignment_ != <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l03193" name="l03193"></a><span class="lineno"> 3193</span> assignment_->CopyIntersection(collect_assignments_->solution(0));</div>
|
|
<div class="line"><a id="l03194" name="l03194"></a><span class="lineno"> 3194</span> <span class="keywordflow">return</span> assignment_->Save(file_name);</div>
|
|
<div class="line"><a id="l03195" name="l03195"></a><span class="lineno"> 3195</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l03196" name="l03196"></a><span class="lineno"> 3196</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l03197" name="l03197"></a><span class="lineno"> 3197</span> }</div>
|
|
<div class="line"><a id="l03198" name="l03198"></a><span class="lineno"> 3198</span>}</div>
|
|
<div class="line"><a id="l03199" name="l03199"></a><span class="lineno"> 3199</span> </div>
|
|
<div class="line"><a id="l03200" name="l03200"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a3d81f16de798be60f56cf03cd9b907cf"> 3200</a></span><a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a3d81f16de798be60f56cf03cd9b907cf">RoutingModel::ReadAssignment</a>(<span class="keyword">const</span> std::string& file_name) {</div>
|
|
<div class="line"><a id="l03201" name="l03201"></a><span class="lineno"> 3201</span> QuietCloseModel();</div>
|
|
<div class="line"><a id="l03202" name="l03202"></a><span class="lineno"> 3202</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(assignment_ != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l03203" name="l03203"></a><span class="lineno"> 3203</span> <span class="keywordflow">if</span> (assignment_->Load(file_name)) {</div>
|
|
<div class="line"><a id="l03204" name="l03204"></a><span class="lineno"> 3204</span> <span class="keywordflow">return</span> DoRestoreAssignment();</div>
|
|
<div class="line"><a id="l03205" name="l03205"></a><span class="lineno"> 3205</span> }</div>
|
|
<div class="line"><a id="l03206" name="l03206"></a><span class="lineno"> 3206</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l03207" name="l03207"></a><span class="lineno"> 3207</span>}</div>
|
|
<div class="line"><a id="l03208" name="l03208"></a><span class="lineno"> 3208</span> </div>
|
|
<div class="line"><a id="l03209" name="l03209"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a0d3987c3df07976d19f3165788fc97a9"> 3209</a></span><a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0d3987c3df07976d19f3165788fc97a9">RoutingModel::RestoreAssignment</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>& solution) {</div>
|
|
<div class="line"><a id="l03210" name="l03210"></a><span class="lineno"> 3210</span> QuietCloseModel();</div>
|
|
<div class="line"><a id="l03211" name="l03211"></a><span class="lineno"> 3211</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(assignment_ != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l03212" name="l03212"></a><span class="lineno"> 3212</span> assignment_->CopyIntersection(&solution);</div>
|
|
<div class="line"><a id="l03213" name="l03213"></a><span class="lineno"> 3213</span> <span class="keywordflow">return</span> DoRestoreAssignment();</div>
|
|
<div class="line"><a id="l03214" name="l03214"></a><span class="lineno"> 3214</span>}</div>
|
|
<div class="line"><a id="l03215" name="l03215"></a><span class="lineno"> 3215</span> </div>
|
|
<div class="line"><a id="l03216" name="l03216"></a><span class="lineno"> 3216</span><a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* RoutingModel::DoRestoreAssignment() {</div>
|
|
<div class="line"><a id="l03217" name="l03217"></a><span class="lineno"> 3217</span> <span class="keywordflow">if</span> (status_ == <a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70bae78ffdfdfc3eb7331c0ef91bdef8452b">ROUTING_INVALID</a>) {</div>
|
|
<div class="line"><a id="l03218" name="l03218"></a><span class="lineno"> 3218</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l03219" name="l03219"></a><span class="lineno"> 3219</span> }</div>
|
|
<div class="line"><a id="l03220" name="l03220"></a><span class="lineno"> 3220</span> solver_->Solve(restore_assignment_, monitors_);</div>
|
|
<div class="line"><a id="l03221" name="l03221"></a><span class="lineno"> 3221</span> <span class="keywordflow">if</span> (collect_assignments_->solution_count() == 1) {</div>
|
|
<div class="line"><a id="l03222" name="l03222"></a><span class="lineno"> 3222</span> status_ = <a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba09515ee36ef4715f09f3aa67f685011e">ROUTING_SUCCESS</a>;</div>
|
|
<div class="line"><a id="l03223" name="l03223"></a><span class="lineno"> 3223</span> <span class="keywordflow">return</span> collect_assignments_->solution(0);</div>
|
|
<div class="line"><a id="l03224" name="l03224"></a><span class="lineno"> 3224</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l03225" name="l03225"></a><span class="lineno"> 3225</span> status_ = <a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70baba9b2029e549c14c8a6b9f6201e329fd">ROUTING_FAIL</a>;</div>
|
|
<div class="line"><a id="l03226" name="l03226"></a><span class="lineno"> 3226</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l03227" name="l03227"></a><span class="lineno"> 3227</span> }</div>
|
|
<div class="line"><a id="l03228" name="l03228"></a><span class="lineno"> 3228</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l03229" name="l03229"></a><span class="lineno"> 3229</span>}</div>
|
|
<div class="line"><a id="l03230" name="l03230"></a><span class="lineno"> 3230</span> </div>
|
|
<div class="line"><a id="l03231" name="l03231"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a5b158fd970a1fb0cd98f6c3c324aa7d2"> 3231</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5b158fd970a1fb0cd98f6c3c324aa7d2">RoutingModel::RoutesToAssignment</a>(</div>
|
|
<div class="line"><a id="l03232" name="l03232"></a><span class="lineno"> 3232</span> <span class="keyword">const</span> std::vector<std::vector<int64_t>>& routes,</div>
|
|
<div class="line"><a id="l03233" name="l03233"></a><span class="lineno"> 3233</span> <span class="keywordtype">bool</span> ignore_inactive_indices, <span class="keywordtype">bool</span> close_routes,</div>
|
|
<div class="line"><a id="l03234" name="l03234"></a><span class="lineno"> 3234</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* <span class="keyword">const</span> assignment)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03235" name="l03235"></a><span class="lineno"> 3235</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(assignment != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l03236" name="l03236"></a><span class="lineno"> 3236</span> <span class="keywordflow">if</span> (!closed_) {</div>
|
|
<div class="line"><a id="l03237" name="l03237"></a><span class="lineno"> 3237</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67">ERROR</a>) << <span class="stringliteral">"The model is not closed yet"</span>;</div>
|
|
<div class="line"><a id="l03238" name="l03238"></a><span class="lineno"> 3238</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l03239" name="l03239"></a><span class="lineno"> 3239</span> }</div>
|
|
<div class="line"><a id="l03240" name="l03240"></a><span class="lineno"> 3240</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_routes = routes.size();</div>
|
|
<div class="line"><a id="l03241" name="l03241"></a><span class="lineno"> 3241</span> <span class="keywordflow">if</span> (num_routes > vehicles_) {</div>
|
|
<div class="line"><a id="l03242" name="l03242"></a><span class="lineno"> 3242</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67">ERROR</a>) << <span class="stringliteral">"The number of vehicles in the assignment ("</span> << routes.size()</div>
|
|
<div class="line"><a id="l03243" name="l03243"></a><span class="lineno"> 3243</span> << <span class="stringliteral">") is greater than the number of vehicles in the model ("</span></div>
|
|
<div class="line"><a id="l03244" name="l03244"></a><span class="lineno"> 3244</span> << vehicles_ << <span class="stringliteral">")"</span>;</div>
|
|
<div class="line"><a id="l03245" name="l03245"></a><span class="lineno"> 3245</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l03246" name="l03246"></a><span class="lineno"> 3246</span> }</div>
|
|
<div class="line"><a id="l03247" name="l03247"></a><span class="lineno"> 3247</span> </div>
|
|
<div class="line"><a id="l03248" name="l03248"></a><span class="lineno"> 3248</span> absl::flat_hash_set<int> visited_indices;</div>
|
|
<div class="line"><a id="l03249" name="l03249"></a><span class="lineno"> 3249</span> <span class="comment">// Set value to NextVars based on the routes.</span></div>
|
|
<div class="line"><a id="l03250" name="l03250"></a><span class="lineno"> 3250</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < num_routes; ++vehicle) {</div>
|
|
<div class="line"><a id="l03251" name="l03251"></a><span class="lineno"> 3251</span> <span class="keyword">const</span> std::vector<int64_t>& route = routes[vehicle];</div>
|
|
<div class="line"><a id="l03252" name="l03252"></a><span class="lineno"> 3252</span> <span class="keywordtype">int</span> from_index = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(vehicle);</div>
|
|
<div class="line"><a id="l03253" name="l03253"></a><span class="lineno"> 3253</span> std::pair<absl::flat_hash_set<int>::iterator, <span class="keywordtype">bool</span>> insert_result =</div>
|
|
<div class="line"><a id="l03254" name="l03254"></a><span class="lineno"> 3254</span> visited_indices.insert(from_index);</div>
|
|
<div class="line"><a id="l03255" name="l03255"></a><span class="lineno"> 3255</span> <span class="keywordflow">if</span> (!insert_result.second) {</div>
|
|
<div class="line"><a id="l03256" name="l03256"></a><span class="lineno"> 3256</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67">ERROR</a>) << <span class="stringliteral">"Index "</span> << from_index << <span class="stringliteral">" (start node for vehicle "</span></div>
|
|
<div class="line"><a id="l03257" name="l03257"></a><span class="lineno"> 3257</span> << vehicle << <span class="stringliteral">") was already used"</span>;</div>
|
|
<div class="line"><a id="l03258" name="l03258"></a><span class="lineno"> 3258</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l03259" name="l03259"></a><span class="lineno"> 3259</span> }</div>
|
|
<div class="line"><a id="l03260" name="l03260"></a><span class="lineno"> 3260</span> </div>
|
|
<div class="line"><a id="l03261" name="l03261"></a><span class="lineno"> 3261</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> int64_t to_index : route) {</div>
|
|
<div class="line"><a id="l03262" name="l03262"></a><span class="lineno"> 3262</span> <span class="keywordflow">if</span> (to_index < 0 || to_index >= <a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#a24926108b770033792d015cb86aeffb3">Size</a>()) {</div>
|
|
<div class="line"><a id="l03263" name="l03263"></a><span class="lineno"> 3263</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67">ERROR</a>) << <span class="stringliteral">"Invalid index: "</span> << to_index;</div>
|
|
<div class="line"><a id="l03264" name="l03264"></a><span class="lineno"> 3264</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l03265" name="l03265"></a><span class="lineno"> 3265</span> }</div>
|
|
<div class="line"><a id="l03266" name="l03266"></a><span class="lineno"> 3266</span> </div>
|
|
<div class="line"><a id="l03267" name="l03267"></a><span class="lineno"> 3267</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> active_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab1d54f34a26afd08eeef25e8725dd7c2">ActiveVar</a>(to_index);</div>
|
|
<div class="line"><a id="l03268" name="l03268"></a><span class="lineno"> 3268</span> <span class="keywordflow">if</span> (active_var-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#ac84c250d67f30c89e845cd460eeaaad8">Max</a>() == 0) {</div>
|
|
<div class="line"><a id="l03269" name="l03269"></a><span class="lineno"> 3269</span> <span class="keywordflow">if</span> (ignore_inactive_indices) {</div>
|
|
<div class="line"><a id="l03270" name="l03270"></a><span class="lineno"> 3270</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l03271" name="l03271"></a><span class="lineno"> 3271</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l03272" name="l03272"></a><span class="lineno"> 3272</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67">ERROR</a>) << <span class="stringliteral">"Index "</span> << to_index << <span class="stringliteral">" is not active"</span>;</div>
|
|
<div class="line"><a id="l03273" name="l03273"></a><span class="lineno"> 3273</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l03274" name="l03274"></a><span class="lineno"> 3274</span> }</div>
|
|
<div class="line"><a id="l03275" name="l03275"></a><span class="lineno"> 3275</span> }</div>
|
|
<div class="line"><a id="l03276" name="l03276"></a><span class="lineno"> 3276</span> </div>
|
|
<div class="line"><a id="l03277" name="l03277"></a><span class="lineno"> 3277</span> insert_result = visited_indices.insert(to_index);</div>
|
|
<div class="line"><a id="l03278" name="l03278"></a><span class="lineno"> 3278</span> <span class="keywordflow">if</span> (!insert_result.second) {</div>
|
|
<div class="line"><a id="l03279" name="l03279"></a><span class="lineno"> 3279</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67">ERROR</a>) << <span class="stringliteral">"Index "</span> << to_index << <span class="stringliteral">" is used multiple times"</span>;</div>
|
|
<div class="line"><a id="l03280" name="l03280"></a><span class="lineno"> 3280</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l03281" name="l03281"></a><span class="lineno"> 3281</span> }</div>
|
|
<div class="line"><a id="l03282" name="l03282"></a><span class="lineno"> 3282</span> </div>
|
|
<div class="line"><a id="l03283" name="l03283"></a><span class="lineno"> 3283</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> vehicle_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">VehicleVar</a>(to_index);</div>
|
|
<div class="line"><a id="l03284" name="l03284"></a><span class="lineno"> 3284</span> <span class="keywordflow">if</span> (!vehicle_var-><a class="code hl_function" href="classoperations__research_1_1_int_var.html#a0723abf37f7a5a8a604fd1bcd96a7be0">Contains</a>(vehicle)) {</div>
|
|
<div class="line"><a id="l03285" name="l03285"></a><span class="lineno"> 3285</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67">ERROR</a>) << <span class="stringliteral">"Vehicle "</span> << vehicle << <span class="stringliteral">" is not allowed at index "</span></div>
|
|
<div class="line"><a id="l03286" name="l03286"></a><span class="lineno"> 3286</span> << to_index;</div>
|
|
<div class="line"><a id="l03287" name="l03287"></a><span class="lineno"> 3287</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l03288" name="l03288"></a><span class="lineno"> 3288</span> }</div>
|
|
<div class="line"><a id="l03289" name="l03289"></a><span class="lineno"> 3289</span> </div>
|
|
<div class="line"><a id="l03290" name="l03290"></a><span class="lineno"> 3290</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> from_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(from_index);</div>
|
|
<div class="line"><a id="l03291" name="l03291"></a><span class="lineno"> 3291</span> <span class="keywordflow">if</span> (!assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#a60e7fa8388801a72e31391e8203a9464">Contains</a>(from_var)) {</div>
|
|
<div class="line"><a id="l03292" name="l03292"></a><span class="lineno"> 3292</span> assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb">Add</a>(from_var);</div>
|
|
<div class="line"><a id="l03293" name="l03293"></a><span class="lineno"> 3293</span> }</div>
|
|
<div class="line"><a id="l03294" name="l03294"></a><span class="lineno"> 3294</span> assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#a88515905299f569432aaba577a912add">SetValue</a>(from_var, to_index);</div>
|
|
<div class="line"><a id="l03295" name="l03295"></a><span class="lineno"> 3295</span> </div>
|
|
<div class="line"><a id="l03296" name="l03296"></a><span class="lineno"> 3296</span> from_index = to_index;</div>
|
|
<div class="line"><a id="l03297" name="l03297"></a><span class="lineno"> 3297</span> }</div>
|
|
<div class="line"><a id="l03298" name="l03298"></a><span class="lineno"> 3298</span> </div>
|
|
<div class="line"><a id="l03299" name="l03299"></a><span class="lineno"> 3299</span> <span class="keywordflow">if</span> (close_routes) {</div>
|
|
<div class="line"><a id="l03300" name="l03300"></a><span class="lineno"> 3300</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> last_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(from_index);</div>
|
|
<div class="line"><a id="l03301" name="l03301"></a><span class="lineno"> 3301</span> <span class="keywordflow">if</span> (!assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#a60e7fa8388801a72e31391e8203a9464">Contains</a>(last_var)) {</div>
|
|
<div class="line"><a id="l03302" name="l03302"></a><span class="lineno"> 3302</span> assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb">Add</a>(last_var);</div>
|
|
<div class="line"><a id="l03303" name="l03303"></a><span class="lineno"> 3303</span> }</div>
|
|
<div class="line"><a id="l03304" name="l03304"></a><span class="lineno"> 3304</span> assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#a88515905299f569432aaba577a912add">SetValue</a>(last_var, <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afb80fd36c1fb57d2db049403483e2074">End</a>(vehicle));</div>
|
|
<div class="line"><a id="l03305" name="l03305"></a><span class="lineno"> 3305</span> }</div>
|
|
<div class="line"><a id="l03306" name="l03306"></a><span class="lineno"> 3306</span> }</div>
|
|
<div class="line"><a id="l03307" name="l03307"></a><span class="lineno"> 3307</span> </div>
|
|
<div class="line"><a id="l03308" name="l03308"></a><span class="lineno"> 3308</span> <span class="comment">// Do not use the remaining vehicles.</span></div>
|
|
<div class="line"><a id="l03309" name="l03309"></a><span class="lineno"> 3309</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = num_routes; vehicle < vehicles_; ++vehicle) {</div>
|
|
<div class="line"><a id="l03310" name="l03310"></a><span class="lineno"> 3310</span> <span class="keyword">const</span> <span class="keywordtype">int</span> start_index = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(vehicle);</div>
|
|
<div class="line"><a id="l03311" name="l03311"></a><span class="lineno"> 3311</span> <span class="comment">// Even if close_routes is false, we still need to add the start index to</span></div>
|
|
<div class="line"><a id="l03312" name="l03312"></a><span class="lineno"> 3312</span> <span class="comment">// visited_indices so that deactivating other nodes works correctly.</span></div>
|
|
<div class="line"><a id="l03313" name="l03313"></a><span class="lineno"> 3313</span> std::pair<absl::flat_hash_set<int>::iterator, <span class="keywordtype">bool</span>> insert_result =</div>
|
|
<div class="line"><a id="l03314" name="l03314"></a><span class="lineno"> 3314</span> visited_indices.insert(start_index);</div>
|
|
<div class="line"><a id="l03315" name="l03315"></a><span class="lineno"> 3315</span> <span class="keywordflow">if</span> (!insert_result.second) {</div>
|
|
<div class="line"><a id="l03316" name="l03316"></a><span class="lineno"> 3316</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67">ERROR</a>) << <span class="stringliteral">"Index "</span> << start_index << <span class="stringliteral">" is used multiple times"</span>;</div>
|
|
<div class="line"><a id="l03317" name="l03317"></a><span class="lineno"> 3317</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l03318" name="l03318"></a><span class="lineno"> 3318</span> }</div>
|
|
<div class="line"><a id="l03319" name="l03319"></a><span class="lineno"> 3319</span> <span class="keywordflow">if</span> (close_routes) {</div>
|
|
<div class="line"><a id="l03320" name="l03320"></a><span class="lineno"> 3320</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> start_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(start_index);</div>
|
|
<div class="line"><a id="l03321" name="l03321"></a><span class="lineno"> 3321</span> <span class="keywordflow">if</span> (!assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#a60e7fa8388801a72e31391e8203a9464">Contains</a>(start_var)) {</div>
|
|
<div class="line"><a id="l03322" name="l03322"></a><span class="lineno"> 3322</span> assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb">Add</a>(start_var);</div>
|
|
<div class="line"><a id="l03323" name="l03323"></a><span class="lineno"> 3323</span> }</div>
|
|
<div class="line"><a id="l03324" name="l03324"></a><span class="lineno"> 3324</span> assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#a88515905299f569432aaba577a912add">SetValue</a>(start_var, <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afb80fd36c1fb57d2db049403483e2074">End</a>(vehicle));</div>
|
|
<div class="line"><a id="l03325" name="l03325"></a><span class="lineno"> 3325</span> }</div>
|
|
<div class="line"><a id="l03326" name="l03326"></a><span class="lineno"> 3326</span> }</div>
|
|
<div class="line"><a id="l03327" name="l03327"></a><span class="lineno"> 3327</span> </div>
|
|
<div class="line"><a id="l03328" name="l03328"></a><span class="lineno"> 3328</span> <span class="comment">// Deactivate other nodes (by pointing them to themselves).</span></div>
|
|
<div class="line"><a id="l03329" name="l03329"></a><span class="lineno"> 3329</span> <span class="keywordflow">if</span> (close_routes) {</div>
|
|
<div class="line"><a id="l03330" name="l03330"></a><span class="lineno"> 3330</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = 0; <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < <a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#a24926108b770033792d015cb86aeffb3">Size</a>(); ++<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>) {</div>
|
|
<div class="line"><a id="l03331" name="l03331"></a><span class="lineno"> 3331</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="namespacegtl.html#aae28e97bd1fa93cb0032642550da7455">gtl::ContainsKey</a>(visited_indices, <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)) {</div>
|
|
<div class="line"><a id="l03332" name="l03332"></a><span class="lineno"> 3332</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> next_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l03333" name="l03333"></a><span class="lineno"> 3333</span> <span class="keywordflow">if</span> (!assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#a60e7fa8388801a72e31391e8203a9464">Contains</a>(next_var)) {</div>
|
|
<div class="line"><a id="l03334" name="l03334"></a><span class="lineno"> 3334</span> assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb">Add</a>(next_var);</div>
|
|
<div class="line"><a id="l03335" name="l03335"></a><span class="lineno"> 3335</span> }</div>
|
|
<div class="line"><a id="l03336" name="l03336"></a><span class="lineno"> 3336</span> assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#a88515905299f569432aaba577a912add">SetValue</a>(next_var, <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l03337" name="l03337"></a><span class="lineno"> 3337</span> }</div>
|
|
<div class="line"><a id="l03338" name="l03338"></a><span class="lineno"> 3338</span> }</div>
|
|
<div class="line"><a id="l03339" name="l03339"></a><span class="lineno"> 3339</span> }</div>
|
|
<div class="line"><a id="l03340" name="l03340"></a><span class="lineno"> 3340</span> </div>
|
|
<div class="line"><a id="l03341" name="l03341"></a><span class="lineno"> 3341</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l03342" name="l03342"></a><span class="lineno"> 3342</span>}</div>
|
|
<div class="line"><a id="l03343" name="l03343"></a><span class="lineno"> 3343</span> </div>
|
|
<div class="line"><a id="l03344" name="l03344"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a64ae94fd93be72fc5872e9fe27a8c8ab"> 3344</a></span><a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a64ae94fd93be72fc5872e9fe27a8c8ab">RoutingModel::ReadAssignmentFromRoutes</a>(</div>
|
|
<div class="line"><a id="l03345" name="l03345"></a><span class="lineno"> 3345</span> <span class="keyword">const</span> std::vector<std::vector<int64_t>>& routes,</div>
|
|
<div class="line"><a id="l03346" name="l03346"></a><span class="lineno"> 3346</span> <span class="keywordtype">bool</span> ignore_inactive_indices) {</div>
|
|
<div class="line"><a id="l03347" name="l03347"></a><span class="lineno"> 3347</span> QuietCloseModel();</div>
|
|
<div class="line"><a id="l03348" name="l03348"></a><span class="lineno"> 3348</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5b158fd970a1fb0cd98f6c3c324aa7d2">RoutesToAssignment</a>(routes, ignore_inactive_indices, <span class="keyword">true</span>, assignment_)) {</div>
|
|
<div class="line"><a id="l03349" name="l03349"></a><span class="lineno"> 3349</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l03350" name="l03350"></a><span class="lineno"> 3350</span> }</div>
|
|
<div class="line"><a id="l03351" name="l03351"></a><span class="lineno"> 3351</span> <span class="comment">// DoRestoreAssignment() might still fail when checking constraints (most</span></div>
|
|
<div class="line"><a id="l03352" name="l03352"></a><span class="lineno"> 3352</span> <span class="comment">// constraints are not verified by RoutesToAssignment) or when filling in</span></div>
|
|
<div class="line"><a id="l03353" name="l03353"></a><span class="lineno"> 3353</span> <span class="comment">// dimension variables.</span></div>
|
|
<div class="line"><a id="l03354" name="l03354"></a><span class="lineno"> 3354</span> <span class="keywordflow">return</span> DoRestoreAssignment();</div>
|
|
<div class="line"><a id="l03355" name="l03355"></a><span class="lineno"> 3355</span>}</div>
|
|
<div class="line"><a id="l03356" name="l03356"></a><span class="lineno"> 3356</span> </div>
|
|
<div class="line"><a id="l03357" name="l03357"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a85555955bff836046b755e58e363f1a2"> 3357</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a85555955bff836046b755e58e363f1a2">RoutingModel::AssignmentToRoutes</a>(</div>
|
|
<div class="line"><a id="l03358" name="l03358"></a><span class="lineno"> 3358</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>& assignment,</div>
|
|
<div class="line"><a id="l03359" name="l03359"></a><span class="lineno"> 3359</span> std::vector<std::vector<int64_t>>* <span class="keyword">const</span> routes)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03360" name="l03360"></a><span class="lineno"> 3360</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(closed_);</div>
|
|
<div class="line"><a id="l03361" name="l03361"></a><span class="lineno"> 3361</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(routes != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l03362" name="l03362"></a><span class="lineno"> 3362</span> </div>
|
|
<div class="line"><a id="l03363" name="l03363"></a><span class="lineno"> 3363</span> <span class="keyword">const</span> <span class="keywordtype">int</span> model_size = <a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#a24926108b770033792d015cb86aeffb3">Size</a>();</div>
|
|
<div class="line"><a id="l03364" name="l03364"></a><span class="lineno"> 3364</span> routes->resize(vehicles_);</div>
|
|
<div class="line"><a id="l03365" name="l03365"></a><span class="lineno"> 3365</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < vehicles_; ++vehicle) {</div>
|
|
<div class="line"><a id="l03366" name="l03366"></a><span class="lineno"> 3366</span> std::vector<int64_t>* <span class="keyword">const</span> vehicle_route = &routes->at(vehicle);</div>
|
|
<div class="line"><a id="l03367" name="l03367"></a><span class="lineno"> 3367</span> vehicle_route->clear();</div>
|
|
<div class="line"><a id="l03368" name="l03368"></a><span class="lineno"> 3368</span> </div>
|
|
<div class="line"><a id="l03369" name="l03369"></a><span class="lineno"> 3369</span> <span class="keywordtype">int</span> num_visited_indices = 0;</div>
|
|
<div class="line"><a id="l03370" name="l03370"></a><span class="lineno"> 3370</span> <span class="keyword">const</span> <span class="keywordtype">int</span> first_index = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(vehicle);</div>
|
|
<div class="line"><a id="l03371" name="l03371"></a><span class="lineno"> 3371</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> first_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(first_index);</div>
|
|
<div class="line"><a id="l03372" name="l03372"></a><span class="lineno"> 3372</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#a60e7fa8388801a72e31391e8203a9464">Contains</a>(first_var));</div>
|
|
<div class="line"><a id="l03373" name="l03373"></a><span class="lineno"> 3373</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#aecf5d63faebdaeda9dca52f916576459">Bound</a>(first_var));</div>
|
|
<div class="line"><a id="l03374" name="l03374"></a><span class="lineno"> 3374</span> <span class="keywordtype">int</span> current_index = assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#a8e0cac088b44596d620963b8bc693770">Value</a>(first_var);</div>
|
|
<div class="line"><a id="l03375" name="l03375"></a><span class="lineno"> 3375</span> <span class="keywordflow">while</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(current_index)) {</div>
|
|
<div class="line"><a id="l03376" name="l03376"></a><span class="lineno"> 3376</span> vehicle_route->push_back(current_index);</div>
|
|
<div class="line"><a id="l03377" name="l03377"></a><span class="lineno"> 3377</span> </div>
|
|
<div class="line"><a id="l03378" name="l03378"></a><span class="lineno"> 3378</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> next_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(current_index);</div>
|
|
<div class="line"><a id="l03379" name="l03379"></a><span class="lineno"> 3379</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#a60e7fa8388801a72e31391e8203a9464">Contains</a>(next_var));</div>
|
|
<div class="line"><a id="l03380" name="l03380"></a><span class="lineno"> 3380</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#aecf5d63faebdaeda9dca52f916576459">Bound</a>(next_var));</div>
|
|
<div class="line"><a id="l03381" name="l03381"></a><span class="lineno"> 3381</span> current_index = assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#a8e0cac088b44596d620963b8bc693770">Value</a>(next_var);</div>
|
|
<div class="line"><a id="l03382" name="l03382"></a><span class="lineno"> 3382</span> </div>
|
|
<div class="line"><a id="l03383" name="l03383"></a><span class="lineno"> 3383</span> ++num_visited_indices;</div>
|
|
<div class="line"><a id="l03384" name="l03384"></a><span class="lineno"> 3384</span> <a class="code hl_define" href="base_2logging_8h.html#ae4db23f10f5d4aad6d735f5a74cd6f8c">CHECK_LE</a>(num_visited_indices, model_size)</div>
|
|
<div class="line"><a id="l03385" name="l03385"></a><span class="lineno"> 3385</span> << <span class="stringliteral">"The assignment contains a cycle"</span>;</div>
|
|
<div class="line"><a id="l03386" name="l03386"></a><span class="lineno"> 3386</span> }</div>
|
|
<div class="line"><a id="l03387" name="l03387"></a><span class="lineno"> 3387</span> }</div>
|
|
<div class="line"><a id="l03388" name="l03388"></a><span class="lineno"> 3388</span>}</div>
|
|
<div class="line"><a id="l03389" name="l03389"></a><span class="lineno"> 3389</span> </div>
|
|
<div class="line"><a id="l03390" name="l03390"></a><span class="lineno"> 3390</span><span class="preprocessor">#ifndef SWIG</span></div>
|
|
<div class="line"><a id="l03391" name="l03391"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#aa12303c2dedbd81a69f237f67fa784c5"> 3391</a></span>std::vector<std::vector<int64_t>> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa12303c2dedbd81a69f237f67fa784c5">RoutingModel::GetRoutesFromAssignment</a>(</div>
|
|
<div class="line"><a id="l03392" name="l03392"></a><span class="lineno"> 3392</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>& assignment) {</div>
|
|
<div class="line"><a id="l03393" name="l03393"></a><span class="lineno"> 3393</span> std::vector<std::vector<int64_t>> route_indices(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>());</div>
|
|
<div class="line"><a id="l03394" name="l03394"></a><span class="lineno"> 3394</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++vehicle) {</div>
|
|
<div class="line"><a id="l03395" name="l03395"></a><span class="lineno"> 3395</span> <span class="keywordflow">if</span> (!assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#aecf5d63faebdaeda9dca52f916576459">Bound</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(vehicle))) {</div>
|
|
<div class="line"><a id="l03396" name="l03396"></a><span class="lineno"> 3396</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(DFATAL) << <span class="stringliteral">"GetRoutesFromAssignment() called on incomplete solution:"</span></div>
|
|
<div class="line"><a id="l03397" name="l03397"></a><span class="lineno"> 3397</span> << <span class="stringliteral">" NextVar("</span> << vehicle << <span class="stringliteral">") is unbound."</span>;</div>
|
|
<div class="line"><a id="l03398" name="l03398"></a><span class="lineno"> 3398</span> }</div>
|
|
<div class="line"><a id="l03399" name="l03399"></a><span class="lineno"> 3399</span> }</div>
|
|
<div class="line"><a id="l03400" name="l03400"></a><span class="lineno"> 3400</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++vehicle) {</div>
|
|
<div class="line"><a id="l03401" name="l03401"></a><span class="lineno"> 3401</span> int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(vehicle);</div>
|
|
<div class="line"><a id="l03402" name="l03402"></a><span class="lineno"> 3402</span> route_indices[vehicle].push_back(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l03403" name="l03403"></a><span class="lineno"> 3403</span> <span class="keywordflow">while</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)) {</div>
|
|
<div class="line"><a id="l03404" name="l03404"></a><span class="lineno"> 3404</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#a8e0cac088b44596d620963b8bc693770">Value</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>));</div>
|
|
<div class="line"><a id="l03405" name="l03405"></a><span class="lineno"> 3405</span> route_indices[vehicle].push_back(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l03406" name="l03406"></a><span class="lineno"> 3406</span> }</div>
|
|
<div class="line"><a id="l03407" name="l03407"></a><span class="lineno"> 3407</span> }</div>
|
|
<div class="line"><a id="l03408" name="l03408"></a><span class="lineno"> 3408</span> <span class="keywordflow">return</span> route_indices;</div>
|
|
<div class="line"><a id="l03409" name="l03409"></a><span class="lineno"> 3409</span>}</div>
|
|
<div class="line"><a id="l03410" name="l03410"></a><span class="lineno"> 3410</span><span class="preprocessor">#endif</span></div>
|
|
<div class="line"><a id="l03411" name="l03411"></a><span class="lineno"> 3411</span> </div>
|
|
<div class="line"><a id="l03412" name="l03412"></a><span class="lineno"> 3412</span>int64_t RoutingModel::GetArcCostForClassInternal(</div>
|
|
<div class="line"><a id="l03413" name="l03413"></a><span class="lineno"> 3413</span> int64_t from_index, int64_t to_index,</div>
|
|
<div class="line"><a id="l03414" name="l03414"></a><span class="lineno"> 3414</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#ad13ad202092298b43c9099b212c54d3d">CostClassIndex</a> cost_class_index)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03415" name="l03415"></a><span class="lineno"> 3415</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(closed_);</div>
|
|
<div class="line"><a id="l03416" name="l03416"></a><span class="lineno"> 3416</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(cost_class_index, 0);</div>
|
|
<div class="line"><a id="l03417" name="l03417"></a><span class="lineno"> 3417</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(cost_class_index, cost_classes_.size());</div>
|
|
<div class="line"><a id="l03418" name="l03418"></a><span class="lineno"> 3418</span> CostCacheElement* <span class="keyword">const</span> cache = &cost_cache_[from_index];</div>
|
|
<div class="line"><a id="l03419" name="l03419"></a><span class="lineno"> 3419</span> <span class="comment">// See the comment in CostCacheElement in the .h for the int64_t->int cast.</span></div>
|
|
<div class="line"><a id="l03420" name="l03420"></a><span class="lineno"> 3420</span> <span class="keywordflow">if</span> (cache->index == <span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(to_index) &&</div>
|
|
<div class="line"><a id="l03421" name="l03421"></a><span class="lineno"> 3421</span> cache->cost_class_index == cost_class_index) {</div>
|
|
<div class="line"><a id="l03422" name="l03422"></a><span class="lineno"> 3422</span> <span class="keywordflow">return</span> cache->cost;</div>
|
|
<div class="line"><a id="l03423" name="l03423"></a><span class="lineno"> 3423</span> }</div>
|
|
<div class="line"><a id="l03424" name="l03424"></a><span class="lineno"> 3424</span> int64_t <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a> = 0;</div>
|
|
<div class="line"><a id="l03425" name="l03425"></a><span class="lineno"> 3425</span> <span class="keyword">const</span> CostClass& cost_class = cost_classes_[cost_class_index];</div>
|
|
<div class="line"><a id="l03426" name="l03426"></a><span class="lineno"> 3426</span> <span class="keyword">const</span> <span class="keyword">auto</span>& evaluator = transit_evaluators_[cost_class.evaluator_index];</div>
|
|
<div class="line"><a id="l03427" name="l03427"></a><span class="lineno"> 3427</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a3582f01eabc65ba4b801215ca6420a7c">IsStart</a>(from_index)) {</div>
|
|
<div class="line"><a id="l03428" name="l03428"></a><span class="lineno"> 3428</span> <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a> = <a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(evaluator(from_index, to_index),</div>
|
|
<div class="line"><a id="l03429" name="l03429"></a><span class="lineno"> 3429</span> GetDimensionTransitCostSum(from_index, to_index, cost_class));</div>
|
|
<div class="line"><a id="l03430" name="l03430"></a><span class="lineno"> 3430</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(to_index)) {</div>
|
|
<div class="line"><a id="l03431" name="l03431"></a><span class="lineno"> 3431</span> <span class="comment">// Apply route fixed cost on first non-first/last node, in other words on</span></div>
|
|
<div class="line"><a id="l03432" name="l03432"></a><span class="lineno"> 3432</span> <span class="comment">// the arc from the first node to its next node if it's not the last node.</span></div>
|
|
<div class="line"><a id="l03433" name="l03433"></a><span class="lineno"> 3433</span> <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a> = <a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(</div>
|
|
<div class="line"><a id="l03434" name="l03434"></a><span class="lineno"> 3434</span> evaluator(from_index, to_index),</div>
|
|
<div class="line"><a id="l03435" name="l03435"></a><span class="lineno"> 3435</span> <a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(GetDimensionTransitCostSum(from_index, to_index, cost_class),</div>
|
|
<div class="line"><a id="l03436" name="l03436"></a><span class="lineno"> 3436</span> fixed_cost_of_vehicle_[index_to_vehicle_[from_index]]));</div>
|
|
<div class="line"><a id="l03437" name="l03437"></a><span class="lineno"> 3437</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l03438" name="l03438"></a><span class="lineno"> 3438</span> <span class="comment">// If there's only the first and last nodes on the route, it is considered</span></div>
|
|
<div class="line"><a id="l03439" name="l03439"></a><span class="lineno"> 3439</span> <span class="comment">// as an empty route.</span></div>
|
|
<div class="line"><a id="l03440" name="l03440"></a><span class="lineno"> 3440</span> <span class="keywordflow">if</span> (consider_empty_route_costs_[index_to_vehicle_[from_index]]) {</div>
|
|
<div class="line"><a id="l03441" name="l03441"></a><span class="lineno"> 3441</span> <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a> =</div>
|
|
<div class="line"><a id="l03442" name="l03442"></a><span class="lineno"> 3442</span> <a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(evaluator(from_index, to_index),</div>
|
|
<div class="line"><a id="l03443" name="l03443"></a><span class="lineno"> 3443</span> GetDimensionTransitCostSum(from_index, to_index, cost_class));</div>
|
|
<div class="line"><a id="l03444" name="l03444"></a><span class="lineno"> 3444</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l03445" name="l03445"></a><span class="lineno"> 3445</span> <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a> = 0;</div>
|
|
<div class="line"><a id="l03446" name="l03446"></a><span class="lineno"> 3446</span> }</div>
|
|
<div class="line"><a id="l03447" name="l03447"></a><span class="lineno"> 3447</span> }</div>
|
|
<div class="line"><a id="l03448" name="l03448"></a><span class="lineno"> 3448</span> *cache = {<span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(to_index), cost_class_index, <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a>};</div>
|
|
<div class="line"><a id="l03449" name="l03449"></a><span class="lineno"> 3449</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a>;</div>
|
|
<div class="line"><a id="l03450" name="l03450"></a><span class="lineno"> 3450</span>}</div>
|
|
<div class="line"><a id="l03451" name="l03451"></a><span class="lineno"> 3451</span> </div>
|
|
<div class="line"><a id="l03452" name="l03452"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a3582f01eabc65ba4b801215ca6420a7c"> 3452</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a3582f01eabc65ba4b801215ca6420a7c">RoutingModel::IsStart</a>(int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03453" name="l03453"></a><span class="lineno"> 3453</span> <span class="keywordflow">return</span> !<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>) && index_to_vehicle_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>] != <a class="code hl_variable" href="namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955">kUnassigned</a>;</div>
|
|
<div class="line"><a id="l03454" name="l03454"></a><span class="lineno"> 3454</span>}</div>
|
|
<div class="line"><a id="l03455" name="l03455"></a><span class="lineno"> 3455</span> </div>
|
|
<div class="line"><a id="l03456" name="l03456"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#aedb8dca94b15e5465fef1667d1a81db6"> 3456</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aedb8dca94b15e5465fef1667d1a81db6">RoutingModel::IsVehicleUsed</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>& assignment,</div>
|
|
<div class="line"><a id="l03457" name="l03457"></a><span class="lineno"> 3457</span> <span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03458" name="l03458"></a><span class="lineno"> 3458</span> <a class="code hl_define" href="base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9">CHECK_GE</a>(vehicle, 0);</div>
|
|
<div class="line"><a id="l03459" name="l03459"></a><span class="lineno"> 3459</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(vehicle, vehicles_);</div>
|
|
<div class="line"><a id="l03460" name="l03460"></a><span class="lineno"> 3460</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(solver_.get(), assignment.<a class="code hl_function" href="classoperations__research_1_1_propagation_base_object.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>());</div>
|
|
<div class="line"><a id="l03461" name="l03461"></a><span class="lineno"> 3461</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> start_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(vehicle));</div>
|
|
<div class="line"><a id="l03462" name="l03462"></a><span class="lineno"> 3462</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#a60e7fa8388801a72e31391e8203a9464">Contains</a>(start_var));</div>
|
|
<div class="line"><a id="l03463" name="l03463"></a><span class="lineno"> 3463</span> <span class="keywordflow">return</span> !<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#a8e0cac088b44596d620963b8bc693770">Value</a>(start_var));</div>
|
|
<div class="line"><a id="l03464" name="l03464"></a><span class="lineno"> 3464</span>}</div>
|
|
<div class="line"><a id="l03465" name="l03465"></a><span class="lineno"> 3465</span> </div>
|
|
<div class="line"><a id="l03466" name="l03466"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#aa1e8634ca9564e23a832de7479ba34ba"> 3466</a></span>int64_t <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa1e8634ca9564e23a832de7479ba34ba">RoutingModel::Next</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>& assignment, int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03467" name="l03467"></a><span class="lineno"> 3467</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(solver_.get(), assignment.<a class="code hl_function" href="classoperations__research_1_1_propagation_base_object.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>());</div>
|
|
<div class="line"><a id="l03468" name="l03468"></a><span class="lineno"> 3468</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> next_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l03469" name="l03469"></a><span class="lineno"> 3469</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#a60e7fa8388801a72e31391e8203a9464">Contains</a>(next_var));</div>
|
|
<div class="line"><a id="l03470" name="l03470"></a><span class="lineno"> 3470</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#aecf5d63faebdaeda9dca52f916576459">Bound</a>(next_var));</div>
|
|
<div class="line"><a id="l03471" name="l03471"></a><span class="lineno"> 3471</span> <span class="keywordflow">return</span> assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#a8e0cac088b44596d620963b8bc693770">Value</a>(next_var);</div>
|
|
<div class="line"><a id="l03472" name="l03472"></a><span class="lineno"> 3472</span>}</div>
|
|
<div class="line"><a id="l03473" name="l03473"></a><span class="lineno"> 3473</span> </div>
|
|
<div class="line"><a id="l03474" name="l03474"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a8174e01c9a66c00a87cdbe86ccd3655c"> 3474</a></span>int64_t <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8174e01c9a66c00a87cdbe86ccd3655c">RoutingModel::GetArcCostForVehicle</a>(int64_t from_index, int64_t to_index,</div>
|
|
<div class="line"><a id="l03475" name="l03475"></a><span class="lineno"> 3475</span> int64_t vehicle)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03476" name="l03476"></a><span class="lineno"> 3476</span> <span class="keywordflow">if</span> (from_index != to_index && vehicle >= 0) {</div>
|
|
<div class="line"><a id="l03477" name="l03477"></a><span class="lineno"> 3477</span> <span class="keywordflow">return</span> GetArcCostForClassInternal(from_index, to_index,</div>
|
|
<div class="line"><a id="l03478" name="l03478"></a><span class="lineno"> 3478</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ae378d23c967e818f321bd4498b5c74f2">GetCostClassIndexOfVehicle</a>(vehicle));</div>
|
|
<div class="line"><a id="l03479" name="l03479"></a><span class="lineno"> 3479</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l03480" name="l03480"></a><span class="lineno"> 3480</span> <span class="keywordflow">return</span> 0;</div>
|
|
<div class="line"><a id="l03481" name="l03481"></a><span class="lineno"> 3481</span> }</div>
|
|
<div class="line"><a id="l03482" name="l03482"></a><span class="lineno"> 3482</span>}</div>
|
|
<div class="line"><a id="l03483" name="l03483"></a><span class="lineno"> 3483</span> </div>
|
|
<div class="line"><a id="l03484" name="l03484"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#abfa127093eb53ae531ccb1f4ada6cc8a"> 3484</a></span>int64_t <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#abfa127093eb53ae531ccb1f4ada6cc8a">RoutingModel::GetArcCostForClass</a>(</div>
|
|
<div class="line"><a id="l03485" name="l03485"></a><span class="lineno"> 3485</span> int64_t from_index, int64_t to_index,</div>
|
|
<div class="line"><a id="l03486" name="l03486"></a><span class="lineno"> 3486</span> int64_t <span class="comment">/*CostClassIndex*/</span> cost_class_index)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03487" name="l03487"></a><span class="lineno"> 3487</span> <span class="keywordflow">if</span> (from_index != to_index) {</div>
|
|
<div class="line"><a id="l03488" name="l03488"></a><span class="lineno"> 3488</span> <span class="keywordflow">return</span> GetArcCostForClassInternal(from_index, to_index,</div>
|
|
<div class="line"><a id="l03489" name="l03489"></a><span class="lineno"> 3489</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#ad13ad202092298b43c9099b212c54d3d">CostClassIndex</a>(cost_class_index));</div>
|
|
<div class="line"><a id="l03490" name="l03490"></a><span class="lineno"> 3490</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l03491" name="l03491"></a><span class="lineno"> 3491</span> <span class="keywordflow">return</span> 0;</div>
|
|
<div class="line"><a id="l03492" name="l03492"></a><span class="lineno"> 3492</span> }</div>
|
|
<div class="line"><a id="l03493" name="l03493"></a><span class="lineno"> 3493</span>}</div>
|
|
<div class="line"><a id="l03494" name="l03494"></a><span class="lineno"> 3494</span> </div>
|
|
<div class="line"><a id="l03495" name="l03495"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a7c1886b567f58aff622ab91f7f0f8685"> 3495</a></span>int64_t <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a7c1886b567f58aff622ab91f7f0f8685">RoutingModel::GetArcCostForFirstSolution</a>(int64_t from_index,</div>
|
|
<div class="line"><a id="l03496" name="l03496"></a><span class="lineno"> 3496</span> int64_t to_index)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03497" name="l03497"></a><span class="lineno"> 3497</span> <span class="comment">// Return high cost if connecting to an end (or bound-to-end) node;</span></div>
|
|
<div class="line"><a id="l03498" name="l03498"></a><span class="lineno"> 3498</span> <span class="comment">// this is used in the cost-based first solution strategies to avoid closing</span></div>
|
|
<div class="line"><a id="l03499" name="l03499"></a><span class="lineno"> 3499</span> <span class="comment">// routes too soon.</span></div>
|
|
<div class="line"><a id="l03500" name="l03500"></a><span class="lineno"> 3500</span> <span class="keywordflow">if</span> (!is_bound_to_end_ct_added_.Switched()) {</div>
|
|
<div class="line"><a id="l03501" name="l03501"></a><span class="lineno"> 3501</span> <span class="comment">// Lazily adding path-cumul constraint propagating connection to route end,</span></div>
|
|
<div class="line"><a id="l03502" name="l03502"></a><span class="lineno"> 3502</span> <span class="comment">// as it can be pretty costly in the general case.</span></div>
|
|
<div class="line"><a id="l03503" name="l03503"></a><span class="lineno"> 3503</span> std::vector<IntVar*> zero_transit(<a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#a24926108b770033792d015cb86aeffb3">Size</a>(), solver_->MakeIntConst(0));</div>
|
|
<div class="line"><a id="l03504" name="l03504"></a><span class="lineno"> 3504</span> solver_->AddConstraint(solver_->MakeDelayedPathCumul(</div>
|
|
<div class="line"><a id="l03505" name="l03505"></a><span class="lineno"> 3505</span> nexts_, active_, is_bound_to_end_, zero_transit));</div>
|
|
<div class="line"><a id="l03506" name="l03506"></a><span class="lineno"> 3506</span> is_bound_to_end_ct_added_.Switch(solver_.get());</div>
|
|
<div class="line"><a id="l03507" name="l03507"></a><span class="lineno"> 3507</span> }</div>
|
|
<div class="line"><a id="l03508" name="l03508"></a><span class="lineno"> 3508</span> <span class="keywordflow">if</span> (is_bound_to_end_[to_index]->Min() == 1)</div>
|
|
<div class="line"><a id="l03509" name="l03509"></a><span class="lineno"> 3509</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>();</div>
|
|
<div class="line"><a id="l03510" name="l03510"></a><span class="lineno"> 3510</span> <span class="comment">// TODO(user): Take vehicle into account.</span></div>
|
|
<div class="line"><a id="l03511" name="l03511"></a><span class="lineno"> 3511</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a51b526b532fc95cfed13d54ed2d6db95">GetHomogeneousCost</a>(from_index, to_index);</div>
|
|
<div class="line"><a id="l03512" name="l03512"></a><span class="lineno"> 3512</span>}</div>
|
|
<div class="line"><a id="l03513" name="l03513"></a><span class="lineno"> 3513</span> </div>
|
|
<div class="line"><a id="l03514" name="l03514"></a><span class="lineno"> 3514</span>int64_t RoutingModel::GetDimensionTransitCostSum(</div>
|
|
<div class="line"><a id="l03515" name="l03515"></a><span class="lineno"> 3515</span> int64_t i, int64_t j, <span class="keyword">const</span> CostClass& cost_class)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03516" name="l03516"></a><span class="lineno"> 3516</span> int64_t <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a> = 0;</div>
|
|
<div class="line"><a id="l03517" name="l03517"></a><span class="lineno"> 3517</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>& evaluator_and_coefficient :</div>
|
|
<div class="line"><a id="l03518" name="l03518"></a><span class="lineno"> 3518</span> cost_class.dimension_transit_evaluator_class_and_cost_coefficient) {</div>
|
|
<div class="line"><a id="l03519" name="l03519"></a><span class="lineno"> 3519</span> <a class="code hl_define" href="base_2logging_8h.html#ab4f56aa24c4c9cddc47a6abd2d747f9a">DCHECK_GT</a>(evaluator_and_coefficient.cost_coefficient, 0);</div>
|
|
<div class="line"><a id="l03520" name="l03520"></a><span class="lineno"> 3520</span> <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a> = <a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(</div>
|
|
<div class="line"><a id="l03521" name="l03521"></a><span class="lineno"> 3521</span> <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a>,</div>
|
|
<div class="line"><a id="l03522" name="l03522"></a><span class="lineno"> 3522</span> <a class="code hl_function" href="namespaceoperations__research.html#aa64bf49d041052c7cb3f40f7496d7534">CapProd</a>(evaluator_and_coefficient.cost_coefficient,</div>
|
|
<div class="line"><a id="l03523" name="l03523"></a><span class="lineno"> 3523</span> evaluator_and_coefficient.dimension->GetTransitValueFromClass(</div>
|
|
<div class="line"><a id="l03524" name="l03524"></a><span class="lineno"> 3524</span> i, j, evaluator_and_coefficient.transit_evaluator_class)));</div>
|
|
<div class="line"><a id="l03525" name="l03525"></a><span class="lineno"> 3525</span> }</div>
|
|
<div class="line"><a id="l03526" name="l03526"></a><span class="lineno"> 3526</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a>;</div>
|
|
<div class="line"><a id="l03527" name="l03527"></a><span class="lineno"> 3527</span>}</div>
|
|
<div class="line"><a id="l03528" name="l03528"></a><span class="lineno"> 3528</span> </div>
|
|
<div class="line"><a id="l03529" name="l03529"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a78657faa6e076466c745caefdf732970"> 3529</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a78657faa6e076466c745caefdf732970">RoutingModel::ArcIsMoreConstrainedThanArc</a>(int64_t from, int64_t to1,</div>
|
|
<div class="line"><a id="l03530" name="l03530"></a><span class="lineno"> 3530</span> int64_t to2) {</div>
|
|
<div class="line"><a id="l03531" name="l03531"></a><span class="lineno"> 3531</span> <span class="comment">// Deal with end nodes: never pick an end node over a non-end node.</span></div>
|
|
<div class="line"><a id="l03532" name="l03532"></a><span class="lineno"> 3532</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(to1) || <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(to2)) {</div>
|
|
<div class="line"><a id="l03533" name="l03533"></a><span class="lineno"> 3533</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(to1) != <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(to2)) <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(to2);</div>
|
|
<div class="line"><a id="l03534" name="l03534"></a><span class="lineno"> 3534</span> <span class="comment">// If both are end nodes, we don't care; the right end node will be picked</span></div>
|
|
<div class="line"><a id="l03535" name="l03535"></a><span class="lineno"> 3535</span> <span class="comment">// by constraint propagation. Break the tie by index.</span></div>
|
|
<div class="line"><a id="l03536" name="l03536"></a><span class="lineno"> 3536</span> <span class="keywordflow">return</span> to1 < to2;</div>
|
|
<div class="line"><a id="l03537" name="l03537"></a><span class="lineno"> 3537</span> }</div>
|
|
<div class="line"><a id="l03538" name="l03538"></a><span class="lineno"> 3538</span> </div>
|
|
<div class="line"><a id="l03539" name="l03539"></a><span class="lineno"> 3539</span> <span class="comment">// Look whether they are mandatory (must be performed) or optional.</span></div>
|
|
<div class="line"><a id="l03540" name="l03540"></a><span class="lineno"> 3540</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> mandatory1 = active_[to1]->Min() == 1;</div>
|
|
<div class="line"><a id="l03541" name="l03541"></a><span class="lineno"> 3541</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> mandatory2 = active_[to2]->Min() == 1;</div>
|
|
<div class="line"><a id="l03542" name="l03542"></a><span class="lineno"> 3542</span> <span class="comment">// Always pick a mandatory node over a non-mandatory one.</span></div>
|
|
<div class="line"><a id="l03543" name="l03543"></a><span class="lineno"> 3543</span> <span class="keywordflow">if</span> (mandatory1 != mandatory2) <span class="keywordflow">return</span> mandatory1;</div>
|
|
<div class="line"><a id="l03544" name="l03544"></a><span class="lineno"> 3544</span> </div>
|
|
<div class="line"><a id="l03545" name="l03545"></a><span class="lineno"> 3545</span> <span class="comment">// Look at the vehicle variables.</span></div>
|
|
<div class="line"><a id="l03546" name="l03546"></a><span class="lineno"> 3546</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> src_vehicle_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">VehicleVar</a>(from);</div>
|
|
<div class="line"><a id="l03547" name="l03547"></a><span class="lineno"> 3547</span> <span class="comment">// In case the source vehicle is bound, "src_vehicle" will be it.</span></div>
|
|
<div class="line"><a id="l03548" name="l03548"></a><span class="lineno"> 3548</span> <span class="comment">// Otherwise, it'll be set to some possible source vehicle that</span></div>
|
|
<div class="line"><a id="l03549" name="l03549"></a><span class="lineno"> 3549</span> <span class="comment">// isn't -1 (if possible).</span></div>
|
|
<div class="line"><a id="l03550" name="l03550"></a><span class="lineno"> 3550</span> <span class="keyword">const</span> int64_t src_vehicle = src_vehicle_var-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#ac84c250d67f30c89e845cd460eeaaad8">Max</a>();</div>
|
|
<div class="line"><a id="l03551" name="l03551"></a><span class="lineno"> 3551</span> <span class="keywordflow">if</span> (src_vehicle_var-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#a1d04569b37cb7fe6ed0956ab71e08bc9">Bound</a>()) {</div>
|
|
<div class="line"><a id="l03552" name="l03552"></a><span class="lineno"> 3552</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> to1_vehicle_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">VehicleVar</a>(to1);</div>
|
|
<div class="line"><a id="l03553" name="l03553"></a><span class="lineno"> 3553</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> to2_vehicle_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">VehicleVar</a>(to2);</div>
|
|
<div class="line"><a id="l03554" name="l03554"></a><span class="lineno"> 3554</span> <span class="comment">// Subtle: non-mandatory node have kNoVehicle as possible value for</span></div>
|
|
<div class="line"><a id="l03555" name="l03555"></a><span class="lineno"> 3555</span> <span class="comment">// their vehicle variable. So they're effectively "bound" when their domain</span></div>
|
|
<div class="line"><a id="l03556" name="l03556"></a><span class="lineno"> 3556</span> <span class="comment">// size is 2.</span></div>
|
|
<div class="line"><a id="l03557" name="l03557"></a><span class="lineno"> 3557</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> bound1 =</div>
|
|
<div class="line"><a id="l03558" name="l03558"></a><span class="lineno"> 3558</span> mandatory1 ? to1_vehicle_var-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#a1d04569b37cb7fe6ed0956ab71e08bc9">Bound</a>() : (to1_vehicle_var-><a class="code hl_function" href="classoperations__research_1_1_int_var.html#af8625719d57e4a61b5aa251d99762966">Size</a>() <= 2);</div>
|
|
<div class="line"><a id="l03559" name="l03559"></a><span class="lineno"> 3559</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> bound2 =</div>
|
|
<div class="line"><a id="l03560" name="l03560"></a><span class="lineno"> 3560</span> mandatory2 ? to2_vehicle_var-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#a1d04569b37cb7fe6ed0956ab71e08bc9">Bound</a>() : (to2_vehicle_var-><a class="code hl_function" href="classoperations__research_1_1_int_var.html#af8625719d57e4a61b5aa251d99762966">Size</a>() <= 2);</div>
|
|
<div class="line"><a id="l03561" name="l03561"></a><span class="lineno"> 3561</span> <span class="comment">// Prefer a destination bound to a given vehicle, even if it's not</span></div>
|
|
<div class="line"><a id="l03562" name="l03562"></a><span class="lineno"> 3562</span> <span class="comment">// bound to the right one (the propagation will quickly rule it out).</span></div>
|
|
<div class="line"><a id="l03563" name="l03563"></a><span class="lineno"> 3563</span> <span class="keywordflow">if</span> (bound1 != bound2) <span class="keywordflow">return</span> bound1;</div>
|
|
<div class="line"><a id="l03564" name="l03564"></a><span class="lineno"> 3564</span> <span class="keywordflow">if</span> (bound1) { <span class="comment">// same as bound1 && bound2.</span></div>
|
|
<div class="line"><a id="l03565" name="l03565"></a><span class="lineno"> 3565</span> <span class="comment">// Min() will return kNoVehicle for optional nodes. Thus we use Max().</span></div>
|
|
<div class="line"><a id="l03566" name="l03566"></a><span class="lineno"> 3566</span> <span class="keyword">const</span> int64_t vehicle1 = to1_vehicle_var-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#ac84c250d67f30c89e845cd460eeaaad8">Max</a>();</div>
|
|
<div class="line"><a id="l03567" name="l03567"></a><span class="lineno"> 3567</span> <span class="keyword">const</span> int64_t vehicle2 = to2_vehicle_var-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#ac84c250d67f30c89e845cd460eeaaad8">Max</a>();</div>
|
|
<div class="line"><a id="l03568" name="l03568"></a><span class="lineno"> 3568</span> <span class="comment">// Prefer a destination bound to the right vehicle.</span></div>
|
|
<div class="line"><a id="l03569" name="l03569"></a><span class="lineno"> 3569</span> <span class="comment">// TODO(user): cover this clause in a unit test.</span></div>
|
|
<div class="line"><a id="l03570" name="l03570"></a><span class="lineno"> 3570</span> <span class="keywordflow">if</span> ((vehicle1 == src_vehicle) != (vehicle2 == src_vehicle)) {</div>
|
|
<div class="line"><a id="l03571" name="l03571"></a><span class="lineno"> 3571</span> <span class="keywordflow">return</span> vehicle1 == src_vehicle;</div>
|
|
<div class="line"><a id="l03572" name="l03572"></a><span class="lineno"> 3572</span> }</div>
|
|
<div class="line"><a id="l03573" name="l03573"></a><span class="lineno"> 3573</span> <span class="comment">// If no destination is bound to the right vehicle, whatever we</span></div>
|
|
<div class="line"><a id="l03574" name="l03574"></a><span class="lineno"> 3574</span> <span class="comment">// return doesn't matter: both are infeasible. To be consistent, we</span></div>
|
|
<div class="line"><a id="l03575" name="l03575"></a><span class="lineno"> 3575</span> <span class="comment">// just break the tie.</span></div>
|
|
<div class="line"><a id="l03576" name="l03576"></a><span class="lineno"> 3576</span> <span class="keywordflow">if</span> (vehicle1 != src_vehicle) <span class="keywordflow">return</span> to1 < to2;</div>
|
|
<div class="line"><a id="l03577" name="l03577"></a><span class="lineno"> 3577</span> }</div>
|
|
<div class="line"><a id="l03578" name="l03578"></a><span class="lineno"> 3578</span> }</div>
|
|
<div class="line"><a id="l03579" name="l03579"></a><span class="lineno"> 3579</span> <span class="comment">// At this point, either both destinations are bound to the source vehicle,</span></div>
|
|
<div class="line"><a id="l03580" name="l03580"></a><span class="lineno"> 3580</span> <span class="comment">// or none of them is bound, or the source vehicle isn't bound.</span></div>
|
|
<div class="line"><a id="l03581" name="l03581"></a><span class="lineno"> 3581</span> <span class="comment">// We don't bother inspecting the domains of the vehicle variables further.</span></div>
|
|
<div class="line"><a id="l03582" name="l03582"></a><span class="lineno"> 3582</span> </div>
|
|
<div class="line"><a id="l03583" name="l03583"></a><span class="lineno"> 3583</span> <span class="comment">// Inspect the primary constrained dimension, if any.</span></div>
|
|
<div class="line"><a id="l03584" name="l03584"></a><span class="lineno"> 3584</span> <span class="comment">// TODO(user): try looking at all the dimensions, not just the primary one,</span></div>
|
|
<div class="line"><a id="l03585" name="l03585"></a><span class="lineno"> 3585</span> <span class="comment">// and reconsider the need for a "primary" dimension.</span></div>
|
|
<div class="line"><a id="l03586" name="l03586"></a><span class="lineno"> 3586</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#af0ef4b9ace61b0d3f366cf128bfae32d">GetPrimaryConstrainedDimension</a>().empty()) {</div>
|
|
<div class="line"><a id="l03587" name="l03587"></a><span class="lineno"> 3587</span> <span class="keyword">const</span> std::vector<IntVar*>& cumul_vars =</div>
|
|
<div class="line"><a id="l03588" name="l03588"></a><span class="lineno"> 3588</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aff7724c6a1de20cd5369108e3db5fc76">GetDimensionOrDie</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#af0ef4b9ace61b0d3f366cf128bfae32d">GetPrimaryConstrainedDimension</a>()).<a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a2658bab0f635e3b399b100ecd6bc12cb">cumuls</a>();</div>
|
|
<div class="line"><a id="l03589" name="l03589"></a><span class="lineno"> 3589</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> dim1 = cumul_vars[to1];</div>
|
|
<div class="line"><a id="l03590" name="l03590"></a><span class="lineno"> 3590</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> dim2 = cumul_vars[to2];</div>
|
|
<div class="line"><a id="l03591" name="l03591"></a><span class="lineno"> 3591</span> <span class="comment">// Prefer the destination that has a lower upper bound for the constrained</span></div>
|
|
<div class="line"><a id="l03592" name="l03592"></a><span class="lineno"> 3592</span> <span class="comment">// dimension.</span></div>
|
|
<div class="line"><a id="l03593" name="l03593"></a><span class="lineno"> 3593</span> <span class="keywordflow">if</span> (dim1-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#ac84c250d67f30c89e845cd460eeaaad8">Max</a>() != dim2-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#ac84c250d67f30c89e845cd460eeaaad8">Max</a>()) <span class="keywordflow">return</span> dim1-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#ac84c250d67f30c89e845cd460eeaaad8">Max</a>() < dim2-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#ac84c250d67f30c89e845cd460eeaaad8">Max</a>();</div>
|
|
<div class="line"><a id="l03594" name="l03594"></a><span class="lineno"> 3594</span> <span class="comment">// TODO(user): evaluate the *actual* Min() of each cumul variable in the</span></div>
|
|
<div class="line"><a id="l03595" name="l03595"></a><span class="lineno"> 3595</span> <span class="comment">// scenario where the corresponding arc from->to is performed, and pick</span></div>
|
|
<div class="line"><a id="l03596" name="l03596"></a><span class="lineno"> 3596</span> <span class="comment">// the destination with the lowest value.</span></div>
|
|
<div class="line"><a id="l03597" name="l03597"></a><span class="lineno"> 3597</span> }</div>
|
|
<div class="line"><a id="l03598" name="l03598"></a><span class="lineno"> 3598</span> </div>
|
|
<div class="line"><a id="l03599" name="l03599"></a><span class="lineno"> 3599</span> <span class="comment">// Break ties on equally constrained nodes with the (cost - unperformed</span></div>
|
|
<div class="line"><a id="l03600" name="l03600"></a><span class="lineno"> 3600</span> <span class="comment">// penalty).</span></div>
|
|
<div class="line"><a id="l03601" name="l03601"></a><span class="lineno"> 3601</span> {</div>
|
|
<div class="line"><a id="l03602" name="l03602"></a><span class="lineno"> 3602</span> <span class="keyword">const</span> <span class="comment">/*CostClassIndex*/</span> int64_t cost_class_index =</div>
|
|
<div class="line"><a id="l03603" name="l03603"></a><span class="lineno"> 3603</span> SafeGetCostClassInt64OfVehicle(src_vehicle);</div>
|
|
<div class="line"><a id="l03604" name="l03604"></a><span class="lineno"> 3604</span> <span class="keyword">const</span> int64_t cost1 =</div>
|
|
<div class="line"><a id="l03605" name="l03605"></a><span class="lineno"> 3605</span> <a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#abfa127093eb53ae531ccb1f4ada6cc8a">GetArcCostForClass</a>(from, to1, cost_class_index),</div>
|
|
<div class="line"><a id="l03606" name="l03606"></a><span class="lineno"> 3606</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aae1975baf3d895a6503de44d872ecb1e">UnperformedPenalty</a>(to1));</div>
|
|
<div class="line"><a id="l03607" name="l03607"></a><span class="lineno"> 3607</span> <span class="keyword">const</span> int64_t cost2 =</div>
|
|
<div class="line"><a id="l03608" name="l03608"></a><span class="lineno"> 3608</span> <a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#abfa127093eb53ae531ccb1f4ada6cc8a">GetArcCostForClass</a>(from, to2, cost_class_index),</div>
|
|
<div class="line"><a id="l03609" name="l03609"></a><span class="lineno"> 3609</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aae1975baf3d895a6503de44d872ecb1e">UnperformedPenalty</a>(to2));</div>
|
|
<div class="line"><a id="l03610" name="l03610"></a><span class="lineno"> 3610</span> <span class="keywordflow">if</span> (cost1 != cost2) <span class="keywordflow">return</span> cost1 < cost2;</div>
|
|
<div class="line"><a id="l03611" name="l03611"></a><span class="lineno"> 3611</span> }</div>
|
|
<div class="line"><a id="l03612" name="l03612"></a><span class="lineno"> 3612</span> </div>
|
|
<div class="line"><a id="l03613" name="l03613"></a><span class="lineno"> 3613</span> <span class="comment">// Further break ties by looking at the size of the VehicleVar.</span></div>
|
|
<div class="line"><a id="l03614" name="l03614"></a><span class="lineno"> 3614</span> {</div>
|
|
<div class="line"><a id="l03615" name="l03615"></a><span class="lineno"> 3615</span> <span class="keyword">const</span> int64_t num_vehicles1 = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">VehicleVar</a>(to1)-><a class="code hl_function" href="classoperations__research_1_1_int_var.html#af8625719d57e4a61b5aa251d99762966">Size</a>();</div>
|
|
<div class="line"><a id="l03616" name="l03616"></a><span class="lineno"> 3616</span> <span class="keyword">const</span> int64_t num_vehicles2 = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">VehicleVar</a>(to2)-><a class="code hl_function" href="classoperations__research_1_1_int_var.html#af8625719d57e4a61b5aa251d99762966">Size</a>();</div>
|
|
<div class="line"><a id="l03617" name="l03617"></a><span class="lineno"> 3617</span> <span class="keywordflow">if</span> (num_vehicles1 != num_vehicles2) <span class="keywordflow">return</span> num_vehicles1 < num_vehicles2;</div>
|
|
<div class="line"><a id="l03618" name="l03618"></a><span class="lineno"> 3618</span> }</div>
|
|
<div class="line"><a id="l03619" name="l03619"></a><span class="lineno"> 3619</span> </div>
|
|
<div class="line"><a id="l03620" name="l03620"></a><span class="lineno"> 3620</span> <span class="comment">// Break perfect ties by value.</span></div>
|
|
<div class="line"><a id="l03621" name="l03621"></a><span class="lineno"> 3621</span> <span class="keywordflow">return</span> to1 < to2;</div>
|
|
<div class="line"><a id="l03622" name="l03622"></a><span class="lineno"> 3622</span>}</div>
|
|
<div class="line"><a id="l03623" name="l03623"></a><span class="lineno"> 3623</span> </div>
|
|
<div class="line"><a id="l03624" name="l03624"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a6a07d2e1f4a3af4a2c0051ab40a8b788"> 3624</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a6a07d2e1f4a3af4a2c0051ab40a8b788">RoutingModel::SetVisitType</a>(int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>, <span class="keywordtype">int</span> type,</div>
|
|
<div class="line"><a id="l03625" name="l03625"></a><span class="lineno"> 3625</span> <a class="code hl_enumeration" href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059">VisitTypePolicy</a> policy) {</div>
|
|
<div class="line"><a id="l03626" name="l03626"></a><span class="lineno"> 3626</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>, index_to_visit_type_.size());</div>
|
|
<div class="line"><a id="l03627" name="l03627"></a><span class="lineno"> 3627</span> <a class="code hl_define" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(index_to_visit_type_.size(), index_to_type_policy_.size());</div>
|
|
<div class="line"><a id="l03628" name="l03628"></a><span class="lineno"> 3628</span> index_to_visit_type_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>] = type;</div>
|
|
<div class="line"><a id="l03629" name="l03629"></a><span class="lineno"> 3629</span> index_to_type_policy_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>] = policy;</div>
|
|
<div class="line"><a id="l03630" name="l03630"></a><span class="lineno"> 3630</span> num_visit_types_ = <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(num_visit_types_, type + 1);</div>
|
|
<div class="line"><a id="l03631" name="l03631"></a><span class="lineno"> 3631</span>}</div>
|
|
<div class="line"><a id="l03632" name="l03632"></a><span class="lineno"> 3632</span> </div>
|
|
<div class="line"><a id="l03633" name="l03633"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a5ae82715107922af5fbc18f854d58026"> 3633</a></span><span class="keywordtype">int</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5ae82715107922af5fbc18f854d58026">RoutingModel::GetVisitType</a>(int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03634" name="l03634"></a><span class="lineno"> 3634</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>, index_to_visit_type_.size());</div>
|
|
<div class="line"><a id="l03635" name="l03635"></a><span class="lineno"> 3635</span> <span class="keywordflow">return</span> index_to_visit_type_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>];</div>
|
|
<div class="line"><a id="l03636" name="l03636"></a><span class="lineno"> 3636</span>}</div>
|
|
<div class="line"><a id="l03637" name="l03637"></a><span class="lineno"> 3637</span> </div>
|
|
<div class="line"><a id="l03638" name="l03638"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a72d627d4d3da5f1b59256eb9ebf503b5"> 3638</a></span><span class="keyword">const</span> std::vector<int>& <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a72d627d4d3da5f1b59256eb9ebf503b5">RoutingModel::GetSingleNodesOfType</a>(<span class="keywordtype">int</span> type)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03639" name="l03639"></a><span class="lineno"> 3639</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(type, single_nodes_of_type_.size());</div>
|
|
<div class="line"><a id="l03640" name="l03640"></a><span class="lineno"> 3640</span> <span class="keywordflow">return</span> single_nodes_of_type_[type];</div>
|
|
<div class="line"><a id="l03641" name="l03641"></a><span class="lineno"> 3641</span>}</div>
|
|
<div class="line"><a id="l03642" name="l03642"></a><span class="lineno"> 3642</span> </div>
|
|
<div class="line"><a id="l03643" name="l03643"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a1e783e12fa9a756c3f96ef9bb09cb972"> 3643</a></span><span class="keyword">const</span> std::vector<int>& <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a1e783e12fa9a756c3f96ef9bb09cb972">RoutingModel::GetPairIndicesOfType</a>(<span class="keywordtype">int</span> type)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03644" name="l03644"></a><span class="lineno"> 3644</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(type, pair_indices_of_type_.size());</div>
|
|
<div class="line"><a id="l03645" name="l03645"></a><span class="lineno"> 3645</span> <span class="keywordflow">return</span> pair_indices_of_type_[type];</div>
|
|
<div class="line"><a id="l03646" name="l03646"></a><span class="lineno"> 3646</span>}</div>
|
|
<div class="line"><a id="l03647" name="l03647"></a><span class="lineno"> 3647</span> </div>
|
|
<div class="line"><a id="l03648" name="l03648"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#aeb6c785d9ebc792b3c6eda788a6dfdf0"> 3648</a></span><a class="code hl_enumeration" href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059">RoutingModel::VisitTypePolicy</a> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aeb6c785d9ebc792b3c6eda788a6dfdf0">RoutingModel::GetVisitTypePolicy</a>(</div>
|
|
<div class="line"><a id="l03649" name="l03649"></a><span class="lineno"> 3649</span> int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03650" name="l03650"></a><span class="lineno"> 3650</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>, index_to_type_policy_.size());</div>
|
|
<div class="line"><a id="l03651" name="l03651"></a><span class="lineno"> 3651</span> <span class="keywordflow">return</span> index_to_type_policy_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>];</div>
|
|
<div class="line"><a id="l03652" name="l03652"></a><span class="lineno"> 3652</span>}</div>
|
|
<div class="line"><a id="l03653" name="l03653"></a><span class="lineno"> 3653</span> </div>
|
|
<div class="line"><a id="l03654" name="l03654"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a822458cc9a9a6fa02e86af3e3a1e5c89"> 3654</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a822458cc9a9a6fa02e86af3e3a1e5c89">RoutingModel::CloseVisitTypes</a>() {</div>
|
|
<div class="line"><a id="l03655" name="l03655"></a><span class="lineno"> 3655</span> hard_incompatible_types_per_type_index_.resize(num_visit_types_);</div>
|
|
<div class="line"><a id="l03656" name="l03656"></a><span class="lineno"> 3656</span> temporal_incompatible_types_per_type_index_.resize(num_visit_types_);</div>
|
|
<div class="line"><a id="l03657" name="l03657"></a><span class="lineno"> 3657</span> same_vehicle_required_type_alternatives_per_type_index_.resize(</div>
|
|
<div class="line"><a id="l03658" name="l03658"></a><span class="lineno"> 3658</span> num_visit_types_);</div>
|
|
<div class="line"><a id="l03659" name="l03659"></a><span class="lineno"> 3659</span> required_type_alternatives_when_adding_type_index_.resize(num_visit_types_);</div>
|
|
<div class="line"><a id="l03660" name="l03660"></a><span class="lineno"> 3660</span> required_type_alternatives_when_removing_type_index_.resize(num_visit_types_);</div>
|
|
<div class="line"><a id="l03661" name="l03661"></a><span class="lineno"> 3661</span>}</div>
|
|
<div class="line"><a id="l03662" name="l03662"></a><span class="lineno"> 3662</span> </div>
|
|
<div class="line"><a id="l03663" name="l03663"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a796b4eed03ed53bbbaed642f4ae94952"> 3663</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a796b4eed03ed53bbbaed642f4ae94952">RoutingModel::AddHardTypeIncompatibility</a>(<span class="keywordtype">int</span> type1, <span class="keywordtype">int</span> type2) {</div>
|
|
<div class="line"><a id="l03664" name="l03664"></a><span class="lineno"> 3664</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(<a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(type1, type2),</div>
|
|
<div class="line"><a id="l03665" name="l03665"></a><span class="lineno"> 3665</span> hard_incompatible_types_per_type_index_.size());</div>
|
|
<div class="line"><a id="l03666" name="l03666"></a><span class="lineno"> 3666</span> has_hard_type_incompatibilities_ = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l03667" name="l03667"></a><span class="lineno"> 3667</span> </div>
|
|
<div class="line"><a id="l03668" name="l03668"></a><span class="lineno"> 3668</span> hard_incompatible_types_per_type_index_[type1].insert(type2);</div>
|
|
<div class="line"><a id="l03669" name="l03669"></a><span class="lineno"> 3669</span> hard_incompatible_types_per_type_index_[type2].insert(type1);</div>
|
|
<div class="line"><a id="l03670" name="l03670"></a><span class="lineno"> 3670</span>}</div>
|
|
<div class="line"><a id="l03671" name="l03671"></a><span class="lineno"> 3671</span> </div>
|
|
<div class="line"><a id="l03672" name="l03672"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a7086a908f1890a7e1550c97b774e6384"> 3672</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a7086a908f1890a7e1550c97b774e6384">RoutingModel::AddTemporalTypeIncompatibility</a>(<span class="keywordtype">int</span> type1, <span class="keywordtype">int</span> type2) {</div>
|
|
<div class="line"><a id="l03673" name="l03673"></a><span class="lineno"> 3673</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(<a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(type1, type2),</div>
|
|
<div class="line"><a id="l03674" name="l03674"></a><span class="lineno"> 3674</span> temporal_incompatible_types_per_type_index_.size());</div>
|
|
<div class="line"><a id="l03675" name="l03675"></a><span class="lineno"> 3675</span> has_temporal_type_incompatibilities_ = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l03676" name="l03676"></a><span class="lineno"> 3676</span> </div>
|
|
<div class="line"><a id="l03677" name="l03677"></a><span class="lineno"> 3677</span> temporal_incompatible_types_per_type_index_[type1].insert(type2);</div>
|
|
<div class="line"><a id="l03678" name="l03678"></a><span class="lineno"> 3678</span> temporal_incompatible_types_per_type_index_[type2].insert(type1);</div>
|
|
<div class="line"><a id="l03679" name="l03679"></a><span class="lineno"> 3679</span>}</div>
|
|
<div class="line"><a id="l03680" name="l03680"></a><span class="lineno"> 3680</span> </div>
|
|
<div class="line"><a id="l03681" name="l03681"></a><span class="lineno"> 3681</span><span class="keyword">const</span> absl::flat_hash_set<int>&</div>
|
|
<div class="line"><a id="l03682" name="l03682"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#ac26167700ef3e2bf5e595e2150d1f895"> 3682</a></span><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ac26167700ef3e2bf5e595e2150d1f895">RoutingModel::GetHardTypeIncompatibilitiesOfType</a>(<span class="keywordtype">int</span> type)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03683" name="l03683"></a><span class="lineno"> 3683</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(type, 0);</div>
|
|
<div class="line"><a id="l03684" name="l03684"></a><span class="lineno"> 3684</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(type, hard_incompatible_types_per_type_index_.size());</div>
|
|
<div class="line"><a id="l03685" name="l03685"></a><span class="lineno"> 3685</span> <span class="keywordflow">return</span> hard_incompatible_types_per_type_index_[type];</div>
|
|
<div class="line"><a id="l03686" name="l03686"></a><span class="lineno"> 3686</span>}</div>
|
|
<div class="line"><a id="l03687" name="l03687"></a><span class="lineno"> 3687</span> </div>
|
|
<div class="line"><a id="l03688" name="l03688"></a><span class="lineno"> 3688</span><span class="keyword">const</span> absl::flat_hash_set<int>&</div>
|
|
<div class="line"><a id="l03689" name="l03689"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a20e9006ff9b8dc8ce89a8239a092b0c7"> 3689</a></span><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a20e9006ff9b8dc8ce89a8239a092b0c7">RoutingModel::GetTemporalTypeIncompatibilitiesOfType</a>(<span class="keywordtype">int</span> type)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03690" name="l03690"></a><span class="lineno"> 3690</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(type, 0);</div>
|
|
<div class="line"><a id="l03691" name="l03691"></a><span class="lineno"> 3691</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(type, temporal_incompatible_types_per_type_index_.size());</div>
|
|
<div class="line"><a id="l03692" name="l03692"></a><span class="lineno"> 3692</span> <span class="keywordflow">return</span> temporal_incompatible_types_per_type_index_[type];</div>
|
|
<div class="line"><a id="l03693" name="l03693"></a><span class="lineno"> 3693</span>}</div>
|
|
<div class="line"><a id="l03694" name="l03694"></a><span class="lineno"> 3694</span> </div>
|
|
<div class="line"><a id="l03695" name="l03695"></a><span class="lineno"> 3695</span><span class="comment">// TODO(user): Consider if an empty "required_type_alternatives" should mean</span></div>
|
|
<div class="line"><a id="l03696" name="l03696"></a><span class="lineno"> 3696</span><span class="comment">// trivially feasible requirement, as there are no required type alternatives?</span></div>
|
|
<div class="line"><a id="l03697" name="l03697"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#ac22e9cfd1fbf1b4af4f8a9be46ec88a1"> 3697</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ac22e9cfd1fbf1b4af4f8a9be46ec88a1">RoutingModel::AddSameVehicleRequiredTypeAlternatives</a>(</div>
|
|
<div class="line"><a id="l03698" name="l03698"></a><span class="lineno"> 3698</span> <span class="keywordtype">int</span> dependent_type, absl::flat_hash_set<int> required_type_alternatives) {</div>
|
|
<div class="line"><a id="l03699" name="l03699"></a><span class="lineno"> 3699</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(dependent_type,</div>
|
|
<div class="line"><a id="l03700" name="l03700"></a><span class="lineno"> 3700</span> same_vehicle_required_type_alternatives_per_type_index_.size());</div>
|
|
<div class="line"><a id="l03701" name="l03701"></a><span class="lineno"> 3701</span> </div>
|
|
<div class="line"><a id="l03702" name="l03702"></a><span class="lineno"> 3702</span> <span class="keywordflow">if</span> (required_type_alternatives.empty()) {</div>
|
|
<div class="line"><a id="l03703" name="l03703"></a><span class="lineno"> 3703</span> <span class="comment">// The dependent_type requires an infeasible (empty) set of types.</span></div>
|
|
<div class="line"><a id="l03704" name="l03704"></a><span class="lineno"> 3704</span> <span class="comment">// Nodes of this type and all policies except</span></div>
|
|
<div class="line"><a id="l03705" name="l03705"></a><span class="lineno"> 3705</span> <span class="comment">// ADDED_TYPE_REMOVED_FROM_VEHICLE are trivially infeasible.</span></div>
|
|
<div class="line"><a id="l03706" name="l03706"></a><span class="lineno"> 3706</span> absl::flat_hash_set<VisitTypePolicy>& infeasible_policies =</div>
|
|
<div class="line"><a id="l03707" name="l03707"></a><span class="lineno"> 3707</span> trivially_infeasible_visit_types_to_policies_[dependent_type];</div>
|
|
<div class="line"><a id="l03708" name="l03708"></a><span class="lineno"> 3708</span> infeasible_policies.insert(<a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a0c6d4521dc67c6bc22dc917caef2286a">TYPE_ADDED_TO_VEHICLE</a>);</div>
|
|
<div class="line"><a id="l03709" name="l03709"></a><span class="lineno"> 3709</span> infeasible_policies.insert(<a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a7fc0cab89681d70bbb68958ed70b85c1">TYPE_ON_VEHICLE_UP_TO_VISIT</a>);</div>
|
|
<div class="line"><a id="l03710" name="l03710"></a><span class="lineno"> 3710</span> infeasible_policies.insert(<a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059ad86e8082b5636a532fe181b288a4dea7">TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED</a>);</div>
|
|
<div class="line"><a id="l03711" name="l03711"></a><span class="lineno"> 3711</span> <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l03712" name="l03712"></a><span class="lineno"> 3712</span> }</div>
|
|
<div class="line"><a id="l03713" name="l03713"></a><span class="lineno"> 3713</span> </div>
|
|
<div class="line"><a id="l03714" name="l03714"></a><span class="lineno"> 3714</span> has_same_vehicle_type_requirements_ = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l03715" name="l03715"></a><span class="lineno"> 3715</span> same_vehicle_required_type_alternatives_per_type_index_[dependent_type]</div>
|
|
<div class="line"><a id="l03716" name="l03716"></a><span class="lineno"> 3716</span> .push_back(std::move(required_type_alternatives));</div>
|
|
<div class="line"><a id="l03717" name="l03717"></a><span class="lineno"> 3717</span>}</div>
|
|
<div class="line"><a id="l03718" name="l03718"></a><span class="lineno"> 3718</span> </div>
|
|
<div class="line"><a id="l03719" name="l03719"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#ad7dbf1150b65fa6495a6cf4a6ab9dd3b"> 3719</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ad7dbf1150b65fa6495a6cf4a6ab9dd3b">RoutingModel::AddRequiredTypeAlternativesWhenAddingType</a>(</div>
|
|
<div class="line"><a id="l03720" name="l03720"></a><span class="lineno"> 3720</span> <span class="keywordtype">int</span> dependent_type, absl::flat_hash_set<int> required_type_alternatives) {</div>
|
|
<div class="line"><a id="l03721" name="l03721"></a><span class="lineno"> 3721</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(dependent_type,</div>
|
|
<div class="line"><a id="l03722" name="l03722"></a><span class="lineno"> 3722</span> required_type_alternatives_when_adding_type_index_.size());</div>
|
|
<div class="line"><a id="l03723" name="l03723"></a><span class="lineno"> 3723</span> </div>
|
|
<div class="line"><a id="l03724" name="l03724"></a><span class="lineno"> 3724</span> <span class="keywordflow">if</span> (required_type_alternatives.empty()) {</div>
|
|
<div class="line"><a id="l03725" name="l03725"></a><span class="lineno"> 3725</span> <span class="comment">// The dependent_type requires an infeasible (empty) set of types.</span></div>
|
|
<div class="line"><a id="l03726" name="l03726"></a><span class="lineno"> 3726</span> <span class="comment">// Nodes of this type and policy TYPE_ADDED_TO_VEHICLE or</span></div>
|
|
<div class="line"><a id="l03727" name="l03727"></a><span class="lineno"> 3727</span> <span class="comment">// TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED are trivially infeasible.</span></div>
|
|
<div class="line"><a id="l03728" name="l03728"></a><span class="lineno"> 3728</span> absl::flat_hash_set<VisitTypePolicy>& infeasible_policies =</div>
|
|
<div class="line"><a id="l03729" name="l03729"></a><span class="lineno"> 3729</span> trivially_infeasible_visit_types_to_policies_[dependent_type];</div>
|
|
<div class="line"><a id="l03730" name="l03730"></a><span class="lineno"> 3730</span> infeasible_policies.insert(<a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a0c6d4521dc67c6bc22dc917caef2286a">TYPE_ADDED_TO_VEHICLE</a>);</div>
|
|
<div class="line"><a id="l03731" name="l03731"></a><span class="lineno"> 3731</span> infeasible_policies.insert(<a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059ad86e8082b5636a532fe181b288a4dea7">TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED</a>);</div>
|
|
<div class="line"><a id="l03732" name="l03732"></a><span class="lineno"> 3732</span> <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l03733" name="l03733"></a><span class="lineno"> 3733</span> }</div>
|
|
<div class="line"><a id="l03734" name="l03734"></a><span class="lineno"> 3734</span> </div>
|
|
<div class="line"><a id="l03735" name="l03735"></a><span class="lineno"> 3735</span> has_temporal_type_requirements_ = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l03736" name="l03736"></a><span class="lineno"> 3736</span> required_type_alternatives_when_adding_type_index_[dependent_type].push_back(</div>
|
|
<div class="line"><a id="l03737" name="l03737"></a><span class="lineno"> 3737</span> std::move(required_type_alternatives));</div>
|
|
<div class="line"><a id="l03738" name="l03738"></a><span class="lineno"> 3738</span>}</div>
|
|
<div class="line"><a id="l03739" name="l03739"></a><span class="lineno"> 3739</span> </div>
|
|
<div class="line"><a id="l03740" name="l03740"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#aa11b7e0480c2cfed29972adef0d3fa74"> 3740</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa11b7e0480c2cfed29972adef0d3fa74">RoutingModel::AddRequiredTypeAlternativesWhenRemovingType</a>(</div>
|
|
<div class="line"><a id="l03741" name="l03741"></a><span class="lineno"> 3741</span> <span class="keywordtype">int</span> dependent_type, absl::flat_hash_set<int> required_type_alternatives) {</div>
|
|
<div class="line"><a id="l03742" name="l03742"></a><span class="lineno"> 3742</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(dependent_type,</div>
|
|
<div class="line"><a id="l03743" name="l03743"></a><span class="lineno"> 3743</span> required_type_alternatives_when_removing_type_index_.size());</div>
|
|
<div class="line"><a id="l03744" name="l03744"></a><span class="lineno"> 3744</span> </div>
|
|
<div class="line"><a id="l03745" name="l03745"></a><span class="lineno"> 3745</span> <span class="keywordflow">if</span> (required_type_alternatives.empty()) {</div>
|
|
<div class="line"><a id="l03746" name="l03746"></a><span class="lineno"> 3746</span> <span class="comment">// The dependent_type requires an infeasible (empty) set of types.</span></div>
|
|
<div class="line"><a id="l03747" name="l03747"></a><span class="lineno"> 3747</span> <span class="comment">// Nodes of this type and all policies except TYPE_ADDED_TO_VEHICLE are</span></div>
|
|
<div class="line"><a id="l03748" name="l03748"></a><span class="lineno"> 3748</span> <span class="comment">// trivially infeasible.</span></div>
|
|
<div class="line"><a id="l03749" name="l03749"></a><span class="lineno"> 3749</span> absl::flat_hash_set<VisitTypePolicy>& infeasible_policies =</div>
|
|
<div class="line"><a id="l03750" name="l03750"></a><span class="lineno"> 3750</span> trivially_infeasible_visit_types_to_policies_[dependent_type];</div>
|
|
<div class="line"><a id="l03751" name="l03751"></a><span class="lineno"> 3751</span> infeasible_policies.insert(<a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a5b57570c52e974c761a9b08c1fc7e8ab">ADDED_TYPE_REMOVED_FROM_VEHICLE</a>);</div>
|
|
<div class="line"><a id="l03752" name="l03752"></a><span class="lineno"> 3752</span> infeasible_policies.insert(<a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a7fc0cab89681d70bbb68958ed70b85c1">TYPE_ON_VEHICLE_UP_TO_VISIT</a>);</div>
|
|
<div class="line"><a id="l03753" name="l03753"></a><span class="lineno"> 3753</span> infeasible_policies.insert(<a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059ad86e8082b5636a532fe181b288a4dea7">TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED</a>);</div>
|
|
<div class="line"><a id="l03754" name="l03754"></a><span class="lineno"> 3754</span> <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l03755" name="l03755"></a><span class="lineno"> 3755</span> }</div>
|
|
<div class="line"><a id="l03756" name="l03756"></a><span class="lineno"> 3756</span> </div>
|
|
<div class="line"><a id="l03757" name="l03757"></a><span class="lineno"> 3757</span> has_temporal_type_requirements_ = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l03758" name="l03758"></a><span class="lineno"> 3758</span> required_type_alternatives_when_removing_type_index_[dependent_type]</div>
|
|
<div class="line"><a id="l03759" name="l03759"></a><span class="lineno"> 3759</span> .push_back(std::move(required_type_alternatives));</div>
|
|
<div class="line"><a id="l03760" name="l03760"></a><span class="lineno"> 3760</span>}</div>
|
|
<div class="line"><a id="l03761" name="l03761"></a><span class="lineno"> 3761</span> </div>
|
|
<div class="line"><a id="l03762" name="l03762"></a><span class="lineno"> 3762</span><span class="keyword">const</span> std::vector<absl::flat_hash_set<int>>&</div>
|
|
<div class="line"><a id="l03763" name="l03763"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a56d36a8ace500aa67983ea7cbf4e97e7"> 3763</a></span><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a56d36a8ace500aa67983ea7cbf4e97e7">RoutingModel::GetSameVehicleRequiredTypeAlternativesOfType</a>(<span class="keywordtype">int</span> type)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03764" name="l03764"></a><span class="lineno"> 3764</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(type, 0);</div>
|
|
<div class="line"><a id="l03765" name="l03765"></a><span class="lineno"> 3765</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(type,</div>
|
|
<div class="line"><a id="l03766" name="l03766"></a><span class="lineno"> 3766</span> same_vehicle_required_type_alternatives_per_type_index_.size());</div>
|
|
<div class="line"><a id="l03767" name="l03767"></a><span class="lineno"> 3767</span> <span class="keywordflow">return</span> same_vehicle_required_type_alternatives_per_type_index_[type];</div>
|
|
<div class="line"><a id="l03768" name="l03768"></a><span class="lineno"> 3768</span>}</div>
|
|
<div class="line"><a id="l03769" name="l03769"></a><span class="lineno"> 3769</span> </div>
|
|
<div class="line"><a id="l03770" name="l03770"></a><span class="lineno"> 3770</span><span class="keyword">const</span> std::vector<absl::flat_hash_set<int>>&</div>
|
|
<div class="line"><a id="l03771" name="l03771"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a780dc49f977070d8f061d82550b8ca82"> 3771</a></span><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a780dc49f977070d8f061d82550b8ca82">RoutingModel::GetRequiredTypeAlternativesWhenAddingType</a>(<span class="keywordtype">int</span> type)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03772" name="l03772"></a><span class="lineno"> 3772</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(type, 0);</div>
|
|
<div class="line"><a id="l03773" name="l03773"></a><span class="lineno"> 3773</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(type, required_type_alternatives_when_adding_type_index_.size());</div>
|
|
<div class="line"><a id="l03774" name="l03774"></a><span class="lineno"> 3774</span> <span class="keywordflow">return</span> required_type_alternatives_when_adding_type_index_[type];</div>
|
|
<div class="line"><a id="l03775" name="l03775"></a><span class="lineno"> 3775</span>}</div>
|
|
<div class="line"><a id="l03776" name="l03776"></a><span class="lineno"> 3776</span> </div>
|
|
<div class="line"><a id="l03777" name="l03777"></a><span class="lineno"> 3777</span><span class="keyword">const</span> std::vector<absl::flat_hash_set<int>>&</div>
|
|
<div class="line"><a id="l03778" name="l03778"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a2c5397c69eec560d911892a7c1642bdd"> 3778</a></span><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a2c5397c69eec560d911892a7c1642bdd">RoutingModel::GetRequiredTypeAlternativesWhenRemovingType</a>(<span class="keywordtype">int</span> type)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03779" name="l03779"></a><span class="lineno"> 3779</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(type, 0);</div>
|
|
<div class="line"><a id="l03780" name="l03780"></a><span class="lineno"> 3780</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(type, required_type_alternatives_when_removing_type_index_.size());</div>
|
|
<div class="line"><a id="l03781" name="l03781"></a><span class="lineno"> 3781</span> <span class="keywordflow">return</span> required_type_alternatives_when_removing_type_index_[type];</div>
|
|
<div class="line"><a id="l03782" name="l03782"></a><span class="lineno"> 3782</span>}</div>
|
|
<div class="line"><a id="l03783" name="l03783"></a><span class="lineno"> 3783</span> </div>
|
|
<div class="line"><a id="l03784" name="l03784"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#aae1975baf3d895a6503de44d872ecb1e"> 3784</a></span>int64_t <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aae1975baf3d895a6503de44d872ecb1e">RoutingModel::UnperformedPenalty</a>(int64_t var_index)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03785" name="l03785"></a><span class="lineno"> 3785</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a9285d707cc3302c913f5c88697743947">UnperformedPenaltyOrValue</a>(0, var_index);</div>
|
|
<div class="line"><a id="l03786" name="l03786"></a><span class="lineno"> 3786</span>}</div>
|
|
<div class="line"><a id="l03787" name="l03787"></a><span class="lineno"> 3787</span> </div>
|
|
<div class="line"><a id="l03788" name="l03788"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a9285d707cc3302c913f5c88697743947"> 3788</a></span>int64_t <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a9285d707cc3302c913f5c88697743947">RoutingModel::UnperformedPenaltyOrValue</a>(int64_t default_value,</div>
|
|
<div class="line"><a id="l03789" name="l03789"></a><span class="lineno"> 3789</span> int64_t var_index)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03790" name="l03790"></a><span class="lineno"> 3790</span> <span class="keywordflow">if</span> (active_[var_index]->Min() == 1)</div>
|
|
<div class="line"><a id="l03791" name="l03791"></a><span class="lineno"> 3791</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(); <span class="comment">// Forced active.</span></div>
|
|
<div class="line"><a id="l03792" name="l03792"></a><span class="lineno"> 3792</span> <span class="keyword">const</span> std::vector<DisjunctionIndex>& disjunction_indices =</div>
|
|
<div class="line"><a id="l03793" name="l03793"></a><span class="lineno"> 3793</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a9148b93be3892d950af000a9b379940e">GetDisjunctionIndices</a>(var_index);</div>
|
|
<div class="line"><a id="l03794" name="l03794"></a><span class="lineno"> 3794</span> <span class="keywordflow">if</span> (disjunction_indices.size() != 1) <span class="keywordflow">return</span> default_value;</div>
|
|
<div class="line"><a id="l03795" name="l03795"></a><span class="lineno"> 3795</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#afa7cbbd4db2dd5d0bec3393efc9ebac1">DisjunctionIndex</a> disjunction_index = disjunction_indices[0];</div>
|
|
<div class="line"><a id="l03796" name="l03796"></a><span class="lineno"> 3796</span> <span class="comment">// The disjunction penalty can be kNoPenalty iff there is more than one node</span></div>
|
|
<div class="line"><a id="l03797" name="l03797"></a><span class="lineno"> 3797</span> <span class="comment">// in the disjunction; otherwise we would have caught it earlier (the node</span></div>
|
|
<div class="line"><a id="l03798" name="l03798"></a><span class="lineno"> 3798</span> <span class="comment">// would be forced active).</span></div>
|
|
<div class="line"><a id="l03799" name="l03799"></a><span class="lineno"> 3799</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(int64_t{0}, disjunctions_[disjunction_index].value.penalty);</div>
|
|
<div class="line"><a id="l03800" name="l03800"></a><span class="lineno"> 3800</span>}</div>
|
|
<div class="line"><a id="l03801" name="l03801"></a><span class="lineno"> 3801</span> </div>
|
|
<div class="line"><a id="l03802" name="l03802"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a25d079aaf52ffdf6d547384b523ff018"> 3802</a></span>std::string <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a25d079aaf52ffdf6d547384b523ff018">RoutingModel::DebugOutputAssignment</a>(</div>
|
|
<div class="line"><a id="l03803" name="l03803"></a><span class="lineno"> 3803</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>& solution_assignment,</div>
|
|
<div class="line"><a id="l03804" name="l03804"></a><span class="lineno"> 3804</span> <span class="keyword">const</span> std::string& dimension_to_print)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l03805" name="l03805"></a><span class="lineno"> 3805</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < <a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#a24926108b770033792d015cb86aeffb3">Size</a>(); ++i) {</div>
|
|
<div class="line"><a id="l03806" name="l03806"></a><span class="lineno"> 3806</span> <span class="keywordflow">if</span> (!solution_assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#aecf5d63faebdaeda9dca52f916576459">Bound</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(i))) {</div>
|
|
<div class="line"><a id="l03807" name="l03807"></a><span class="lineno"> 3807</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(DFATAL)</div>
|
|
<div class="line"><a id="l03808" name="l03808"></a><span class="lineno"> 3808</span> << <span class="stringliteral">"DebugOutputVehicleSchedules() called on incomplete solution:"</span></div>
|
|
<div class="line"><a id="l03809" name="l03809"></a><span class="lineno"> 3809</span> << <span class="stringliteral">" NextVar("</span> << i << <span class="stringliteral">") is unbound."</span>;</div>
|
|
<div class="line"><a id="l03810" name="l03810"></a><span class="lineno"> 3810</span> <span class="keywordflow">return</span> <span class="stringliteral">""</span>;</div>
|
|
<div class="line"><a id="l03811" name="l03811"></a><span class="lineno"> 3811</span> }</div>
|
|
<div class="line"><a id="l03812" name="l03812"></a><span class="lineno"> 3812</span> }</div>
|
|
<div class="line"><a id="l03813" name="l03813"></a><span class="lineno"> 3813</span> std::string output;</div>
|
|
<div class="line"><a id="l03814" name="l03814"></a><span class="lineno"> 3814</span> absl::flat_hash_set<std::string> dimension_names;</div>
|
|
<div class="line"><a id="l03815" name="l03815"></a><span class="lineno"> 3815</span> <span class="keywordflow">if</span> (dimension_to_print.empty()) {</div>
|
|
<div class="line"><a id="l03816" name="l03816"></a><span class="lineno"> 3816</span> <span class="keyword">const</span> std::vector<std::string> all_dimension_names = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a644ab247b579b93e9a3b1ecd96ba415c">GetAllDimensionNames</a>();</div>
|
|
<div class="line"><a id="l03817" name="l03817"></a><span class="lineno"> 3817</span> dimension_names.insert(all_dimension_names.begin(),</div>
|
|
<div class="line"><a id="l03818" name="l03818"></a><span class="lineno"> 3818</span> all_dimension_names.end());</div>
|
|
<div class="line"><a id="l03819" name="l03819"></a><span class="lineno"> 3819</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l03820" name="l03820"></a><span class="lineno"> 3820</span> dimension_names.insert(dimension_to_print);</div>
|
|
<div class="line"><a id="l03821" name="l03821"></a><span class="lineno"> 3821</span> }</div>
|
|
<div class="line"><a id="l03822" name="l03822"></a><span class="lineno"> 3822</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++vehicle) {</div>
|
|
<div class="line"><a id="l03823" name="l03823"></a><span class="lineno"> 3823</span> <span class="keywordtype">int</span> empty_vehicle_range_start = vehicle;</div>
|
|
<div class="line"><a id="l03824" name="l03824"></a><span class="lineno"> 3824</span> <span class="keywordflow">while</span> (vehicle < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>() &&</div>
|
|
<div class="line"><a id="l03825" name="l03825"></a><span class="lineno"> 3825</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(solution_assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#a8e0cac088b44596d620963b8bc693770">Value</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(vehicle))))) {</div>
|
|
<div class="line"><a id="l03826" name="l03826"></a><span class="lineno"> 3826</span> vehicle++;</div>
|
|
<div class="line"><a id="l03827" name="l03827"></a><span class="lineno"> 3827</span> }</div>
|
|
<div class="line"><a id="l03828" name="l03828"></a><span class="lineno"> 3828</span> <span class="keywordflow">if</span> (empty_vehicle_range_start != vehicle) {</div>
|
|
<div class="line"><a id="l03829" name="l03829"></a><span class="lineno"> 3829</span> <span class="keywordflow">if</span> (empty_vehicle_range_start == vehicle - 1) {</div>
|
|
<div class="line"><a id="l03830" name="l03830"></a><span class="lineno"> 3830</span> absl::StrAppendFormat(&output, <span class="stringliteral">"Vehicle %d: empty"</span>,</div>
|
|
<div class="line"><a id="l03831" name="l03831"></a><span class="lineno"> 3831</span> empty_vehicle_range_start);</div>
|
|
<div class="line"><a id="l03832" name="l03832"></a><span class="lineno"> 3832</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l03833" name="l03833"></a><span class="lineno"> 3833</span> absl::StrAppendFormat(&output, <span class="stringliteral">"Vehicles %d-%d: empty"</span>,</div>
|
|
<div class="line"><a id="l03834" name="l03834"></a><span class="lineno"> 3834</span> empty_vehicle_range_start, vehicle - 1);</div>
|
|
<div class="line"><a id="l03835" name="l03835"></a><span class="lineno"> 3835</span> }</div>
|
|
<div class="line"><a id="l03836" name="l03836"></a><span class="lineno"> 3836</span> output.append(<span class="stringliteral">"\n"</span>);</div>
|
|
<div class="line"><a id="l03837" name="l03837"></a><span class="lineno"> 3837</span> }</div>
|
|
<div class="line"><a id="l03838" name="l03838"></a><span class="lineno"> 3838</span> <span class="keywordflow">if</span> (vehicle < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>()) {</div>
|
|
<div class="line"><a id="l03839" name="l03839"></a><span class="lineno"> 3839</span> absl::StrAppendFormat(&output, <span class="stringliteral">"Vehicle %d:"</span>, vehicle);</div>
|
|
<div class="line"><a id="l03840" name="l03840"></a><span class="lineno"> 3840</span> int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(vehicle);</div>
|
|
<div class="line"><a id="l03841" name="l03841"></a><span class="lineno"> 3841</span> <span class="keywordflow">for</span> (;;) {</div>
|
|
<div class="line"><a id="l03842" name="l03842"></a><span class="lineno"> 3842</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* vehicle_var = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">VehicleVar</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l03843" name="l03843"></a><span class="lineno"> 3843</span> absl::StrAppendFormat(&output, <span class="stringliteral">"%d Vehicle(%d) "</span>, <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>,</div>
|
|
<div class="line"><a id="l03844" name="l03844"></a><span class="lineno"> 3844</span> solution_assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#a8e0cac088b44596d620963b8bc693770">Value</a>(vehicle_var));</div>
|
|
<div class="line"><a id="l03845" name="l03845"></a><span class="lineno"> 3845</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* <span class="keyword">const</span> dimension : dimensions_) {</div>
|
|
<div class="line"><a id="l03846" name="l03846"></a><span class="lineno"> 3846</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="namespacegtl.html#aae28e97bd1fa93cb0032642550da7455">gtl::ContainsKey</a>(dimension_names, dimension->name())) {</div>
|
|
<div class="line"><a id="l03847" name="l03847"></a><span class="lineno"> 3847</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> = dimension->CumulVar(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l03848" name="l03848"></a><span class="lineno"> 3848</span> absl::StrAppendFormat(&output, <span class="stringliteral">"%s(%d..%d) "</span>, dimension->name(),</div>
|
|
<div class="line"><a id="l03849" name="l03849"></a><span class="lineno"> 3849</span> solution_assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#af2c17e9e8d310419dade841aca1ab837">Min</a>(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>),</div>
|
|
<div class="line"><a id="l03850" name="l03850"></a><span class="lineno"> 3850</span> solution_assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#a8dbbd913afa005c99a0ec9cbfa665b46">Max</a>(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>));</div>
|
|
<div class="line"><a id="l03851" name="l03851"></a><span class="lineno"> 3851</span> }</div>
|
|
<div class="line"><a id="l03852" name="l03852"></a><span class="lineno"> 3852</span> }</div>
|
|
<div class="line"><a id="l03853" name="l03853"></a><span class="lineno"> 3853</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)) <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l03854" name="l03854"></a><span class="lineno"> 3854</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = solution_assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#a8e0cac088b44596d620963b8bc693770">Value</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>));</div>
|
|
<div class="line"><a id="l03855" name="l03855"></a><span class="lineno"> 3855</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)) output.append(<span class="stringliteral">"Route end "</span>);</div>
|
|
<div class="line"><a id="l03856" name="l03856"></a><span class="lineno"> 3856</span> }</div>
|
|
<div class="line"><a id="l03857" name="l03857"></a><span class="lineno"> 3857</span> output.append(<span class="stringliteral">"\n"</span>);</div>
|
|
<div class="line"><a id="l03858" name="l03858"></a><span class="lineno"> 3858</span> }</div>
|
|
<div class="line"><a id="l03859" name="l03859"></a><span class="lineno"> 3859</span> }</div>
|
|
<div class="line"><a id="l03860" name="l03860"></a><span class="lineno"> 3860</span> output.append(<span class="stringliteral">"Unperformed nodes: "</span>);</div>
|
|
<div class="line"><a id="l03861" name="l03861"></a><span class="lineno"> 3861</span> <span class="keywordtype">bool</span> has_unperformed = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l03862" name="l03862"></a><span class="lineno"> 3862</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < <a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#a24926108b770033792d015cb86aeffb3">Size</a>(); ++i) {</div>
|
|
<div class="line"><a id="l03863" name="l03863"></a><span class="lineno"> 3863</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(i) && !<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a3582f01eabc65ba4b801215ca6420a7c">IsStart</a>(i) &&</div>
|
|
<div class="line"><a id="l03864" name="l03864"></a><span class="lineno"> 3864</span> solution_assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#a8e0cac088b44596d620963b8bc693770">Value</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(i)) == i) {</div>
|
|
<div class="line"><a id="l03865" name="l03865"></a><span class="lineno"> 3865</span> absl::StrAppendFormat(&output, <span class="stringliteral">"%d "</span>, i);</div>
|
|
<div class="line"><a id="l03866" name="l03866"></a><span class="lineno"> 3866</span> has_unperformed = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l03867" name="l03867"></a><span class="lineno"> 3867</span> }</div>
|
|
<div class="line"><a id="l03868" name="l03868"></a><span class="lineno"> 3868</span> }</div>
|
|
<div class="line"><a id="l03869" name="l03869"></a><span class="lineno"> 3869</span> <span class="keywordflow">if</span> (!has_unperformed) output.append(<span class="stringliteral">"None"</span>);</div>
|
|
<div class="line"><a id="l03870" name="l03870"></a><span class="lineno"> 3870</span> output.append(<span class="stringliteral">"\n"</span>);</div>
|
|
<div class="line"><a id="l03871" name="l03871"></a><span class="lineno"> 3871</span> <span class="keywordflow">return</span> output;</div>
|
|
<div class="line"><a id="l03872" name="l03872"></a><span class="lineno"> 3872</span>}</div>
|
|
<div class="line"><a id="l03873" name="l03873"></a><span class="lineno"> 3873</span> </div>
|
|
<div class="line"><a id="l03874" name="l03874"></a><span class="lineno"> 3874</span><span class="preprocessor">#ifndef SWIG</span></div>
|
|
<div class="line"><a id="l03875" name="l03875"></a><span class="lineno"> 3875</span>std::vector<std::vector<std::pair<int64_t, int64_t>>></div>
|
|
<div class="line"><a id="l03876" name="l03876"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a76e91ac014792e6e99d7e19afeff36dc"> 3876</a></span><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a76e91ac014792e6e99d7e19afeff36dc">RoutingModel::GetCumulBounds</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>& solution_assignment,</div>
|
|
<div class="line"><a id="l03877" name="l03877"></a><span class="lineno"> 3877</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>& dimension) {</div>
|
|
<div class="line"><a id="l03878" name="l03878"></a><span class="lineno"> 3878</span> std::vector<std::vector<std::pair<int64_t, int64_t>>> cumul_bounds(</div>
|
|
<div class="line"><a id="l03879" name="l03879"></a><span class="lineno"> 3879</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>());</div>
|
|
<div class="line"><a id="l03880" name="l03880"></a><span class="lineno"> 3880</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++vehicle) {</div>
|
|
<div class="line"><a id="l03881" name="l03881"></a><span class="lineno"> 3881</span> <span class="keywordflow">if</span> (!solution_assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#aecf5d63faebdaeda9dca52f916576459">Bound</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(vehicle))) {</div>
|
|
<div class="line"><a id="l03882" name="l03882"></a><span class="lineno"> 3882</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(DFATAL) << <span class="stringliteral">"GetCumulBounds() called on incomplete solution:"</span></div>
|
|
<div class="line"><a id="l03883" name="l03883"></a><span class="lineno"> 3883</span> << <span class="stringliteral">" NextVar("</span> << vehicle << <span class="stringliteral">") is unbound."</span>;</div>
|
|
<div class="line"><a id="l03884" name="l03884"></a><span class="lineno"> 3884</span> }</div>
|
|
<div class="line"><a id="l03885" name="l03885"></a><span class="lineno"> 3885</span> }</div>
|
|
<div class="line"><a id="l03886" name="l03886"></a><span class="lineno"> 3886</span> </div>
|
|
<div class="line"><a id="l03887" name="l03887"></a><span class="lineno"> 3887</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle_id = 0; vehicle_id < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++vehicle_id) {</div>
|
|
<div class="line"><a id="l03888" name="l03888"></a><span class="lineno"> 3888</span> int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(vehicle_id);</div>
|
|
<div class="line"><a id="l03889" name="l03889"></a><span class="lineno"> 3889</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* dim_var = dimension.<a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a3a71e48b4ed287752b9d9d9f7086ec7d">CumulVar</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l03890" name="l03890"></a><span class="lineno"> 3890</span> cumul_bounds[vehicle_id].emplace_back(solution_assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#af2c17e9e8d310419dade841aca1ab837">Min</a>(dim_var),</div>
|
|
<div class="line"><a id="l03891" name="l03891"></a><span class="lineno"> 3891</span> solution_assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#a8dbbd913afa005c99a0ec9cbfa665b46">Max</a>(dim_var));</div>
|
|
<div class="line"><a id="l03892" name="l03892"></a><span class="lineno"> 3892</span> <span class="keywordflow">while</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)) {</div>
|
|
<div class="line"><a id="l03893" name="l03893"></a><span class="lineno"> 3893</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = solution_assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#a8e0cac088b44596d620963b8bc693770">Value</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>));</div>
|
|
<div class="line"><a id="l03894" name="l03894"></a><span class="lineno"> 3894</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* dim_var = dimension.<a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a3a71e48b4ed287752b9d9d9f7086ec7d">CumulVar</a>(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l03895" name="l03895"></a><span class="lineno"> 3895</span> cumul_bounds[vehicle_id].emplace_back(solution_assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#af2c17e9e8d310419dade841aca1ab837">Min</a>(dim_var),</div>
|
|
<div class="line"><a id="l03896" name="l03896"></a><span class="lineno"> 3896</span> solution_assignment.<a class="code hl_function" href="classoperations__research_1_1_assignment.html#a8dbbd913afa005c99a0ec9cbfa665b46">Max</a>(dim_var));</div>
|
|
<div class="line"><a id="l03897" name="l03897"></a><span class="lineno"> 3897</span> }</div>
|
|
<div class="line"><a id="l03898" name="l03898"></a><span class="lineno"> 3898</span> }</div>
|
|
<div class="line"><a id="l03899" name="l03899"></a><span class="lineno"> 3899</span> <span class="keywordflow">return</span> cumul_bounds;</div>
|
|
<div class="line"><a id="l03900" name="l03900"></a><span class="lineno"> 3900</span>}</div>
|
|
<div class="line"><a id="l03901" name="l03901"></a><span class="lineno"> 3901</span><span class="preprocessor">#endif</span></div>
|
|
<div class="line"><a id="l03902" name="l03902"></a><span class="lineno"> 3902</span> </div>
|
|
<div class="line"><a id="l03903" name="l03903"></a><span class="lineno"> 3903</span><a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* RoutingModel::GetOrCreateAssignment() {</div>
|
|
<div class="line"><a id="l03904" name="l03904"></a><span class="lineno"> 3904</span> <span class="keywordflow">if</span> (assignment_ == <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l03905" name="l03905"></a><span class="lineno"> 3905</span> assignment_ = solver_->MakeAssignment();</div>
|
|
<div class="line"><a id="l03906" name="l03906"></a><span class="lineno"> 3906</span> assignment_->Add(nexts_);</div>
|
|
<div class="line"><a id="l03907" name="l03907"></a><span class="lineno"> 3907</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853">CostsAreHomogeneousAcrossVehicles</a>()) {</div>
|
|
<div class="line"><a id="l03908" name="l03908"></a><span class="lineno"> 3908</span> assignment_->Add(vehicle_vars_);</div>
|
|
<div class="line"><a id="l03909" name="l03909"></a><span class="lineno"> 3909</span> }</div>
|
|
<div class="line"><a id="l03910" name="l03910"></a><span class="lineno"> 3910</span> assignment_->AddObjective(cost_);</div>
|
|
<div class="line"><a id="l03911" name="l03911"></a><span class="lineno"> 3911</span> }</div>
|
|
<div class="line"><a id="l03912" name="l03912"></a><span class="lineno"> 3912</span> <span class="keywordflow">return</span> assignment_;</div>
|
|
<div class="line"><a id="l03913" name="l03913"></a><span class="lineno"> 3913</span>}</div>
|
|
<div class="line"><a id="l03914" name="l03914"></a><span class="lineno"> 3914</span> </div>
|
|
<div class="line"><a id="l03915" name="l03915"></a><span class="lineno"> 3915</span>Assignment* RoutingModel::GetOrCreateTmpAssignment() {</div>
|
|
<div class="line"><a id="l03916" name="l03916"></a><span class="lineno"> 3916</span> <span class="keywordflow">if</span> (tmp_assignment_ == <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l03917" name="l03917"></a><span class="lineno"> 3917</span> tmp_assignment_ = solver_->MakeAssignment();</div>
|
|
<div class="line"><a id="l03918" name="l03918"></a><span class="lineno"> 3918</span> tmp_assignment_->Add(nexts_);</div>
|
|
<div class="line"><a id="l03919" name="l03919"></a><span class="lineno"> 3919</span> }</div>
|
|
<div class="line"><a id="l03920" name="l03920"></a><span class="lineno"> 3920</span> <span class="keywordflow">return</span> tmp_assignment_;</div>
|
|
<div class="line"><a id="l03921" name="l03921"></a><span class="lineno"> 3921</span>}</div>
|
|
<div class="line"><a id="l03922" name="l03922"></a><span class="lineno"> 3922</span> </div>
|
|
<div class="line"><a id="l03923" name="l03923"></a><span class="lineno"> 3923</span>RegularLimit* RoutingModel::GetOrCreateLimit() {</div>
|
|
<div class="line"><a id="l03924" name="l03924"></a><span class="lineno"> 3924</span> <span class="keywordflow">if</span> (limit_ == <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l03925" name="l03925"></a><span class="lineno"> 3925</span> <a class="code hl_variable" href="expressions_8cc.html#aae6e045630301833144e9075260cb2b9">limit_</a> = solver_->MakeLimit(</div>
|
|
<div class="line"><a id="l03926" name="l03926"></a><span class="lineno"> 3926</span> absl::InfiniteDuration(), <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(),</div>
|
|
<div class="line"><a id="l03927" name="l03927"></a><span class="lineno"> 3927</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(),</div>
|
|
<div class="line"><a id="l03928" name="l03928"></a><span class="lineno"> 3928</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(), <span class="comment">/*smart_time_check=*/</span><span class="keyword">true</span>);</div>
|
|
<div class="line"><a id="l03929" name="l03929"></a><span class="lineno"> 3929</span> }</div>
|
|
<div class="line"><a id="l03930" name="l03930"></a><span class="lineno"> 3930</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="expressions_8cc.html#aae6e045630301833144e9075260cb2b9">limit_</a>;</div>
|
|
<div class="line"><a id="l03931" name="l03931"></a><span class="lineno"> 3931</span>}</div>
|
|
<div class="line"><a id="l03932" name="l03932"></a><span class="lineno"> 3932</span> </div>
|
|
<div class="line"><a id="l03933" name="l03933"></a><span class="lineno"> 3933</span>RegularLimit* RoutingModel::GetOrCreateLocalSearchLimit() {</div>
|
|
<div class="line"><a id="l03934" name="l03934"></a><span class="lineno"> 3934</span> <span class="keywordflow">if</span> (ls_limit_ == <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l03935" name="l03935"></a><span class="lineno"> 3935</span> ls_limit_ = solver_->MakeLimit(absl::InfiniteDuration(),</div>
|
|
<div class="line"><a id="l03936" name="l03936"></a><span class="lineno"> 3936</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(),</div>
|
|
<div class="line"><a id="l03937" name="l03937"></a><span class="lineno"> 3937</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(),</div>
|
|
<div class="line"><a id="l03938" name="l03938"></a><span class="lineno"> 3938</span> <span class="comment">/*solutions=*/</span>1, <span class="comment">/*smart_time_check=*/</span><span class="keyword">true</span>);</div>
|
|
<div class="line"><a id="l03939" name="l03939"></a><span class="lineno"> 3939</span> }</div>
|
|
<div class="line"><a id="l03940" name="l03940"></a><span class="lineno"> 3940</span> <span class="keywordflow">return</span> ls_limit_;</div>
|
|
<div class="line"><a id="l03941" name="l03941"></a><span class="lineno"> 3941</span>}</div>
|
|
<div class="line"><a id="l03942" name="l03942"></a><span class="lineno"> 3942</span> </div>
|
|
<div class="line"><a id="l03943" name="l03943"></a><span class="lineno"> 3943</span>RegularLimit* RoutingModel::GetOrCreateLargeNeighborhoodSearchLimit() {</div>
|
|
<div class="line"><a id="l03944" name="l03944"></a><span class="lineno"> 3944</span> <span class="keywordflow">if</span> (lns_limit_ == <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l03945" name="l03945"></a><span class="lineno"> 3945</span> lns_limit_ = solver_->MakeLimit(</div>
|
|
<div class="line"><a id="l03946" name="l03946"></a><span class="lineno"> 3946</span> absl::InfiniteDuration(), <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(),</div>
|
|
<div class="line"><a id="l03947" name="l03947"></a><span class="lineno"> 3947</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(),</div>
|
|
<div class="line"><a id="l03948" name="l03948"></a><span class="lineno"> 3948</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(), <span class="comment">/*smart_time_check=*/</span><span class="keyword">false</span>);</div>
|
|
<div class="line"><a id="l03949" name="l03949"></a><span class="lineno"> 3949</span> }</div>
|
|
<div class="line"><a id="l03950" name="l03950"></a><span class="lineno"> 3950</span> <span class="keywordflow">return</span> lns_limit_;</div>
|
|
<div class="line"><a id="l03951" name="l03951"></a><span class="lineno"> 3951</span>}</div>
|
|
<div class="line"><a id="l03952" name="l03952"></a><span class="lineno"> 3952</span> </div>
|
|
<div class="line"><a id="l03953" name="l03953"></a><span class="lineno"> 3953</span>RegularLimit*</div>
|
|
<div class="line"><a id="l03954" name="l03954"></a><span class="lineno"> 3954</span>RoutingModel::GetOrCreateFirstSolutionLargeNeighborhoodSearchLimit() {</div>
|
|
<div class="line"><a id="l03955" name="l03955"></a><span class="lineno"> 3955</span> <span class="keywordflow">if</span> (first_solution_lns_limit_ == <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l03956" name="l03956"></a><span class="lineno"> 3956</span> first_solution_lns_limit_ = solver_->MakeLimit(</div>
|
|
<div class="line"><a id="l03957" name="l03957"></a><span class="lineno"> 3957</span> absl::InfiniteDuration(), <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(),</div>
|
|
<div class="line"><a id="l03958" name="l03958"></a><span class="lineno"> 3958</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(),</div>
|
|
<div class="line"><a id="l03959" name="l03959"></a><span class="lineno"> 3959</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(), <span class="comment">/*smart_time_check=*/</span><span class="keyword">false</span>);</div>
|
|
<div class="line"><a id="l03960" name="l03960"></a><span class="lineno"> 3960</span> }</div>
|
|
<div class="line"><a id="l03961" name="l03961"></a><span class="lineno"> 3961</span> <span class="keywordflow">return</span> first_solution_lns_limit_;</div>
|
|
<div class="line"><a id="l03962" name="l03962"></a><span class="lineno"> 3962</span>}</div>
|
|
<div class="line"><a id="l03963" name="l03963"></a><span class="lineno"> 3963</span> </div>
|
|
<div class="line"><a id="l03964" name="l03964"></a><span class="lineno"> 3964</span>LocalSearchOperator* RoutingModel::CreateInsertionOperator() {</div>
|
|
<div class="line"><a id="l03965" name="l03965"></a><span class="lineno"> 3965</span> LocalSearchOperator* insertion_operator =</div>
|
|
<div class="line"><a id="l03966" name="l03966"></a><span class="lineno"> 3966</span> CreateCPOperator<MakeActiveOperator>();</div>
|
|
<div class="line"><a id="l03967" name="l03967"></a><span class="lineno"> 3967</span> <span class="keywordflow">if</span> (!pickup_delivery_pairs_.empty()) {</div>
|
|
<div class="line"><a id="l03968" name="l03968"></a><span class="lineno"> 3968</span> insertion_operator = solver_->ConcatenateOperators(</div>
|
|
<div class="line"><a id="l03969" name="l03969"></a><span class="lineno"> 3969</span> {CreatePairOperator<MakePairActiveOperator>(), insertion_operator});</div>
|
|
<div class="line"><a id="l03970" name="l03970"></a><span class="lineno"> 3970</span> }</div>
|
|
<div class="line"><a id="l03971" name="l03971"></a><span class="lineno"> 3971</span> <span class="keywordflow">if</span> (!implicit_pickup_delivery_pairs_without_alternatives_.empty()) {</div>
|
|
<div class="line"><a id="l03972" name="l03972"></a><span class="lineno"> 3972</span> insertion_operator = solver_->ConcatenateOperators(</div>
|
|
<div class="line"><a id="l03973" name="l03973"></a><span class="lineno"> 3973</span> {CreateOperator<MakePairActiveOperator>(</div>
|
|
<div class="line"><a id="l03974" name="l03974"></a><span class="lineno"> 3974</span> implicit_pickup_delivery_pairs_without_alternatives_),</div>
|
|
<div class="line"><a id="l03975" name="l03975"></a><span class="lineno"> 3975</span> insertion_operator});</div>
|
|
<div class="line"><a id="l03976" name="l03976"></a><span class="lineno"> 3976</span> }</div>
|
|
<div class="line"><a id="l03977" name="l03977"></a><span class="lineno"> 3977</span> <span class="keywordflow">return</span> insertion_operator;</div>
|
|
<div class="line"><a id="l03978" name="l03978"></a><span class="lineno"> 3978</span>}</div>
|
|
<div class="line"><a id="l03979" name="l03979"></a><span class="lineno"> 3979</span> </div>
|
|
<div class="line"><a id="l03980" name="l03980"></a><span class="lineno"> 3980</span>LocalSearchOperator* RoutingModel::CreateMakeInactiveOperator() {</div>
|
|
<div class="line"><a id="l03981" name="l03981"></a><span class="lineno"> 3981</span> LocalSearchOperator* make_inactive_operator =</div>
|
|
<div class="line"><a id="l03982" name="l03982"></a><span class="lineno"> 3982</span> CreateCPOperator<MakeInactiveOperator>();</div>
|
|
<div class="line"><a id="l03983" name="l03983"></a><span class="lineno"> 3983</span> <span class="keywordflow">if</span> (!pickup_delivery_pairs_.empty()) {</div>
|
|
<div class="line"><a id="l03984" name="l03984"></a><span class="lineno"> 3984</span> make_inactive_operator = solver_->ConcatenateOperators(</div>
|
|
<div class="line"><a id="l03985" name="l03985"></a><span class="lineno"> 3985</span> {CreatePairOperator<MakePairInactiveOperator>(),</div>
|
|
<div class="line"><a id="l03986" name="l03986"></a><span class="lineno"> 3986</span> make_inactive_operator});</div>
|
|
<div class="line"><a id="l03987" name="l03987"></a><span class="lineno"> 3987</span> }</div>
|
|
<div class="line"><a id="l03988" name="l03988"></a><span class="lineno"> 3988</span> <span class="keywordflow">return</span> make_inactive_operator;</div>
|
|
<div class="line"><a id="l03989" name="l03989"></a><span class="lineno"> 3989</span>}</div>
|
|
<div class="line"><a id="l03990" name="l03990"></a><span class="lineno"> 3990</span> </div>
|
|
<div class="line"><a id="l03991" name="l03991"></a><span class="lineno"> 3991</span><span class="keywordtype">void</span> RoutingModel::CreateNeighborhoodOperators(</div>
|
|
<div class="line"><a id="l03992" name="l03992"></a><span class="lineno"> 3992</span> <span class="keyword">const</span> RoutingSearchParameters& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>) {</div>
|
|
<div class="line"><a id="l03993" name="l03993"></a><span class="lineno"> 3993</span> local_search_operators_.clear();</div>
|
|
<div class="line"><a id="l03994" name="l03994"></a><span class="lineno"> 3994</span> local_search_operators_.resize(LOCAL_SEARCH_OPERATOR_COUNTER, <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l03995" name="l03995"></a><span class="lineno"> 3995</span> {</div>
|
|
<div class="line"><a id="l03996" name="l03996"></a><span class="lineno"> 3996</span> <span class="comment">// Operators defined by Solver::LocalSearchOperators.</span></div>
|
|
<div class="line"><a id="l03997" name="l03997"></a><span class="lineno"> 3997</span> <span class="keyword">const</span> std::vector<</div>
|
|
<div class="line"><a id="l03998" name="l03998"></a><span class="lineno"> 3998</span> std::pair<RoutingLocalSearchOperator, Solver::LocalSearchOperators>></div>
|
|
<div class="line"><a id="l03999" name="l03999"></a><span class="lineno"> 3999</span> operator_by_type = {{OR_OPT, <a class="code hl_enumvalue" href="classoperations__research_1_1_solver.html#a6fc60ae040ae35c83f09736d2e682a18a9bbd3bcce8e7d9e4a6901cce828e8704">Solver::OROPT</a>},</div>
|
|
<div class="line"><a id="l04000" name="l04000"></a><span class="lineno"> 4000</span> {PATH_LNS, <a class="code hl_enumvalue" href="classoperations__research_1_1_solver.html#a6fc60ae040ae35c83f09736d2e682a18a9ea125a691a8fb716dc09ac09db7c4f3">Solver::PATHLNS</a>},</div>
|
|
<div class="line"><a id="l04001" name="l04001"></a><span class="lineno"> 4001</span> {FULL_PATH_LNS, <a class="code hl_enumvalue" href="classoperations__research_1_1_solver.html#a6fc60ae040ae35c83f09736d2e682a18a935985d0022c026978eace7ff7cd5f7a">Solver::FULLPATHLNS</a>},</div>
|
|
<div class="line"><a id="l04002" name="l04002"></a><span class="lineno"> 4002</span> {INACTIVE_LNS, <a class="code hl_enumvalue" href="classoperations__research_1_1_solver.html#a6fc60ae040ae35c83f09736d2e682a18a9fe88872d52e4a1fead358f9f6b57408">Solver::UNACTIVELNS</a>}};</div>
|
|
<div class="line"><a id="l04003" name="l04003"></a><span class="lineno"> 4003</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> [type, op] : operator_by_type) {</div>
|
|
<div class="line"><a id="l04004" name="l04004"></a><span class="lineno"> 4004</span> local_search_operators_[type] =</div>
|
|
<div class="line"><a id="l04005" name="l04005"></a><span class="lineno"> 4005</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853">CostsAreHomogeneousAcrossVehicles</a>()</div>
|
|
<div class="line"><a id="l04006" name="l04006"></a><span class="lineno"> 4006</span> ? solver_->MakeOperator(nexts_, op)</div>
|
|
<div class="line"><a id="l04007" name="l04007"></a><span class="lineno"> 4007</span> : solver_->MakeOperator(nexts_, vehicle_vars_, op);</div>
|
|
<div class="line"><a id="l04008" name="l04008"></a><span class="lineno"> 4008</span> }</div>
|
|
<div class="line"><a id="l04009" name="l04009"></a><span class="lineno"> 4009</span> }</div>
|
|
<div class="line"><a id="l04010" name="l04010"></a><span class="lineno"> 4010</span> {</div>
|
|
<div class="line"><a id="l04011" name="l04011"></a><span class="lineno"> 4011</span> <span class="comment">// Operators defined by Solver::EvaluatorLocalSearchOperators.</span></div>
|
|
<div class="line"><a id="l04012" name="l04012"></a><span class="lineno"> 4012</span> <span class="keyword">const</span> std::vector<std::pair<RoutingLocalSearchOperator,</div>
|
|
<div class="line"><a id="l04013" name="l04013"></a><span class="lineno"> 4013</span> <a class="code hl_enumeration" href="classoperations__research_1_1_solver.html#afd2868244e1a645aaf41eb8a6a6c8bf4">Solver::EvaluatorLocalSearchOperators</a>>></div>
|
|
<div class="line"><a id="l04014" name="l04014"></a><span class="lineno"> 4014</span> operator_by_type = {{LIN_KERNIGHAN, <a class="code hl_enumvalue" href="classoperations__research_1_1_solver.html#afd2868244e1a645aaf41eb8a6a6c8bf4a2e646463fe193258a090a50ba806fd6e">Solver::LK</a>},</div>
|
|
<div class="line"><a id="l04015" name="l04015"></a><span class="lineno"> 4015</span> {TSP_OPT, <a class="code hl_enumvalue" href="classoperations__research_1_1_solver.html#afd2868244e1a645aaf41eb8a6a6c8bf4a092684b466c2d8f6dffcc4fcc45a4c87">Solver::TSPOPT</a>},</div>
|
|
<div class="line"><a id="l04016" name="l04016"></a><span class="lineno"> 4016</span> {TSP_LNS, <a class="code hl_enumvalue" href="classoperations__research_1_1_solver.html#afd2868244e1a645aaf41eb8a6a6c8bf4af23b5d9059cb973667272b793cfd37b1">Solver::TSPLNS</a>}};</div>
|
|
<div class="line"><a id="l04017" name="l04017"></a><span class="lineno"> 4017</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> [type, op] : operator_by_type) {</div>
|
|
<div class="line"><a id="l04018" name="l04018"></a><span class="lineno"> 4018</span> <span class="keyword">auto</span> arc_cost =</div>
|
|
<div class="line"><a id="l04019" name="l04019"></a><span class="lineno"> 4019</span> absl::bind_front(&<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8174e01c9a66c00a87cdbe86ccd3655c">RoutingModel::GetArcCostForVehicle</a>, <span class="keyword">this</span>);</div>
|
|
<div class="line"><a id="l04020" name="l04020"></a><span class="lineno"> 4020</span> local_search_operators_[type] =</div>
|
|
<div class="line"><a id="l04021" name="l04021"></a><span class="lineno"> 4021</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853">CostsAreHomogeneousAcrossVehicles</a>()</div>
|
|
<div class="line"><a id="l04022" name="l04022"></a><span class="lineno"> 4022</span> ? solver_->MakeOperator(nexts_, std::move(arc_cost), op)</div>
|
|
<div class="line"><a id="l04023" name="l04023"></a><span class="lineno"> 4023</span> : solver_->MakeOperator(nexts_, vehicle_vars_,</div>
|
|
<div class="line"><a id="l04024" name="l04024"></a><span class="lineno"> 4024</span> std::move(arc_cost), op);</div>
|
|
<div class="line"><a id="l04025" name="l04025"></a><span class="lineno"> 4025</span> }</div>
|
|
<div class="line"><a id="l04026" name="l04026"></a><span class="lineno"> 4026</span> }</div>
|
|
<div class="line"><a id="l04027" name="l04027"></a><span class="lineno"> 4027</span> </div>
|
|
<div class="line"><a id="l04028" name="l04028"></a><span class="lineno"> 4028</span> <span class="comment">// Other operators defined in the CP solver.</span></div>
|
|
<div class="line"><a id="l04029" name="l04029"></a><span class="lineno"> 4029</span> local_search_operators_[RELOCATE] = CreateCPOperator<Relocate>();</div>
|
|
<div class="line"><a id="l04030" name="l04030"></a><span class="lineno"> 4030</span> local_search_operators_[EXCHANGE] = CreateCPOperator<Exchange>();</div>
|
|
<div class="line"><a id="l04031" name="l04031"></a><span class="lineno"> 4031</span> local_search_operators_[CROSS] = CreateCPOperator<Cross>();</div>
|
|
<div class="line"><a id="l04032" name="l04032"></a><span class="lineno"> 4032</span> local_search_operators_[TWO_OPT] = CreateCPOperator<TwoOpt>();</div>
|
|
<div class="line"><a id="l04033" name="l04033"></a><span class="lineno"> 4033</span> local_search_operators_[RELOCATE_AND_MAKE_ACTIVE] =</div>
|
|
<div class="line"><a id="l04034" name="l04034"></a><span class="lineno"> 4034</span> CreateCPOperator<RelocateAndMakeActiveOperator>();</div>
|
|
<div class="line"><a id="l04035" name="l04035"></a><span class="lineno"> 4035</span> local_search_operators_[MAKE_ACTIVE_AND_RELOCATE] =</div>
|
|
<div class="line"><a id="l04036" name="l04036"></a><span class="lineno"> 4036</span> CreateCPOperator<MakeActiveAndRelocate>();</div>
|
|
<div class="line"><a id="l04037" name="l04037"></a><span class="lineno"> 4037</span> local_search_operators_[MAKE_CHAIN_INACTIVE] =</div>
|
|
<div class="line"><a id="l04038" name="l04038"></a><span class="lineno"> 4038</span> CreateCPOperator<MakeChainInactiveOperator>();</div>
|
|
<div class="line"><a id="l04039" name="l04039"></a><span class="lineno"> 4039</span> local_search_operators_[SWAP_ACTIVE] = CreateCPOperator<SwapActiveOperator>();</div>
|
|
<div class="line"><a id="l04040" name="l04040"></a><span class="lineno"> 4040</span> local_search_operators_[EXTENDED_SWAP_ACTIVE] =</div>
|
|
<div class="line"><a id="l04041" name="l04041"></a><span class="lineno"> 4041</span> CreateCPOperator<ExtendedSwapActiveOperator>();</div>
|
|
<div class="line"><a id="l04042" name="l04042"></a><span class="lineno"> 4042</span> </div>
|
|
<div class="line"><a id="l04043" name="l04043"></a><span class="lineno"> 4043</span> <span class="comment">// Routing-specific operators.</span></div>
|
|
<div class="line"><a id="l04044" name="l04044"></a><span class="lineno"> 4044</span> local_search_operators_[MAKE_ACTIVE] = CreateInsertionOperator();</div>
|
|
<div class="line"><a id="l04045" name="l04045"></a><span class="lineno"> 4045</span> local_search_operators_[MAKE_INACTIVE] = CreateMakeInactiveOperator();</div>
|
|
<div class="line"><a id="l04046" name="l04046"></a><span class="lineno"> 4046</span> local_search_operators_[RELOCATE_PAIR] =</div>
|
|
<div class="line"><a id="l04047" name="l04047"></a><span class="lineno"> 4047</span> CreatePairOperator<PairRelocateOperator>();</div>
|
|
<div class="line"><a id="l04048" name="l04048"></a><span class="lineno"> 4048</span> std::vector<LocalSearchOperator*> light_relocate_pair_operators;</div>
|
|
<div class="line"><a id="l04049" name="l04049"></a><span class="lineno"> 4049</span> light_relocate_pair_operators.push_back(</div>
|
|
<div class="line"><a id="l04050" name="l04050"></a><span class="lineno"> 4050</span> CreatePairOperator<LightPairRelocateOperator>());</div>
|
|
<div class="line"><a id="l04051" name="l04051"></a><span class="lineno"> 4051</span> local_search_operators_[LIGHT_RELOCATE_PAIR] =</div>
|
|
<div class="line"><a id="l04052" name="l04052"></a><span class="lineno"> 4052</span> solver_->ConcatenateOperators(light_relocate_pair_operators);</div>
|
|
<div class="line"><a id="l04053" name="l04053"></a><span class="lineno"> 4053</span> local_search_operators_[EXCHANGE_PAIR] =</div>
|
|
<div class="line"><a id="l04054" name="l04054"></a><span class="lineno"> 4054</span> CreatePairOperator<PairExchangeOperator>();</div>
|
|
<div class="line"><a id="l04055" name="l04055"></a><span class="lineno"> 4055</span> local_search_operators_[EXCHANGE_RELOCATE_PAIR] =</div>
|
|
<div class="line"><a id="l04056" name="l04056"></a><span class="lineno"> 4056</span> CreatePairOperator<PairExchangeRelocateOperator>();</div>
|
|
<div class="line"><a id="l04057" name="l04057"></a><span class="lineno"> 4057</span> local_search_operators_[RELOCATE_NEIGHBORS] =</div>
|
|
<div class="line"><a id="l04058" name="l04058"></a><span class="lineno"> 4058</span> CreateOperator<MakeRelocateNeighborsOperator>(</div>
|
|
<div class="line"><a id="l04059" name="l04059"></a><span class="lineno"> 4059</span> absl::bind_front(&<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a51b526b532fc95cfed13d54ed2d6db95">RoutingModel::GetHomogeneousCost</a>, <span class="keyword">this</span>));</div>
|
|
<div class="line"><a id="l04060" name="l04060"></a><span class="lineno"> 4060</span> local_search_operators_[NODE_PAIR_SWAP] = solver_->ConcatenateOperators(</div>
|
|
<div class="line"><a id="l04061" name="l04061"></a><span class="lineno"> 4061</span> {CreatePairOperator<IndexPairSwapActiveOperator>(),</div>
|
|
<div class="line"><a id="l04062" name="l04062"></a><span class="lineno"> 4062</span> CreatePairOperator<SwapIndexPairOperator>(),</div>
|
|
<div class="line"><a id="l04063" name="l04063"></a><span class="lineno"> 4063</span> CreatePairOperator<PairNodeSwapActiveOperator<true>>(),</div>
|
|
<div class="line"><a id="l04064" name="l04064"></a><span class="lineno"> 4064</span> CreatePairOperator<PairNodeSwapActiveOperator<false>>()});</div>
|
|
<div class="line"><a id="l04065" name="l04065"></a><span class="lineno"> 4065</span> local_search_operators_[RELOCATE_SUBTRIP] =</div>
|
|
<div class="line"><a id="l04066" name="l04066"></a><span class="lineno"> 4066</span> CreatePairOperator<RelocateSubtrip>();</div>
|
|
<div class="line"><a id="l04067" name="l04067"></a><span class="lineno"> 4067</span> local_search_operators_[EXCHANGE_SUBTRIP] =</div>
|
|
<div class="line"><a id="l04068" name="l04068"></a><span class="lineno"> 4068</span> CreatePairOperator<ExchangeSubtrip>();</div>
|
|
<div class="line"><a id="l04069" name="l04069"></a><span class="lineno"> 4069</span> </div>
|
|
<div class="line"><a id="l04070" name="l04070"></a><span class="lineno"> 4070</span> <span class="keyword">const</span> <span class="keyword">auto</span> arc_cost_for_path_start =</div>
|
|
<div class="line"><a id="l04071" name="l04071"></a><span class="lineno"> 4071</span> [<span class="keyword">this</span>](int64_t before_node, int64_t after_node, int64_t start_index) {</div>
|
|
<div class="line"><a id="l04072" name="l04072"></a><span class="lineno"> 4072</span> <span class="keyword">const</span> <span class="keywordtype">int</span> vehicle = index_to_vehicle_[start_index];</div>
|
|
<div class="line"><a id="l04073" name="l04073"></a><span class="lineno"> 4073</span> <span class="keyword">const</span> int64_t arc_cost =</div>
|
|
<div class="line"><a id="l04074" name="l04074"></a><span class="lineno"> 4074</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8174e01c9a66c00a87cdbe86ccd3655c">GetArcCostForVehicle</a>(before_node, after_node, vehicle);</div>
|
|
<div class="line"><a id="l04075" name="l04075"></a><span class="lineno"> 4075</span> <span class="keywordflow">return</span> (before_node != start_index || <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(after_node))</div>
|
|
<div class="line"><a id="l04076" name="l04076"></a><span class="lineno"> 4076</span> ? arc_cost</div>
|
|
<div class="line"><a id="l04077" name="l04077"></a><span class="lineno"> 4077</span> : <a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(arc_cost, <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a34bd38fe78ef5896f2a623170f1be5d0">GetFixedCostOfVehicle</a>(vehicle));</div>
|
|
<div class="line"><a id="l04078" name="l04078"></a><span class="lineno"> 4078</span> };</div>
|
|
<div class="line"><a id="l04079" name="l04079"></a><span class="lineno"> 4079</span> local_search_operators_[RELOCATE_EXPENSIVE_CHAIN] =</div>
|
|
<div class="line"><a id="l04080" name="l04080"></a><span class="lineno"> 4080</span> solver_->RevAlloc(<span class="keyword">new</span> RelocateExpensiveChain(</div>
|
|
<div class="line"><a id="l04081" name="l04081"></a><span class="lineno"> 4081</span> nexts_,</div>
|
|
<div class="line"><a id="l04082" name="l04082"></a><span class="lineno"> 4082</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853">CostsAreHomogeneousAcrossVehicles</a>() ? std::vector<IntVar*>()</div>
|
|
<div class="line"><a id="l04083" name="l04083"></a><span class="lineno"> 4083</span> : vehicle_vars_,</div>
|
|
<div class="line"><a id="l04084" name="l04084"></a><span class="lineno"> 4084</span> vehicle_start_class_callback_,</div>
|
|
<div class="line"><a id="l04085" name="l04085"></a><span class="lineno"> 4085</span> <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.relocate_expensive_chain_num_arcs_to_consider(),</div>
|
|
<div class="line"><a id="l04086" name="l04086"></a><span class="lineno"> 4086</span> arc_cost_for_path_start));</div>
|
|
<div class="line"><a id="l04087" name="l04087"></a><span class="lineno"> 4087</span> </div>
|
|
<div class="line"><a id="l04088" name="l04088"></a><span class="lineno"> 4088</span> <span class="comment">// Insertion-based LNS neighborhoods.</span></div>
|
|
<div class="line"><a id="l04089" name="l04089"></a><span class="lineno"> 4089</span> <span class="keyword">const</span> <span class="keyword">auto</span> make_global_cheapest_insertion_filtered_heuristic =</div>
|
|
<div class="line"><a id="l04090" name="l04090"></a><span class="lineno"> 4090</span> [<span class="keyword">this</span>, &<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>]() {</div>
|
|
<div class="line"><a id="l04091" name="l04091"></a><span class="lineno"> 4091</span> <span class="keyword">using</span> Heuristic = GlobalCheapestInsertionFilteredHeuristic;</div>
|
|
<div class="line"><a id="l04092" name="l04092"></a><span class="lineno"> 4092</span> Heuristic::GlobalCheapestInsertionParameters ls_gci_parameters;</div>
|
|
<div class="line"><a id="l04093" name="l04093"></a><span class="lineno"> 4093</span> ls_gci_parameters.is_sequential = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l04094" name="l04094"></a><span class="lineno"> 4094</span> ls_gci_parameters.farthest_seeds_ratio = 0.0;</div>
|
|
<div class="line"><a id="l04095" name="l04095"></a><span class="lineno"> 4095</span> ls_gci_parameters.neighbors_ratio =</div>
|
|
<div class="line"><a id="l04096" name="l04096"></a><span class="lineno"> 4096</span> <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.cheapest_insertion_ls_operator_neighbors_ratio();</div>
|
|
<div class="line"><a id="l04097" name="l04097"></a><span class="lineno"> 4097</span> ls_gci_parameters.min_neighbors =</div>
|
|
<div class="line"><a id="l04098" name="l04098"></a><span class="lineno"> 4098</span> <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.cheapest_insertion_ls_operator_min_neighbors();</div>
|
|
<div class="line"><a id="l04099" name="l04099"></a><span class="lineno"> 4099</span> ls_gci_parameters.use_neighbors_ratio_for_initialization = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l04100" name="l04100"></a><span class="lineno"> 4100</span> ls_gci_parameters.add_unperformed_entries =</div>
|
|
<div class="line"><a id="l04101" name="l04101"></a><span class="lineno"> 4101</span> <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.cheapest_insertion_add_unperformed_entries();</div>
|
|
<div class="line"><a id="l04102" name="l04102"></a><span class="lineno"> 4102</span> <span class="keywordflow">return</span> absl::make_unique<Heuristic>(</div>
|
|
<div class="line"><a id="l04103" name="l04103"></a><span class="lineno"> 4103</span> <span class="keyword">this</span>, absl::bind_front(&<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8174e01c9a66c00a87cdbe86ccd3655c">RoutingModel::GetArcCostForVehicle</a>, <span class="keyword">this</span>),</div>
|
|
<div class="line"><a id="l04104" name="l04104"></a><span class="lineno"> 4104</span> absl::bind_front(&<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a9285d707cc3302c913f5c88697743947">RoutingModel::UnperformedPenaltyOrValue</a>, <span class="keyword">this</span>, 0),</div>
|
|
<div class="line"><a id="l04105" name="l04105"></a><span class="lineno"> 4105</span> GetOrCreateFeasibilityFilterManager(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>), ls_gci_parameters);</div>
|
|
<div class="line"><a id="l04106" name="l04106"></a><span class="lineno"> 4106</span> };</div>
|
|
<div class="line"><a id="l04107" name="l04107"></a><span class="lineno"> 4107</span> <span class="keyword">const</span> <span class="keyword">auto</span> make_local_cheapest_insertion_filtered_heuristic =</div>
|
|
<div class="line"><a id="l04108" name="l04108"></a><span class="lineno"> 4108</span> [<span class="keyword">this</span>, &<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>]() {</div>
|
|
<div class="line"><a id="l04109" name="l04109"></a><span class="lineno"> 4109</span> <span class="keywordflow">return</span> absl::make_unique<LocalCheapestInsertionFilteredHeuristic>(</div>
|
|
<div class="line"><a id="l04110" name="l04110"></a><span class="lineno"> 4110</span> <span class="keyword">this</span>, absl::bind_front(&<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8174e01c9a66c00a87cdbe86ccd3655c">RoutingModel::GetArcCostForVehicle</a>, <span class="keyword">this</span>),</div>
|
|
<div class="line"><a id="l04111" name="l04111"></a><span class="lineno"> 4111</span> GetOrCreateFeasibilityFilterManager(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>));</div>
|
|
<div class="line"><a id="l04112" name="l04112"></a><span class="lineno"> 4112</span> };</div>
|
|
<div class="line"><a id="l04113" name="l04113"></a><span class="lineno"> 4113</span> local_search_operators_[GLOBAL_CHEAPEST_INSERTION_CLOSE_NODES_LNS] =</div>
|
|
<div class="line"><a id="l04114" name="l04114"></a><span class="lineno"> 4114</span> solver_->RevAlloc(<span class="keyword">new</span> FilteredHeuristicCloseNodesLNSOperator(</div>
|
|
<div class="line"><a id="l04115" name="l04115"></a><span class="lineno"> 4115</span> make_global_cheapest_insertion_filtered_heuristic(),</div>
|
|
<div class="line"><a id="l04116" name="l04116"></a><span class="lineno"> 4116</span> <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.heuristic_close_nodes_lns_num_nodes()));</div>
|
|
<div class="line"><a id="l04117" name="l04117"></a><span class="lineno"> 4117</span> </div>
|
|
<div class="line"><a id="l04118" name="l04118"></a><span class="lineno"> 4118</span> local_search_operators_[LOCAL_CHEAPEST_INSERTION_CLOSE_NODES_LNS] =</div>
|
|
<div class="line"><a id="l04119" name="l04119"></a><span class="lineno"> 4119</span> solver_->RevAlloc(<span class="keyword">new</span> FilteredHeuristicCloseNodesLNSOperator(</div>
|
|
<div class="line"><a id="l04120" name="l04120"></a><span class="lineno"> 4120</span> make_local_cheapest_insertion_filtered_heuristic(),</div>
|
|
<div class="line"><a id="l04121" name="l04121"></a><span class="lineno"> 4121</span> <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.heuristic_close_nodes_lns_num_nodes()));</div>
|
|
<div class="line"><a id="l04122" name="l04122"></a><span class="lineno"> 4122</span> </div>
|
|
<div class="line"><a id="l04123" name="l04123"></a><span class="lineno"> 4123</span> local_search_operators_[GLOBAL_CHEAPEST_INSERTION_PATH_LNS] =</div>
|
|
<div class="line"><a id="l04124" name="l04124"></a><span class="lineno"> 4124</span> solver_->RevAlloc(<span class="keyword">new</span> FilteredHeuristicPathLNSOperator(</div>
|
|
<div class="line"><a id="l04125" name="l04125"></a><span class="lineno"> 4125</span> make_global_cheapest_insertion_filtered_heuristic()));</div>
|
|
<div class="line"><a id="l04126" name="l04126"></a><span class="lineno"> 4126</span> </div>
|
|
<div class="line"><a id="l04127" name="l04127"></a><span class="lineno"> 4127</span> local_search_operators_[LOCAL_CHEAPEST_INSERTION_PATH_LNS] =</div>
|
|
<div class="line"><a id="l04128" name="l04128"></a><span class="lineno"> 4128</span> solver_->RevAlloc(<span class="keyword">new</span> FilteredHeuristicPathLNSOperator(</div>
|
|
<div class="line"><a id="l04129" name="l04129"></a><span class="lineno"> 4129</span> make_local_cheapest_insertion_filtered_heuristic()));</div>
|
|
<div class="line"><a id="l04130" name="l04130"></a><span class="lineno"> 4130</span> </div>
|
|
<div class="line"><a id="l04131" name="l04131"></a><span class="lineno"> 4131</span> local_search_operators_</div>
|
|
<div class="line"><a id="l04132" name="l04132"></a><span class="lineno"> 4132</span> [RELOCATE_PATH_GLOBAL_CHEAPEST_INSERTION_INSERT_UNPERFORMED] =</div>
|
|
<div class="line"><a id="l04133" name="l04133"></a><span class="lineno"> 4133</span> solver_->RevAlloc(</div>
|
|
<div class="line"><a id="l04134" name="l04134"></a><span class="lineno"> 4134</span> <span class="keyword">new</span> RelocatePathAndHeuristicInsertUnperformedOperator(</div>
|
|
<div class="line"><a id="l04135" name="l04135"></a><span class="lineno"> 4135</span> make_global_cheapest_insertion_filtered_heuristic()));</div>
|
|
<div class="line"><a id="l04136" name="l04136"></a><span class="lineno"> 4136</span> </div>
|
|
<div class="line"><a id="l04137" name="l04137"></a><span class="lineno"> 4137</span> local_search_operators_[GLOBAL_CHEAPEST_INSERTION_EXPENSIVE_CHAIN_LNS] =</div>
|
|
<div class="line"><a id="l04138" name="l04138"></a><span class="lineno"> 4138</span> solver_->RevAlloc(<span class="keyword">new</span> FilteredHeuristicExpensiveChainLNSOperator(</div>
|
|
<div class="line"><a id="l04139" name="l04139"></a><span class="lineno"> 4139</span> make_global_cheapest_insertion_filtered_heuristic(),</div>
|
|
<div class="line"><a id="l04140" name="l04140"></a><span class="lineno"> 4140</span> <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.heuristic_expensive_chain_lns_num_arcs_to_consider(),</div>
|
|
<div class="line"><a id="l04141" name="l04141"></a><span class="lineno"> 4141</span> arc_cost_for_path_start));</div>
|
|
<div class="line"><a id="l04142" name="l04142"></a><span class="lineno"> 4142</span> </div>
|
|
<div class="line"><a id="l04143" name="l04143"></a><span class="lineno"> 4143</span> local_search_operators_[LOCAL_CHEAPEST_INSERTION_EXPENSIVE_CHAIN_LNS] =</div>
|
|
<div class="line"><a id="l04144" name="l04144"></a><span class="lineno"> 4144</span> solver_->RevAlloc(<span class="keyword">new</span> FilteredHeuristicExpensiveChainLNSOperator(</div>
|
|
<div class="line"><a id="l04145" name="l04145"></a><span class="lineno"> 4145</span> make_local_cheapest_insertion_filtered_heuristic(),</div>
|
|
<div class="line"><a id="l04146" name="l04146"></a><span class="lineno"> 4146</span> <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.heuristic_expensive_chain_lns_num_arcs_to_consider(),</div>
|
|
<div class="line"><a id="l04147" name="l04147"></a><span class="lineno"> 4147</span> arc_cost_for_path_start));</div>
|
|
<div class="line"><a id="l04148" name="l04148"></a><span class="lineno"> 4148</span>}</div>
|
|
<div class="line"><a id="l04149" name="l04149"></a><span class="lineno"> 4149</span> </div>
|
|
<div class="line"><a id="l04150" name="l04150"></a><span class="lineno"><a class="line" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8"> 4150</a></span><span class="preprocessor">#define CP_ROUTING_PUSH_OPERATOR(operator_type, operator_method, operators) \</span></div>
|
|
<div class="line"><a id="l04151" name="l04151"></a><span class="lineno"> 4151</span><span class="preprocessor"> if (search_parameters.local_search_operators().use_##operator_method() == \</span></div>
|
|
<div class="line"><a id="l04152" name="l04152"></a><span class="lineno"> 4152</span><span class="preprocessor"> BOOL_TRUE) { \</span></div>
|
|
<div class="line"><a id="l04153" name="l04153"></a><span class="lineno"> 4153</span><span class="preprocessor"> operators.push_back(local_search_operators_[operator_type]); \</span></div>
|
|
<div class="line"><a id="l04154" name="l04154"></a><span class="lineno"> 4154</span><span class="preprocessor"> }</span></div>
|
|
<div class="line"><a id="l04155" name="l04155"></a><span class="lineno"> 4155</span> </div>
|
|
<div class="line"><a id="l04156" name="l04156"></a><span class="lineno"> 4156</span>LocalSearchOperator* RoutingModel::ConcatenateOperators(</div>
|
|
<div class="line"><a id="l04157" name="l04157"></a><span class="lineno"> 4157</span> <span class="keyword">const</span> RoutingSearchParameters& search_parameters,</div>
|
|
<div class="line"><a id="l04158" name="l04158"></a><span class="lineno"> 4158</span> <span class="keyword">const</span> std::vector<LocalSearchOperator*>& operators)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l04159" name="l04159"></a><span class="lineno"> 4159</span> <span class="keywordflow">if</span> (search_parameters.use_multi_armed_bandit_concatenate_operators()) {</div>
|
|
<div class="line"><a id="l04160" name="l04160"></a><span class="lineno"> 4160</span> <span class="keywordflow">return</span> solver_->MultiArmedBanditConcatenateOperators(</div>
|
|
<div class="line"><a id="l04161" name="l04161"></a><span class="lineno"> 4161</span> operators,</div>
|
|
<div class="line"><a id="l04162" name="l04162"></a><span class="lineno"> 4162</span> search_parameters</div>
|
|
<div class="line"><a id="l04163" name="l04163"></a><span class="lineno"> 4163</span> .multi_armed_bandit_compound_operator_memory_coefficient(),</div>
|
|
<div class="line"><a id="l04164" name="l04164"></a><span class="lineno"> 4164</span> search_parameters</div>
|
|
<div class="line"><a id="l04165" name="l04165"></a><span class="lineno"> 4165</span> .multi_armed_bandit_compound_operator_exploration_coefficient(),</div>
|
|
<div class="line"><a id="l04166" name="l04166"></a><span class="lineno"> 4166</span> <span class="comment">/*maximize=*/</span><span class="keyword">false</span>);</div>
|
|
<div class="line"><a id="l04167" name="l04167"></a><span class="lineno"> 4167</span> }</div>
|
|
<div class="line"><a id="l04168" name="l04168"></a><span class="lineno"> 4168</span> <span class="keywordflow">return</span> solver_->ConcatenateOperators(operators);</div>
|
|
<div class="line"><a id="l04169" name="l04169"></a><span class="lineno"> 4169</span>}</div>
|
|
<div class="line"><a id="l04170" name="l04170"></a><span class="lineno"> 4170</span> </div>
|
|
<div class="line"><a id="l04171" name="l04171"></a><span class="lineno"> 4171</span>LocalSearchOperator* RoutingModel::GetNeighborhoodOperators(</div>
|
|
<div class="line"><a id="l04172" name="l04172"></a><span class="lineno"> 4172</span> <span class="keyword">const</span> RoutingSearchParameters& search_parameters)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l04173" name="l04173"></a><span class="lineno"> 4173</span> std::vector<LocalSearchOperator*> operator_groups;</div>
|
|
<div class="line"><a id="l04174" name="l04174"></a><span class="lineno"> 4174</span> std::vector<LocalSearchOperator*> operators = extra_operators_;</div>
|
|
<div class="line"><a id="l04175" name="l04175"></a><span class="lineno"> 4175</span> <span class="keywordflow">if</span> (!pickup_delivery_pairs_.empty()) {</div>
|
|
<div class="line"><a id="l04176" name="l04176"></a><span class="lineno"> 4176</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(RELOCATE_PAIR, relocate_pair, operators);</div>
|
|
<div class="line"><a id="l04177" name="l04177"></a><span class="lineno"> 4177</span> <span class="comment">// Only add the light version of relocate pair if the normal version has not</span></div>
|
|
<div class="line"><a id="l04178" name="l04178"></a><span class="lineno"> 4178</span> <span class="comment">// already been added as it covers a subset of its neighborhood.</span></div>
|
|
<div class="line"><a id="l04179" name="l04179"></a><span class="lineno"> 4179</span> <span class="keywordflow">if</span> (search_parameters.local_search_operators().use_relocate_pair() ==</div>
|
|
<div class="line"><a id="l04180" name="l04180"></a><span class="lineno"> 4180</span> <a class="code hl_enumvalue" href="namespaceoperations__research.html#ab13458305fa2eb87238ff66066eecd5daaced7f53e0be47857c07ad25642579c2">BOOL_FALSE</a>) {</div>
|
|
<div class="line"><a id="l04181" name="l04181"></a><span class="lineno"> 4181</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(LIGHT_RELOCATE_PAIR, light_relocate_pair,</div>
|
|
<div class="line"><a id="l04182" name="l04182"></a><span class="lineno"> 4182</span> operators);</div>
|
|
<div class="line"><a id="l04183" name="l04183"></a><span class="lineno"> 4183</span> }</div>
|
|
<div class="line"><a id="l04184" name="l04184"></a><span class="lineno"> 4184</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(EXCHANGE_PAIR, exchange_pair, operators);</div>
|
|
<div class="line"><a id="l04185" name="l04185"></a><span class="lineno"> 4185</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(NODE_PAIR_SWAP, node_pair_swap_active, operators);</div>
|
|
<div class="line"><a id="l04186" name="l04186"></a><span class="lineno"> 4186</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(RELOCATE_SUBTRIP, relocate_subtrip, operators);</div>
|
|
<div class="line"><a id="l04187" name="l04187"></a><span class="lineno"> 4187</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(EXCHANGE_SUBTRIP, exchange_subtrip, operators);</div>
|
|
<div class="line"><a id="l04188" name="l04188"></a><span class="lineno"> 4188</span> }</div>
|
|
<div class="line"><a id="l04189" name="l04189"></a><span class="lineno"> 4189</span> <span class="keywordflow">if</span> (vehicles_ > 1) {</div>
|
|
<div class="line"><a id="l04190" name="l04190"></a><span class="lineno"> 4190</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ad62f14646fa4da5b6836a2ae505706d2">GetNumOfSingletonNodes</a>() > 0) {</div>
|
|
<div class="line"><a id="l04191" name="l04191"></a><span class="lineno"> 4191</span> <span class="comment">// If there are only pairs in the model the only case where Relocate will</span></div>
|
|
<div class="line"><a id="l04192" name="l04192"></a><span class="lineno"> 4192</span> <span class="comment">// work is for intra-route moves, already covered by OrOpt.</span></div>
|
|
<div class="line"><a id="l04193" name="l04193"></a><span class="lineno"> 4193</span> <span class="comment">// We are not disabling Exchange and Cross because there are no</span></div>
|
|
<div class="line"><a id="l04194" name="l04194"></a><span class="lineno"> 4194</span> <span class="comment">// intra-route equivalents.</span></div>
|
|
<div class="line"><a id="l04195" name="l04195"></a><span class="lineno"> 4195</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(RELOCATE, relocate, operators);</div>
|
|
<div class="line"><a id="l04196" name="l04196"></a><span class="lineno"> 4196</span> }</div>
|
|
<div class="line"><a id="l04197" name="l04197"></a><span class="lineno"> 4197</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(EXCHANGE, exchange, operators);</div>
|
|
<div class="line"><a id="l04198" name="l04198"></a><span class="lineno"> 4198</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(CROSS, cross, operators);</div>
|
|
<div class="line"><a id="l04199" name="l04199"></a><span class="lineno"> 4199</span> }</div>
|
|
<div class="line"><a id="l04200" name="l04200"></a><span class="lineno"> 4200</span> <span class="keywordflow">if</span> (!pickup_delivery_pairs_.empty() ||</div>
|
|
<div class="line"><a id="l04201" name="l04201"></a><span class="lineno"> 4201</span> search_parameters.local_search_operators().use_relocate_neighbors() ==</div>
|
|
<div class="line"><a id="l04202" name="l04202"></a><span class="lineno"> 4202</span> <a class="code hl_enumvalue" href="namespaceoperations__research.html#ab13458305fa2eb87238ff66066eecd5da7149f32738efcef1bf4db3d635d804b0">BOOL_TRUE</a>) {</div>
|
|
<div class="line"><a id="l04203" name="l04203"></a><span class="lineno"> 4203</span> operators.push_back(local_search_operators_[RELOCATE_NEIGHBORS]);</div>
|
|
<div class="line"><a id="l04204" name="l04204"></a><span class="lineno"> 4204</span> }</div>
|
|
<div class="line"><a id="l04205" name="l04205"></a><span class="lineno"> 4205</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_local_search_metaheuristic.html#aa04540e46b556c56082408cda31fd514">LocalSearchMetaheuristic::Value</a> local_search_metaheuristic =</div>
|
|
<div class="line"><a id="l04206" name="l04206"></a><span class="lineno"> 4206</span> search_parameters.local_search_metaheuristic();</div>
|
|
<div class="line"><a id="l04207" name="l04207"></a><span class="lineno"> 4207</span> <span class="keywordflow">if</span> (local_search_metaheuristic != <a class="code hl_variable" href="classoperations__research_1_1_local_search_metaheuristic.html#a39bb4fe872d4536162c79c5b85d647f6">LocalSearchMetaheuristic::TABU_SEARCH</a> &&</div>
|
|
<div class="line"><a id="l04208" name="l04208"></a><span class="lineno"> 4208</span> local_search_metaheuristic !=</div>
|
|
<div class="line"><a id="l04209" name="l04209"></a><span class="lineno"> 4209</span> <a class="code hl_variable" href="classoperations__research_1_1_local_search_metaheuristic.html#a689551414de01c3e0b5483bafc4f8877">LocalSearchMetaheuristic::GENERIC_TABU_SEARCH</a> &&</div>
|
|
<div class="line"><a id="l04210" name="l04210"></a><span class="lineno"> 4210</span> local_search_metaheuristic !=</div>
|
|
<div class="line"><a id="l04211" name="l04211"></a><span class="lineno"> 4211</span> <a class="code hl_variable" href="classoperations__research_1_1_local_search_metaheuristic.html#a04f2564a49d86fca19f1f00379927756">LocalSearchMetaheuristic::SIMULATED_ANNEALING</a>) {</div>
|
|
<div class="line"><a id="l04212" name="l04212"></a><span class="lineno"> 4212</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(LIN_KERNIGHAN, lin_kernighan, operators);</div>
|
|
<div class="line"><a id="l04213" name="l04213"></a><span class="lineno"> 4213</span> }</div>
|
|
<div class="line"><a id="l04214" name="l04214"></a><span class="lineno"> 4214</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(TWO_OPT, two_opt, operators);</div>
|
|
<div class="line"><a id="l04215" name="l04215"></a><span class="lineno"> 4215</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(OR_OPT, or_opt, operators);</div>
|
|
<div class="line"><a id="l04216" name="l04216"></a><span class="lineno"> 4216</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(RELOCATE_EXPENSIVE_CHAIN, relocate_expensive_chain,</div>
|
|
<div class="line"><a id="l04217" name="l04217"></a><span class="lineno"> 4217</span> operators);</div>
|
|
<div class="line"><a id="l04218" name="l04218"></a><span class="lineno"> 4218</span> <span class="keywordflow">if</span> (!disjunctions_.empty()) {</div>
|
|
<div class="line"><a id="l04219" name="l04219"></a><span class="lineno"> 4219</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(MAKE_INACTIVE, make_inactive, operators);</div>
|
|
<div class="line"><a id="l04220" name="l04220"></a><span class="lineno"> 4220</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(MAKE_CHAIN_INACTIVE, make_chain_inactive,</div>
|
|
<div class="line"><a id="l04221" name="l04221"></a><span class="lineno"> 4221</span> operators);</div>
|
|
<div class="line"><a id="l04222" name="l04222"></a><span class="lineno"> 4222</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(MAKE_ACTIVE, make_active, operators);</div>
|
|
<div class="line"><a id="l04223" name="l04223"></a><span class="lineno"> 4223</span> </div>
|
|
<div class="line"><a id="l04224" name="l04224"></a><span class="lineno"> 4224</span> <span class="comment">// The relocate_and_make_active parameter activates all neighborhoods</span></div>
|
|
<div class="line"><a id="l04225" name="l04225"></a><span class="lineno"> 4225</span> <span class="comment">// relocating a node together with making another active.</span></div>
|
|
<div class="line"><a id="l04226" name="l04226"></a><span class="lineno"> 4226</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(RELOCATE_AND_MAKE_ACTIVE, relocate_and_make_active,</div>
|
|
<div class="line"><a id="l04227" name="l04227"></a><span class="lineno"> 4227</span> operators);</div>
|
|
<div class="line"><a id="l04228" name="l04228"></a><span class="lineno"> 4228</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(MAKE_ACTIVE_AND_RELOCATE, relocate_and_make_active,</div>
|
|
<div class="line"><a id="l04229" name="l04229"></a><span class="lineno"> 4229</span> operators);</div>
|
|
<div class="line"><a id="l04230" name="l04230"></a><span class="lineno"> 4230</span> </div>
|
|
<div class="line"><a id="l04231" name="l04231"></a><span class="lineno"> 4231</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(SWAP_ACTIVE, swap_active, operators);</div>
|
|
<div class="line"><a id="l04232" name="l04232"></a><span class="lineno"> 4232</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(EXTENDED_SWAP_ACTIVE, extended_swap_active,</div>
|
|
<div class="line"><a id="l04233" name="l04233"></a><span class="lineno"> 4233</span> operators);</div>
|
|
<div class="line"><a id="l04234" name="l04234"></a><span class="lineno"> 4234</span> }</div>
|
|
<div class="line"><a id="l04235" name="l04235"></a><span class="lineno"> 4235</span> operator_groups.push_back(ConcatenateOperators(search_parameters, operators));</div>
|
|
<div class="line"><a id="l04236" name="l04236"></a><span class="lineno"> 4236</span> </div>
|
|
<div class="line"><a id="l04237" name="l04237"></a><span class="lineno"> 4237</span> <span class="comment">// Second local search loop: LNS-like operators.</span></div>
|
|
<div class="line"><a id="l04238" name="l04238"></a><span class="lineno"> 4238</span> operators.clear();</div>
|
|
<div class="line"><a id="l04239" name="l04239"></a><span class="lineno"> 4239</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>() > 1) {</div>
|
|
<div class="line"><a id="l04240" name="l04240"></a><span class="lineno"> 4240</span> <span class="comment">// NOTE: The following heuristic path LNS with a single vehicle are</span></div>
|
|
<div class="line"><a id="l04241" name="l04241"></a><span class="lineno"> 4241</span> <span class="comment">// equivalent to using the heuristic as first solution strategy, so we only</span></div>
|
|
<div class="line"><a id="l04242" name="l04242"></a><span class="lineno"> 4242</span> <span class="comment">// add these moves if we have at least 2 vehicles in the model.</span></div>
|
|
<div class="line"><a id="l04243" name="l04243"></a><span class="lineno"> 4243</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(GLOBAL_CHEAPEST_INSERTION_PATH_LNS,</div>
|
|
<div class="line"><a id="l04244" name="l04244"></a><span class="lineno"> 4244</span> global_cheapest_insertion_path_lns, operators);</div>
|
|
<div class="line"><a id="l04245" name="l04245"></a><span class="lineno"> 4245</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(LOCAL_CHEAPEST_INSERTION_PATH_LNS,</div>
|
|
<div class="line"><a id="l04246" name="l04246"></a><span class="lineno"> 4246</span> local_cheapest_insertion_path_lns, operators);</div>
|
|
<div class="line"><a id="l04247" name="l04247"></a><span class="lineno"> 4247</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(</div>
|
|
<div class="line"><a id="l04248" name="l04248"></a><span class="lineno"> 4248</span> RELOCATE_PATH_GLOBAL_CHEAPEST_INSERTION_INSERT_UNPERFORMED,</div>
|
|
<div class="line"><a id="l04249" name="l04249"></a><span class="lineno"> 4249</span> relocate_path_global_cheapest_insertion_insert_unperformed, operators);</div>
|
|
<div class="line"><a id="l04250" name="l04250"></a><span class="lineno"> 4250</span> }</div>
|
|
<div class="line"><a id="l04251" name="l04251"></a><span class="lineno"> 4251</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(GLOBAL_CHEAPEST_INSERTION_EXPENSIVE_CHAIN_LNS,</div>
|
|
<div class="line"><a id="l04252" name="l04252"></a><span class="lineno"> 4252</span> global_cheapest_insertion_expensive_chain_lns,</div>
|
|
<div class="line"><a id="l04253" name="l04253"></a><span class="lineno"> 4253</span> operators);</div>
|
|
<div class="line"><a id="l04254" name="l04254"></a><span class="lineno"> 4254</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(LOCAL_CHEAPEST_INSERTION_EXPENSIVE_CHAIN_LNS,</div>
|
|
<div class="line"><a id="l04255" name="l04255"></a><span class="lineno"> 4255</span> local_cheapest_insertion_expensive_chain_lns,</div>
|
|
<div class="line"><a id="l04256" name="l04256"></a><span class="lineno"> 4256</span> operators);</div>
|
|
<div class="line"><a id="l04257" name="l04257"></a><span class="lineno"> 4257</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(GLOBAL_CHEAPEST_INSERTION_CLOSE_NODES_LNS,</div>
|
|
<div class="line"><a id="l04258" name="l04258"></a><span class="lineno"> 4258</span> global_cheapest_insertion_close_nodes_lns,</div>
|
|
<div class="line"><a id="l04259" name="l04259"></a><span class="lineno"> 4259</span> operators);</div>
|
|
<div class="line"><a id="l04260" name="l04260"></a><span class="lineno"> 4260</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(LOCAL_CHEAPEST_INSERTION_CLOSE_NODES_LNS,</div>
|
|
<div class="line"><a id="l04261" name="l04261"></a><span class="lineno"> 4261</span> local_cheapest_insertion_close_nodes_lns, operators);</div>
|
|
<div class="line"><a id="l04262" name="l04262"></a><span class="lineno"> 4262</span> operator_groups.push_back(ConcatenateOperators(search_parameters, operators));</div>
|
|
<div class="line"><a id="l04263" name="l04263"></a><span class="lineno"> 4263</span> </div>
|
|
<div class="line"><a id="l04264" name="l04264"></a><span class="lineno"> 4264</span> <span class="comment">// Third local search loop: Expensive LNS operators.</span></div>
|
|
<div class="line"><a id="l04265" name="l04265"></a><span class="lineno"> 4265</span> operators.clear();</div>
|
|
<div class="line"><a id="l04266" name="l04266"></a><span class="lineno"> 4266</span> <span class="keywordflow">if</span> (local_search_metaheuristic != <a class="code hl_variable" href="classoperations__research_1_1_local_search_metaheuristic.html#a39bb4fe872d4536162c79c5b85d647f6">LocalSearchMetaheuristic::TABU_SEARCH</a> &&</div>
|
|
<div class="line"><a id="l04267" name="l04267"></a><span class="lineno"> 4267</span> local_search_metaheuristic !=</div>
|
|
<div class="line"><a id="l04268" name="l04268"></a><span class="lineno"> 4268</span> <a class="code hl_variable" href="classoperations__research_1_1_local_search_metaheuristic.html#a689551414de01c3e0b5483bafc4f8877">LocalSearchMetaheuristic::GENERIC_TABU_SEARCH</a> &&</div>
|
|
<div class="line"><a id="l04269" name="l04269"></a><span class="lineno"> 4269</span> local_search_metaheuristic !=</div>
|
|
<div class="line"><a id="l04270" name="l04270"></a><span class="lineno"> 4270</span> <a class="code hl_variable" href="classoperations__research_1_1_local_search_metaheuristic.html#a04f2564a49d86fca19f1f00379927756">LocalSearchMetaheuristic::SIMULATED_ANNEALING</a>) {</div>
|
|
<div class="line"><a id="l04271" name="l04271"></a><span class="lineno"> 4271</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(TSP_OPT, tsp_opt, operators);</div>
|
|
<div class="line"><a id="l04272" name="l04272"></a><span class="lineno"> 4272</span> }</div>
|
|
<div class="line"><a id="l04273" name="l04273"></a><span class="lineno"> 4273</span> <span class="keywordflow">if</span> (local_search_metaheuristic != <a class="code hl_variable" href="classoperations__research_1_1_local_search_metaheuristic.html#a39bb4fe872d4536162c79c5b85d647f6">LocalSearchMetaheuristic::TABU_SEARCH</a> &&</div>
|
|
<div class="line"><a id="l04274" name="l04274"></a><span class="lineno"> 4274</span> local_search_metaheuristic !=</div>
|
|
<div class="line"><a id="l04275" name="l04275"></a><span class="lineno"> 4275</span> <a class="code hl_variable" href="classoperations__research_1_1_local_search_metaheuristic.html#a689551414de01c3e0b5483bafc4f8877">LocalSearchMetaheuristic::GENERIC_TABU_SEARCH</a> &&</div>
|
|
<div class="line"><a id="l04276" name="l04276"></a><span class="lineno"> 4276</span> local_search_metaheuristic !=</div>
|
|
<div class="line"><a id="l04277" name="l04277"></a><span class="lineno"> 4277</span> <a class="code hl_variable" href="classoperations__research_1_1_local_search_metaheuristic.html#a04f2564a49d86fca19f1f00379927756">LocalSearchMetaheuristic::SIMULATED_ANNEALING</a>) {</div>
|
|
<div class="line"><a id="l04278" name="l04278"></a><span class="lineno"> 4278</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(TSP_LNS, tsp_lns, operators);</div>
|
|
<div class="line"><a id="l04279" name="l04279"></a><span class="lineno"> 4279</span> }</div>
|
|
<div class="line"><a id="l04280" name="l04280"></a><span class="lineno"> 4280</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(FULL_PATH_LNS, full_path_lns, operators);</div>
|
|
<div class="line"><a id="l04281" name="l04281"></a><span class="lineno"> 4281</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(PATH_LNS, path_lns, operators);</div>
|
|
<div class="line"><a id="l04282" name="l04282"></a><span class="lineno"> 4282</span> <span class="keywordflow">if</span> (!disjunctions_.empty()) {</div>
|
|
<div class="line"><a id="l04283" name="l04283"></a><span class="lineno"> 4283</span> <a class="code hl_define" href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a>(INACTIVE_LNS, inactive_lns, operators);</div>
|
|
<div class="line"><a id="l04284" name="l04284"></a><span class="lineno"> 4284</span> }</div>
|
|
<div class="line"><a id="l04285" name="l04285"></a><span class="lineno"> 4285</span> operator_groups.push_back(ConcatenateOperators(search_parameters, operators));</div>
|
|
<div class="line"><a id="l04286" name="l04286"></a><span class="lineno"> 4286</span> </div>
|
|
<div class="line"><a id="l04287" name="l04287"></a><span class="lineno"> 4287</span> <span class="keywordflow">return</span> solver_->ConcatenateOperators(operator_groups);</div>
|
|
<div class="line"><a id="l04288" name="l04288"></a><span class="lineno"> 4288</span>}</div>
|
|
<div class="line"><a id="l04289" name="l04289"></a><span class="lineno"> 4289</span> </div>
|
|
<div class="line"><a id="l04290" name="l04290"></a><span class="lineno"> 4290</span><span class="preprocessor">#undef CP_ROUTING_PUSH_OPERATOR</span></div>
|
|
<div class="line"><a id="l04291" name="l04291"></a><span class="lineno"> 4291</span> </div>
|
|
<div class="line"><a id="l04292" name="l04292"></a><span class="lineno"><a class="line" href="namespaceoperations__research.html#adc5e06b587829ed7c5e02c1d95293378"> 4292</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="namespaceoperations__research.html#adc5e06b587829ed7c5e02c1d95293378">HasUnaryDimension</a>(<span class="keyword">const</span> std::vector<RoutingDimension*>& <a class="code hl_variable" href="arc__flow__builder_8cc.html#a85d16954ed793ec11f3250a16cab2a36">dimensions</a>) {</div>
|
|
<div class="line"><a id="l04293" name="l04293"></a><span class="lineno"> 4293</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* dimension : <a class="code hl_variable" href="arc__flow__builder_8cc.html#a85d16954ed793ec11f3250a16cab2a36">dimensions</a>) {</div>
|
|
<div class="line"><a id="l04294" name="l04294"></a><span class="lineno"> 4294</span> <span class="keywordflow">if</span> (dimension->GetUnaryTransitEvaluator(0) != <span class="keyword">nullptr</span>) <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l04295" name="l04295"></a><span class="lineno"> 4295</span> }</div>
|
|
<div class="line"><a id="l04296" name="l04296"></a><span class="lineno"> 4296</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l04297" name="l04297"></a><span class="lineno"> 4297</span>}</div>
|
|
<div class="line"><a id="l04298" name="l04298"></a><span class="lineno"> 4298</span> </div>
|
|
<div class="line"><a id="l04299" name="l04299"></a><span class="lineno"> 4299</span><span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a id="l04300" name="l04300"></a><span class="lineno"> 4300</span> </div>
|
|
<div class="line"><a id="l04301" name="l04301"></a><span class="lineno"> 4301</span><span class="keywordtype">void</span> ConvertVectorInt64ToVectorInt(<span class="keyword">const</span> std::vector<int64_t>& <a class="code hl_function" href="parser_8yy_8cc.html#a5a634cf4429798b1c921a81de8250051">input</a>,</div>
|
|
<div class="line"><a id="l04302" name="l04302"></a><span class="lineno"> 4302</span> std::vector<int>* output) {</div>
|
|
<div class="line"><a id="l04303" name="l04303"></a><span class="lineno"> 4303</span> <span class="keyword">const</span> <span class="keywordtype">int</span> n = <a class="code hl_function" href="parser_8yy_8cc.html#a5a634cf4429798b1c921a81de8250051">input</a>.size();</div>
|
|
<div class="line"><a id="l04304" name="l04304"></a><span class="lineno"> 4304</span> output->resize(n);</div>
|
|
<div class="line"><a id="l04305" name="l04305"></a><span class="lineno"> 4305</span> <span class="keywordtype">int</span>* data = output->data();</div>
|
|
<div class="line"><a id="l04306" name="l04306"></a><span class="lineno"> 4306</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < n; ++i) {</div>
|
|
<div class="line"><a id="l04307" name="l04307"></a><span class="lineno"> 4307</span> <span class="keyword">const</span> <span class="keywordtype">int</span> element = <span class="keyword">static_cast<</span><span class="keywordtype">int</span><span class="keyword">></span>(<a class="code hl_function" href="parser_8yy_8cc.html#a5a634cf4429798b1c921a81de8250051">input</a>[i]);</div>
|
|
<div class="line"><a id="l04308" name="l04308"></a><span class="lineno"> 4308</span> <a class="code hl_define" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(<a class="code hl_function" href="parser_8yy_8cc.html#a5a634cf4429798b1c921a81de8250051">input</a>[i], <span class="keyword">static_cast<</span>int64_t<span class="keyword">></span>(element));</div>
|
|
<div class="line"><a id="l04309" name="l04309"></a><span class="lineno"> 4309</span> data[i] = element;</div>
|
|
<div class="line"><a id="l04310" name="l04310"></a><span class="lineno"> 4310</span> }</div>
|
|
<div class="line"><a id="l04311" name="l04311"></a><span class="lineno"> 4311</span>}</div>
|
|
<div class="line"><a id="l04312" name="l04312"></a><span class="lineno"> 4312</span> </div>
|
|
<div class="line"><a id="l04313" name="l04313"></a><span class="lineno"> 4313</span>} <span class="comment">// namespace</span></div>
|
|
<div class="line"><a id="l04314" name="l04314"></a><span class="lineno"> 4314</span> </div>
|
|
<div class="line"><a id="l04315" name="l04315"></a><span class="lineno"> 4315</span>std::vector<LocalSearchFilterManager::FilterEvent></div>
|
|
<div class="line"><a id="l04316" name="l04316"></a><span class="lineno"> 4316</span>RoutingModel::GetOrCreateLocalSearchFilters(</div>
|
|
<div class="line"><a id="l04317" name="l04317"></a><span class="lineno"> 4317</span> <span class="keyword">const</span> RoutingSearchParameters& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>, <span class="keywordtype">bool</span> filter_cost) {</div>
|
|
<div class="line"><a id="l04318" name="l04318"></a><span class="lineno"> 4318</span> <span class="keyword">const</span> <span class="keyword">auto</span> kAccept = LocalSearchFilterManager::FilterEventType::kAccept;</div>
|
|
<div class="line"><a id="l04319" name="l04319"></a><span class="lineno"> 4319</span> <span class="keyword">const</span> <span class="keyword">auto</span> kRelax = LocalSearchFilterManager::FilterEventType::kRelax;</div>
|
|
<div class="line"><a id="l04320" name="l04320"></a><span class="lineno"> 4320</span> <span class="comment">// As of 2013/01, three filters evaluate sub-parts of the objective</span></div>
|
|
<div class="line"><a id="l04321" name="l04321"></a><span class="lineno"> 4321</span> <span class="comment">// function:</span></div>
|
|
<div class="line"><a id="l04322" name="l04322"></a><span class="lineno"> 4322</span> <span class="comment">// - NodeDisjunctionFilter: takes disjunction penalty costs into account,</span></div>
|
|
<div class="line"><a id="l04323" name="l04323"></a><span class="lineno"> 4323</span> <span class="comment">// - PathCumulFilter: takes dimension span costs into account,</span></div>
|
|
<div class="line"><a id="l04324" name="l04324"></a><span class="lineno"> 4324</span> <span class="comment">// - ObjectiveFilter:</span></div>
|
|
<div class="line"><a id="l04325" name="l04325"></a><span class="lineno"> 4325</span> <span class="comment">// - VehicleAmortizedCostFilter, which considers the part of the cost</span></div>
|
|
<div class="line"><a id="l04326" name="l04326"></a><span class="lineno"> 4326</span> <span class="comment">// related to amortized linear and quadratic vehicle cost factors.</span></div>
|
|
<div class="line"><a id="l04327" name="l04327"></a><span class="lineno"> 4327</span> <span class="comment">// - LocalSearchObjectiveFilter, which takes dimension "arc" costs into</span></div>
|
|
<div class="line"><a id="l04328" name="l04328"></a><span class="lineno"> 4328</span> <span class="comment">// account.</span></div>
|
|
<div class="line"><a id="l04329" name="l04329"></a><span class="lineno"> 4329</span> std::vector<LocalSearchFilterManager::FilterEvent> filters;</div>
|
|
<div class="line"><a id="l04330" name="l04330"></a><span class="lineno"> 4330</span> <span class="comment">// VehicleAmortizedCostFilter can have a negative value, so it must be first.</span></div>
|
|
<div class="line"><a id="l04331" name="l04331"></a><span class="lineno"> 4331</span> <span class="keywordflow">if</span> (filter_cost && vehicle_amortized_cost_factors_set_) {</div>
|
|
<div class="line"><a id="l04332" name="l04332"></a><span class="lineno"> 4332</span> filters.push_back({<a class="code hl_function" href="namespaceoperations__research.html#a4bbb86ef97d259aabe86e0abde4759e3">MakeVehicleAmortizedCostFilter</a>(*<span class="keyword">this</span>), kAccept});</div>
|
|
<div class="line"><a id="l04333" name="l04333"></a><span class="lineno"> 4333</span> }</div>
|
|
<div class="line"><a id="l04334" name="l04334"></a><span class="lineno"> 4334</span> </div>
|
|
<div class="line"><a id="l04335" name="l04335"></a><span class="lineno"> 4335</span> <span class="comment">// The SumObjectiveFilter has the best reject/second ratio in practice,</span></div>
|
|
<div class="line"><a id="l04336" name="l04336"></a><span class="lineno"> 4336</span> <span class="comment">// so it is the earliest.</span></div>
|
|
<div class="line"><a id="l04337" name="l04337"></a><span class="lineno"> 4337</span> <span class="keywordflow">if</span> (filter_cost) {</div>
|
|
<div class="line"><a id="l04338" name="l04338"></a><span class="lineno"> 4338</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853">CostsAreHomogeneousAcrossVehicles</a>()) {</div>
|
|
<div class="line"><a id="l04339" name="l04339"></a><span class="lineno"> 4339</span> LocalSearchFilter* sum = solver_->MakeSumObjectiveFilter(</div>
|
|
<div class="line"><a id="l04340" name="l04340"></a><span class="lineno"> 4340</span> nexts_,</div>
|
|
<div class="line"><a id="l04341" name="l04341"></a><span class="lineno"> 4341</span> [<span class="keyword">this</span>](int64_t i, int64_t j) { <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a51b526b532fc95cfed13d54ed2d6db95">GetHomogeneousCost</a>(i, j); },</div>
|
|
<div class="line"><a id="l04342" name="l04342"></a><span class="lineno"> 4342</span> <a class="code hl_enumvalue" href="classoperations__research_1_1_solver.html#afd2d924f019d44bc99930a1e931a735fa662ed4b51721a45f07d645d4ca099a61">Solver::LE</a>);</div>
|
|
<div class="line"><a id="l04343" name="l04343"></a><span class="lineno"> 4343</span> filters.push_back({sum, kAccept});</div>
|
|
<div class="line"><a id="l04344" name="l04344"></a><span class="lineno"> 4344</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l04345" name="l04345"></a><span class="lineno"> 4345</span> LocalSearchFilter* sum = solver_->MakeSumObjectiveFilter(</div>
|
|
<div class="line"><a id="l04346" name="l04346"></a><span class="lineno"> 4346</span> nexts_, vehicle_vars_,</div>
|
|
<div class="line"><a id="l04347" name="l04347"></a><span class="lineno"> 4347</span> [<span class="keyword">this</span>](int64_t i, int64_t j, int64_t k) {</div>
|
|
<div class="line"><a id="l04348" name="l04348"></a><span class="lineno"> 4348</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8174e01c9a66c00a87cdbe86ccd3655c">GetArcCostForVehicle</a>(i, j, k);</div>
|
|
<div class="line"><a id="l04349" name="l04349"></a><span class="lineno"> 4349</span> },</div>
|
|
<div class="line"><a id="l04350" name="l04350"></a><span class="lineno"> 4350</span> <a class="code hl_enumvalue" href="classoperations__research_1_1_solver.html#afd2d924f019d44bc99930a1e931a735fa662ed4b51721a45f07d645d4ca099a61">Solver::LE</a>);</div>
|
|
<div class="line"><a id="l04351" name="l04351"></a><span class="lineno"> 4351</span> filters.push_back({sum, kAccept});</div>
|
|
<div class="line"><a id="l04352" name="l04352"></a><span class="lineno"> 4352</span> }</div>
|
|
<div class="line"><a id="l04353" name="l04353"></a><span class="lineno"> 4353</span> }</div>
|
|
<div class="line"><a id="l04354" name="l04354"></a><span class="lineno"> 4354</span> </div>
|
|
<div class="line"><a id="l04355" name="l04355"></a><span class="lineno"> 4355</span> filters.push_back({solver_->MakeVariableDomainFilter(), kAccept});</div>
|
|
<div class="line"><a id="l04356" name="l04356"></a><span class="lineno"> 4356</span> </div>
|
|
<div class="line"><a id="l04357" name="l04357"></a><span class="lineno"> 4357</span> <span class="keywordflow">if</span> (vehicles_ > max_active_vehicles_) {</div>
|
|
<div class="line"><a id="l04358" name="l04358"></a><span class="lineno"> 4358</span> filters.push_back({<a class="code hl_function" href="namespaceoperations__research.html#aa2ef113e19924b88159b114a929b3358">MakeMaxActiveVehiclesFilter</a>(*<span class="keyword">this</span>), kAccept});</div>
|
|
<div class="line"><a id="l04359" name="l04359"></a><span class="lineno"> 4359</span> }</div>
|
|
<div class="line"><a id="l04360" name="l04360"></a><span class="lineno"> 4360</span> </div>
|
|
<div class="line"><a id="l04361" name="l04361"></a><span class="lineno"> 4361</span> <span class="keywordflow">if</span> (!disjunctions_.empty()) {</div>
|
|
<div class="line"><a id="l04362" name="l04362"></a><span class="lineno"> 4362</span> filters.push_back({<a class="code hl_function" href="namespaceoperations__research.html#aeb15e4444582a925522843bb414de9c3">MakeNodeDisjunctionFilter</a>(*<span class="keyword">this</span>), kAccept});</div>
|
|
<div class="line"><a id="l04363" name="l04363"></a><span class="lineno"> 4363</span> }</div>
|
|
<div class="line"><a id="l04364" name="l04364"></a><span class="lineno"> 4364</span> </div>
|
|
<div class="line"><a id="l04365" name="l04365"></a><span class="lineno"> 4365</span> <span class="keywordflow">if</span> (!pickup_delivery_pairs_.empty()) {</div>
|
|
<div class="line"><a id="l04366" name="l04366"></a><span class="lineno"> 4366</span> filters.push_back(</div>
|
|
<div class="line"><a id="l04367" name="l04367"></a><span class="lineno"> 4367</span> {<a class="code hl_function" href="namespaceoperations__research.html#ad03cbd2a51a0688c1fd08d3a7c1754c9">MakePickupDeliveryFilter</a>(*<span class="keyword">this</span>, pickup_delivery_pairs_,</div>
|
|
<div class="line"><a id="l04368" name="l04368"></a><span class="lineno"> 4368</span> vehicle_pickup_delivery_policy_),</div>
|
|
<div class="line"><a id="l04369" name="l04369"></a><span class="lineno"> 4369</span> kAccept});</div>
|
|
<div class="line"><a id="l04370" name="l04370"></a><span class="lineno"> 4370</span> }</div>
|
|
<div class="line"><a id="l04371" name="l04371"></a><span class="lineno"> 4371</span> </div>
|
|
<div class="line"><a id="l04372" name="l04372"></a><span class="lineno"> 4372</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab313d84a56c5e9b1b8f28da70b8d4045">HasTypeRegulations</a>()) {</div>
|
|
<div class="line"><a id="l04373" name="l04373"></a><span class="lineno"> 4373</span> filters.push_back({<a class="code hl_function" href="namespaceoperations__research.html#ada7da4059546f5ef90de0b2f8bada19a">MakeTypeRegulationsFilter</a>(*<span class="keyword">this</span>), kAccept});</div>
|
|
<div class="line"><a id="l04374" name="l04374"></a><span class="lineno"> 4374</span> }</div>
|
|
<div class="line"><a id="l04375" name="l04375"></a><span class="lineno"> 4375</span> </div>
|
|
<div class="line"><a id="l04376" name="l04376"></a><span class="lineno"> 4376</span> filters.push_back({<a class="code hl_function" href="namespaceoperations__research.html#ab962de016b1a14868457ac876eadf008">MakeVehicleVarFilter</a>(*<span class="keyword">this</span>), kAccept});</div>
|
|
<div class="line"><a id="l04377" name="l04377"></a><span class="lineno"> 4377</span> </div>
|
|
<div class="line"><a id="l04378" name="l04378"></a><span class="lineno"> 4378</span> <span class="keyword">const</span> PathState* path_state_reference = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l04379" name="l04379"></a><span class="lineno"> 4379</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="namespaceoperations__research.html#adc5e06b587829ed7c5e02c1d95293378">HasUnaryDimension</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a88c2b51c968a004484673a6869c1f39d">GetDimensions</a>())) {</div>
|
|
<div class="line"><a id="l04380" name="l04380"></a><span class="lineno"> 4380</span> std::vector<int> path_starts;</div>
|
|
<div class="line"><a id="l04381" name="l04381"></a><span class="lineno"> 4381</span> std::vector<int> path_ends;</div>
|
|
<div class="line"><a id="l04382" name="l04382"></a><span class="lineno"> 4382</span> ConvertVectorInt64ToVectorInt(starts_, &path_starts);</div>
|
|
<div class="line"><a id="l04383" name="l04383"></a><span class="lineno"> 4383</span> ConvertVectorInt64ToVectorInt(ends_, &path_ends);</div>
|
|
<div class="line"><a id="l04384" name="l04384"></a><span class="lineno"> 4384</span> </div>
|
|
<div class="line"><a id="l04385" name="l04385"></a><span class="lineno"> 4385</span> <span class="keyword">auto</span> path_state = absl::make_unique<PathState>(</div>
|
|
<div class="line"><a id="l04386" name="l04386"></a><span class="lineno"> 4386</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#a24926108b770033792d015cb86aeffb3">Size</a>() + <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(), std::move(path_starts), std::move(path_ends));</div>
|
|
<div class="line"><a id="l04387" name="l04387"></a><span class="lineno"> 4387</span> path_state_reference = path_state.get();</div>
|
|
<div class="line"><a id="l04388" name="l04388"></a><span class="lineno"> 4388</span> filters.push_back(</div>
|
|
<div class="line"><a id="l04389" name="l04389"></a><span class="lineno"> 4389</span> {<a class="code hl_function" href="namespaceoperations__research.html#ae1de0a1f7cf121d53ee230f794ce51f5">MakePathStateFilter</a>(solver_.get(), std::move(path_state), <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a911482cb7495f22638a02066adf13c8b">Nexts</a>()),</div>
|
|
<div class="line"><a id="l04390" name="l04390"></a><span class="lineno"> 4390</span> kRelax});</div>
|
|
<div class="line"><a id="l04391" name="l04391"></a><span class="lineno"> 4391</span> <a class="code hl_function" href="namespaceoperations__research.html#ae2219dbffeee11e9bca17cc1e8217747">AppendLightWeightDimensionFilters</a>(path_state_reference, <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a88c2b51c968a004484673a6869c1f39d">GetDimensions</a>(),</div>
|
|
<div class="line"><a id="l04392" name="l04392"></a><span class="lineno"> 4392</span> &filters);</div>
|
|
<div class="line"><a id="l04393" name="l04393"></a><span class="lineno"> 4393</span> }</div>
|
|
<div class="line"><a id="l04394" name="l04394"></a><span class="lineno"> 4394</span> </div>
|
|
<div class="line"><a id="l04395" name="l04395"></a><span class="lineno"> 4395</span> <a class="code hl_function" href="namespaceoperations__research.html#a0e3e4445c55d0c59ef4edbaf7acbd3a8">AppendDimensionCumulFilters</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a88c2b51c968a004484673a6869c1f39d">GetDimensions</a>(), <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>, filter_cost,</div>
|
|
<div class="line"><a id="l04396" name="l04396"></a><span class="lineno"> 4396</span> &filters);</div>
|
|
<div class="line"><a id="l04397" name="l04397"></a><span class="lineno"> 4397</span> </div>
|
|
<div class="line"><a id="l04398" name="l04398"></a><span class="lineno"> 4398</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_friend" href="classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* dimension : dimensions_) {</div>
|
|
<div class="line"><a id="l04399" name="l04399"></a><span class="lineno"> 4399</span> <span class="keywordflow">if</span> (!dimension->HasBreakConstraints()) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l04400" name="l04400"></a><span class="lineno"> 4400</span> filters.push_back({<a class="code hl_function" href="namespaceoperations__research.html#a447588dfd4d5f539ec22f403e21ca668">MakeVehicleBreaksFilter</a>(*<span class="keyword">this</span>, *dimension), kAccept});</div>
|
|
<div class="line"><a id="l04401" name="l04401"></a><span class="lineno"> 4401</span> }</div>
|
|
<div class="line"><a id="l04402" name="l04402"></a><span class="lineno"> 4402</span> filters.insert(filters.end(), extra_filters_.begin(), extra_filters_.end());</div>
|
|
<div class="line"><a id="l04403" name="l04403"></a><span class="lineno"> 4403</span> <span class="keywordflow">return</span> filters;</div>
|
|
<div class="line"><a id="l04404" name="l04404"></a><span class="lineno"> 4404</span>}</div>
|
|
<div class="line"><a id="l04405" name="l04405"></a><span class="lineno"> 4405</span> </div>
|
|
<div class="line"><a id="l04406" name="l04406"></a><span class="lineno"> 4406</span>LocalSearchFilterManager* RoutingModel::GetOrCreateLocalSearchFilterManager(</div>
|
|
<div class="line"><a id="l04407" name="l04407"></a><span class="lineno"> 4407</span> <span class="keyword">const</span> RoutingSearchParameters& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>) {</div>
|
|
<div class="line"><a id="l04408" name="l04408"></a><span class="lineno"> 4408</span> <span class="keywordflow">if</span> (!local_search_filter_manager_) {</div>
|
|
<div class="line"><a id="l04409" name="l04409"></a><span class="lineno"> 4409</span> local_search_filter_manager_ =</div>
|
|
<div class="line"><a id="l04410" name="l04410"></a><span class="lineno"> 4410</span> solver_->RevAlloc(<span class="keyword">new</span> LocalSearchFilterManager(</div>
|
|
<div class="line"><a id="l04411" name="l04411"></a><span class="lineno"> 4411</span> GetOrCreateLocalSearchFilters(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>)));</div>
|
|
<div class="line"><a id="l04412" name="l04412"></a><span class="lineno"> 4412</span> }</div>
|
|
<div class="line"><a id="l04413" name="l04413"></a><span class="lineno"> 4413</span> <span class="keywordflow">return</span> local_search_filter_manager_;</div>
|
|
<div class="line"><a id="l04414" name="l04414"></a><span class="lineno"> 4414</span>}</div>
|
|
<div class="line"><a id="l04415" name="l04415"></a><span class="lineno"> 4415</span> </div>
|
|
<div class="line"><a id="l04416" name="l04416"></a><span class="lineno"> 4416</span>std::vector<LocalSearchFilterManager::FilterEvent></div>
|
|
<div class="line"><a id="l04417" name="l04417"></a><span class="lineno"> 4417</span>RoutingModel::GetOrCreateFeasibilityFilters(</div>
|
|
<div class="line"><a id="l04418" name="l04418"></a><span class="lineno"> 4418</span> <span class="keyword">const</span> RoutingSearchParameters& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>) {</div>
|
|
<div class="line"><a id="l04419" name="l04419"></a><span class="lineno"> 4419</span> <span class="keywordflow">return</span> GetOrCreateLocalSearchFilters(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>, <span class="keyword">false</span>);</div>
|
|
<div class="line"><a id="l04420" name="l04420"></a><span class="lineno"> 4420</span>}</div>
|
|
<div class="line"><a id="l04421" name="l04421"></a><span class="lineno"> 4421</span> </div>
|
|
<div class="line"><a id="l04422" name="l04422"></a><span class="lineno"> 4422</span>LocalSearchFilterManager* RoutingModel::GetOrCreateFeasibilityFilterManager(</div>
|
|
<div class="line"><a id="l04423" name="l04423"></a><span class="lineno"> 4423</span> <span class="keyword">const</span> RoutingSearchParameters& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>) {</div>
|
|
<div class="line"><a id="l04424" name="l04424"></a><span class="lineno"> 4424</span> <span class="keywordflow">if</span> (!feasibility_filter_manager_) {</div>
|
|
<div class="line"><a id="l04425" name="l04425"></a><span class="lineno"> 4425</span> feasibility_filter_manager_ =</div>
|
|
<div class="line"><a id="l04426" name="l04426"></a><span class="lineno"> 4426</span> solver_->RevAlloc(<span class="keyword">new</span> LocalSearchFilterManager(</div>
|
|
<div class="line"><a id="l04427" name="l04427"></a><span class="lineno"> 4427</span> GetOrCreateFeasibilityFilters(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>)));</div>
|
|
<div class="line"><a id="l04428" name="l04428"></a><span class="lineno"> 4428</span> }</div>
|
|
<div class="line"><a id="l04429" name="l04429"></a><span class="lineno"> 4429</span> <span class="keywordflow">return</span> feasibility_filter_manager_;</div>
|
|
<div class="line"><a id="l04430" name="l04430"></a><span class="lineno"> 4430</span>}</div>
|
|
<div class="line"><a id="l04431" name="l04431"></a><span class="lineno"> 4431</span> </div>
|
|
<div class="line"><a id="l04432" name="l04432"></a><span class="lineno"> 4432</span>LocalSearchFilterManager*</div>
|
|
<div class="line"><a id="l04433" name="l04433"></a><span class="lineno"> 4433</span>RoutingModel::GetOrCreateStrongFeasibilityFilterManager(</div>
|
|
<div class="line"><a id="l04434" name="l04434"></a><span class="lineno"> 4434</span> <span class="keyword">const</span> RoutingSearchParameters& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>) {</div>
|
|
<div class="line"><a id="l04435" name="l04435"></a><span class="lineno"> 4435</span> <span class="keywordflow">if</span> (!strong_feasibility_filter_manager_) {</div>
|
|
<div class="line"><a id="l04436" name="l04436"></a><span class="lineno"> 4436</span> std::vector<LocalSearchFilterManager::FilterEvent> filters =</div>
|
|
<div class="line"><a id="l04437" name="l04437"></a><span class="lineno"> 4437</span> GetOrCreateFeasibilityFilters(<a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>);</div>
|
|
<div class="line"><a id="l04438" name="l04438"></a><span class="lineno"> 4438</span> filters.push_back({<a class="code hl_function" href="namespaceoperations__research.html#a6a24a85a196ecfb2b799a0409ef757c6">MakeCPFeasibilityFilter</a>(<span class="keyword">this</span>),</div>
|
|
<div class="line"><a id="l04439" name="l04439"></a><span class="lineno"> 4439</span> LocalSearchFilterManager::FilterEventType::kAccept});</div>
|
|
<div class="line"><a id="l04440" name="l04440"></a><span class="lineno"> 4440</span> strong_feasibility_filter_manager_ =</div>
|
|
<div class="line"><a id="l04441" name="l04441"></a><span class="lineno"> 4441</span> solver_->RevAlloc(<span class="keyword">new</span> LocalSearchFilterManager(std::move(filters)));</div>
|
|
<div class="line"><a id="l04442" name="l04442"></a><span class="lineno"> 4442</span> }</div>
|
|
<div class="line"><a id="l04443" name="l04443"></a><span class="lineno"> 4443</span> <span class="keywordflow">return</span> strong_feasibility_filter_manager_;</div>
|
|
<div class="line"><a id="l04444" name="l04444"></a><span class="lineno"> 4444</span>}</div>
|
|
<div class="line"><a id="l04445" name="l04445"></a><span class="lineno"> 4445</span> </div>
|
|
<div class="line"><a id="l04446" name="l04446"></a><span class="lineno"> 4446</span><span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a id="l04447" name="l04447"></a><span class="lineno"> 4447</span><span class="keywordtype">bool</span> AllTransitsPositive(<span class="keyword">const</span> <a class="code hl_friend" href="classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>& dimension) {</div>
|
|
<div class="line"><a id="l04448" name="l04448"></a><span class="lineno"> 4448</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < dimension.model()-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); vehicle++) {</div>
|
|
<div class="line"><a id="l04449" name="l04449"></a><span class="lineno"> 4449</span> <span class="keywordflow">if</span> (!dimension.AreVehicleTransitsPositive(vehicle)) {</div>
|
|
<div class="line"><a id="l04450" name="l04450"></a><span class="lineno"> 4450</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l04451" name="l04451"></a><span class="lineno"> 4451</span> }</div>
|
|
<div class="line"><a id="l04452" name="l04452"></a><span class="lineno"> 4452</span> }</div>
|
|
<div class="line"><a id="l04453" name="l04453"></a><span class="lineno"> 4453</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l04454" name="l04454"></a><span class="lineno"> 4454</span>}</div>
|
|
<div class="line"><a id="l04455" name="l04455"></a><span class="lineno"> 4455</span>} <span class="comment">// namespace</span></div>
|
|
<div class="line"><a id="l04456" name="l04456"></a><span class="lineno"> 4456</span> </div>
|
|
<div class="line"><a id="l04457" name="l04457"></a><span class="lineno"> 4457</span><span class="keywordtype">void</span> RoutingModel::StoreDimensionCumulOptimizers(</div>
|
|
<div class="line"><a id="l04458" name="l04458"></a><span class="lineno"> 4458</span> <span class="keyword">const</span> RoutingSearchParameters& <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>) {</div>
|
|
<div class="line"><a id="l04459" name="l04459"></a><span class="lineno"> 4459</span> Assignment* packed_dimensions_collector_assignment =</div>
|
|
<div class="line"><a id="l04460" name="l04460"></a><span class="lineno"> 4460</span> solver_->MakeAssignment();</div>
|
|
<div class="line"><a id="l04461" name="l04461"></a><span class="lineno"> 4461</span> packed_dimensions_collector_assignment->AddObjective(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#abb61fc6939fecebe93387f63319d2b7f">CostVar</a>());</div>
|
|
<div class="line"><a id="l04462" name="l04462"></a><span class="lineno"> 4462</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_dimensions = dimensions_.size();</div>
|
|
<div class="line"><a id="l04463" name="l04463"></a><span class="lineno"> 4463</span> local_optimizer_index_.resize(num_dimensions, -1);</div>
|
|
<div class="line"><a id="l04464" name="l04464"></a><span class="lineno"> 4464</span> global_optimizer_index_.resize(num_dimensions, -1);</div>
|
|
<div class="line"><a id="l04465" name="l04465"></a><span class="lineno"> 4465</span> <span class="keywordflow">for</span> (<a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce">DimensionIndex</a> dim = <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce">DimensionIndex</a>(0); dim < num_dimensions; dim++) {</div>
|
|
<div class="line"><a id="l04466" name="l04466"></a><span class="lineno"> 4466</span> <a class="code hl_friend" href="classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* dimension = dimensions_[dim];</div>
|
|
<div class="line"><a id="l04467" name="l04467"></a><span class="lineno"> 4467</span> <span class="keywordflow">if</span> (dimension->global_span_cost_coefficient() > 0 ||</div>
|
|
<div class="line"><a id="l04468" name="l04468"></a><span class="lineno"> 4468</span> !dimension->GetNodePrecedences().empty()) {</div>
|
|
<div class="line"><a id="l04469" name="l04469"></a><span class="lineno"> 4469</span> <span class="comment">// Use global optimizer.</span></div>
|
|
<div class="line"><a id="l04470" name="l04470"></a><span class="lineno"> 4470</span> global_optimizer_index_[dim] = global_dimension_optimizers_.size();</div>
|
|
<div class="line"><a id="l04471" name="l04471"></a><span class="lineno"> 4471</span> global_dimension_optimizers_.push_back(</div>
|
|
<div class="line"><a id="l04472" name="l04472"></a><span class="lineno"> 4472</span> absl::make_unique<GlobalDimensionCumulOptimizer>(</div>
|
|
<div class="line"><a id="l04473" name="l04473"></a><span class="lineno"> 4473</span> dimension, <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.continuous_scheduling_solver()));</div>
|
|
<div class="line"><a id="l04474" name="l04474"></a><span class="lineno"> 4474</span> global_dimension_mp_optimizers_.push_back(</div>
|
|
<div class="line"><a id="l04475" name="l04475"></a><span class="lineno"> 4475</span> absl::make_unique<GlobalDimensionCumulOptimizer>(</div>
|
|
<div class="line"><a id="l04476" name="l04476"></a><span class="lineno"> 4476</span> dimension, <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.mixed_integer_scheduling_solver()));</div>
|
|
<div class="line"><a id="l04477" name="l04477"></a><span class="lineno"> 4477</span> packed_dimensions_collector_assignment->Add(dimension->cumuls());</div>
|
|
<div class="line"><a id="l04478" name="l04478"></a><span class="lineno"> 4478</span> <span class="keywordflow">if</span> (!AllTransitsPositive(*dimension)) {</div>
|
|
<div class="line"><a id="l04479" name="l04479"></a><span class="lineno"> 4479</span> dimension->SetOffsetForGlobalOptimizer(0);</div>
|
|
<div class="line"><a id="l04480" name="l04480"></a><span class="lineno"> 4480</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l04481" name="l04481"></a><span class="lineno"> 4481</span> }</div>
|
|
<div class="line"><a id="l04482" name="l04482"></a><span class="lineno"> 4482</span> int64_t offset =</div>
|
|
<div class="line"><a id="l04483" name="l04483"></a><span class="lineno"> 4483</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>() == 0 ? 0 : <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>();</div>
|
|
<div class="line"><a id="l04484" name="l04484"></a><span class="lineno"> 4484</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++vehicle) {</div>
|
|
<div class="line"><a id="l04485" name="l04485"></a><span class="lineno"> 4485</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(dimension->CumulVar(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(vehicle))->Min(), 0);</div>
|
|
<div class="line"><a id="l04486" name="l04486"></a><span class="lineno"> 4486</span> offset =</div>
|
|
<div class="line"><a id="l04487" name="l04487"></a><span class="lineno"> 4487</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::min</a>(offset, dimension->CumulVar(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(vehicle))->Min() - 1);</div>
|
|
<div class="line"><a id="l04488" name="l04488"></a><span class="lineno"> 4488</span> }</div>
|
|
<div class="line"><a id="l04489" name="l04489"></a><span class="lineno"> 4489</span> dimension->SetOffsetForGlobalOptimizer(<a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(<a class="code hl_function" href="namespaceoperations__research.html#a5a9881f8a07b166ef2cbde572cea27b6">Zero</a>(), offset));</div>
|
|
<div class="line"><a id="l04490" name="l04490"></a><span class="lineno"> 4490</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l04491" name="l04491"></a><span class="lineno"> 4491</span> <span class="keywordtype">bool</span> has_span_cost = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l04492" name="l04492"></a><span class="lineno"> 4492</span> <span class="keywordtype">bool</span> has_span_limit = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l04493" name="l04493"></a><span class="lineno"> 4493</span> std::vector<int64_t> vehicle_offsets(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>());</div>
|
|
<div class="line"><a id="l04494" name="l04494"></a><span class="lineno"> 4494</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++vehicle) {</div>
|
|
<div class="line"><a id="l04495" name="l04495"></a><span class="lineno"> 4495</span> <span class="keywordflow">if</span> (dimension->GetSpanCostCoefficientForVehicle(vehicle) > 0) {</div>
|
|
<div class="line"><a id="l04496" name="l04496"></a><span class="lineno"> 4496</span> has_span_cost = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l04497" name="l04497"></a><span class="lineno"> 4497</span> }</div>
|
|
<div class="line"><a id="l04498" name="l04498"></a><span class="lineno"> 4498</span> <span class="keywordflow">if</span> (dimension->GetSpanUpperBoundForVehicle(vehicle) <</div>
|
|
<div class="line"><a id="l04499" name="l04499"></a><span class="lineno"> 4499</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>()) {</div>
|
|
<div class="line"><a id="l04500" name="l04500"></a><span class="lineno"> 4500</span> has_span_limit = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l04501" name="l04501"></a><span class="lineno"> 4501</span> }</div>
|
|
<div class="line"><a id="l04502" name="l04502"></a><span class="lineno"> 4502</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(dimension->CumulVar(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(vehicle))->Min(), 0);</div>
|
|
<div class="line"><a id="l04503" name="l04503"></a><span class="lineno"> 4503</span> vehicle_offsets[vehicle] =</div>
|
|
<div class="line"><a id="l04504" name="l04504"></a><span class="lineno"> 4504</span> dimension->AreVehicleTransitsPositive(vehicle)</div>
|
|
<div class="line"><a id="l04505" name="l04505"></a><span class="lineno"> 4505</span> ? <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(<a class="code hl_function" href="namespaceoperations__research.html#a5a9881f8a07b166ef2cbde572cea27b6">Zero</a>(),</div>
|
|
<div class="line"><a id="l04506" name="l04506"></a><span class="lineno"> 4506</span> dimension->CumulVar(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(vehicle))->Min() - 1)</div>
|
|
<div class="line"><a id="l04507" name="l04507"></a><span class="lineno"> 4507</span> : 0;</div>
|
|
<div class="line"><a id="l04508" name="l04508"></a><span class="lineno"> 4508</span> }</div>
|
|
<div class="line"><a id="l04509" name="l04509"></a><span class="lineno"> 4509</span> <span class="keywordtype">bool</span> has_soft_lower_bound = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l04510" name="l04510"></a><span class="lineno"> 4510</span> <span class="keywordtype">bool</span> has_soft_upper_bound = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l04511" name="l04511"></a><span class="lineno"> 4511</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < dimension->cumuls().size(); ++i) {</div>
|
|
<div class="line"><a id="l04512" name="l04512"></a><span class="lineno"> 4512</span> <span class="keywordflow">if</span> (dimension->HasCumulVarSoftLowerBound(i)) {</div>
|
|
<div class="line"><a id="l04513" name="l04513"></a><span class="lineno"> 4513</span> has_soft_lower_bound = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l04514" name="l04514"></a><span class="lineno"> 4514</span> }</div>
|
|
<div class="line"><a id="l04515" name="l04515"></a><span class="lineno"> 4515</span> <span class="keywordflow">if</span> (dimension->HasCumulVarSoftUpperBound(i)) {</div>
|
|
<div class="line"><a id="l04516" name="l04516"></a><span class="lineno"> 4516</span> has_soft_upper_bound = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l04517" name="l04517"></a><span class="lineno"> 4517</span> }</div>
|
|
<div class="line"><a id="l04518" name="l04518"></a><span class="lineno"> 4518</span> }</div>
|
|
<div class="line"><a id="l04519" name="l04519"></a><span class="lineno"> 4519</span> <span class="keywordtype">int</span> num_linear_constraints = 0;</div>
|
|
<div class="line"><a id="l04520" name="l04520"></a><span class="lineno"> 4520</span> <span class="keywordflow">if</span> (has_span_cost) ++num_linear_constraints;</div>
|
|
<div class="line"><a id="l04521" name="l04521"></a><span class="lineno"> 4521</span> <span class="keywordflow">if</span> (has_span_limit) ++num_linear_constraints;</div>
|
|
<div class="line"><a id="l04522" name="l04522"></a><span class="lineno"> 4522</span> <span class="keywordflow">if</span> (dimension->HasSoftSpanUpperBounds()) ++num_linear_constraints;</div>
|
|
<div class="line"><a id="l04523" name="l04523"></a><span class="lineno"> 4523</span> <span class="keywordflow">if</span> (has_soft_lower_bound) ++num_linear_constraints;</div>
|
|
<div class="line"><a id="l04524" name="l04524"></a><span class="lineno"> 4524</span> <span class="keywordflow">if</span> (has_soft_upper_bound) ++num_linear_constraints;</div>
|
|
<div class="line"><a id="l04525" name="l04525"></a><span class="lineno"> 4525</span> <span class="keywordflow">if</span> (dimension->HasBreakConstraints()) ++num_linear_constraints;</div>
|
|
<div class="line"><a id="l04526" name="l04526"></a><span class="lineno"> 4526</span> <span class="keywordflow">if</span> (num_linear_constraints >= 2) {</div>
|
|
<div class="line"><a id="l04527" name="l04527"></a><span class="lineno"> 4527</span> dimension->SetVehicleOffsetsForLocalOptimizer(</div>
|
|
<div class="line"><a id="l04528" name="l04528"></a><span class="lineno"> 4528</span> std::move(vehicle_offsets));</div>
|
|
<div class="line"><a id="l04529" name="l04529"></a><span class="lineno"> 4529</span> local_optimizer_index_[dim] = local_dimension_optimizers_.size();</div>
|
|
<div class="line"><a id="l04530" name="l04530"></a><span class="lineno"> 4530</span> local_dimension_optimizers_.push_back(</div>
|
|
<div class="line"><a id="l04531" name="l04531"></a><span class="lineno"> 4531</span> absl::make_unique<LocalDimensionCumulOptimizer>(</div>
|
|
<div class="line"><a id="l04532" name="l04532"></a><span class="lineno"> 4532</span> dimension, <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.continuous_scheduling_solver()));</div>
|
|
<div class="line"><a id="l04533" name="l04533"></a><span class="lineno"> 4533</span> <span class="keywordtype">bool</span> has_intervals = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l04534" name="l04534"></a><span class="lineno"> 4534</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> SortedDisjointIntervalList& intervals :</div>
|
|
<div class="line"><a id="l04535" name="l04535"></a><span class="lineno"> 4535</span> dimension->forbidden_intervals()) {</div>
|
|
<div class="line"><a id="l04536" name="l04536"></a><span class="lineno"> 4536</span> <span class="comment">// TODO(user): Change the following test to check intervals within</span></div>
|
|
<div class="line"><a id="l04537" name="l04537"></a><span class="lineno"> 4537</span> <span class="comment">// the domain of the corresponding variables.</span></div>
|
|
<div class="line"><a id="l04538" name="l04538"></a><span class="lineno"> 4538</span> <span class="keywordflow">if</span> (intervals.NumIntervals() > 0) {</div>
|
|
<div class="line"><a id="l04539" name="l04539"></a><span class="lineno"> 4539</span> has_intervals = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l04540" name="l04540"></a><span class="lineno"> 4540</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l04541" name="l04541"></a><span class="lineno"> 4541</span> }</div>
|
|
<div class="line"><a id="l04542" name="l04542"></a><span class="lineno"> 4542</span> }</div>
|
|
<div class="line"><a id="l04543" name="l04543"></a><span class="lineno"> 4543</span> <span class="keywordflow">if</span> (dimension->HasBreakConstraints() || has_intervals) {</div>
|
|
<div class="line"><a id="l04544" name="l04544"></a><span class="lineno"> 4544</span> local_dimension_mp_optimizers_.push_back(</div>
|
|
<div class="line"><a id="l04545" name="l04545"></a><span class="lineno"> 4545</span> absl::make_unique<LocalDimensionCumulOptimizer>(</div>
|
|
<div class="line"><a id="l04546" name="l04546"></a><span class="lineno"> 4546</span> dimension, <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>.mixed_integer_scheduling_solver()));</div>
|
|
<div class="line"><a id="l04547" name="l04547"></a><span class="lineno"> 4547</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l04548" name="l04548"></a><span class="lineno"> 4548</span> local_dimension_mp_optimizers_.push_back(<span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l04549" name="l04549"></a><span class="lineno"> 4549</span> }</div>
|
|
<div class="line"><a id="l04550" name="l04550"></a><span class="lineno"> 4550</span> packed_dimensions_collector_assignment->Add(dimension->cumuls());</div>
|
|
<div class="line"><a id="l04551" name="l04551"></a><span class="lineno"> 4551</span> }</div>
|
|
<div class="line"><a id="l04552" name="l04552"></a><span class="lineno"> 4552</span> }</div>
|
|
<div class="line"><a id="l04553" name="l04553"></a><span class="lineno"> 4553</span> <a class="code hl_define" href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a>(local_dimension_mp_optimizers_.size(),</div>
|
|
<div class="line"><a id="l04554" name="l04554"></a><span class="lineno"> 4554</span> local_dimension_optimizers_.size());</div>
|
|
<div class="line"><a id="l04555" name="l04555"></a><span class="lineno"> 4555</span> }</div>
|
|
<div class="line"><a id="l04556" name="l04556"></a><span class="lineno"> 4556</span> </div>
|
|
<div class="line"><a id="l04557" name="l04557"></a><span class="lineno"> 4557</span> <span class="comment">// NOTE(b/129252839): We also add all other extra variables to the</span></div>
|
|
<div class="line"><a id="l04558" name="l04558"></a><span class="lineno"> 4558</span> <span class="comment">// packed_dimensions_collector_assignment to make sure the necessary</span></div>
|
|
<div class="line"><a id="l04559" name="l04559"></a><span class="lineno"> 4559</span> <span class="comment">// propagations on these variables after packing are correctly stored.</span></div>
|
|
<div class="line"><a id="l04560" name="l04560"></a><span class="lineno"> 4560</span> <span class="keywordflow">for</span> (IntVar* <span class="keyword">const</span> extra_var : extra_vars_) {</div>
|
|
<div class="line"><a id="l04561" name="l04561"></a><span class="lineno"> 4561</span> packed_dimensions_collector_assignment->Add(extra_var);</div>
|
|
<div class="line"><a id="l04562" name="l04562"></a><span class="lineno"> 4562</span> }</div>
|
|
<div class="line"><a id="l04563" name="l04563"></a><span class="lineno"> 4563</span> <span class="keywordflow">for</span> (IntervalVar* <span class="keyword">const</span> extra_interval : extra_intervals_) {</div>
|
|
<div class="line"><a id="l04564" name="l04564"></a><span class="lineno"> 4564</span> packed_dimensions_collector_assignment->Add(extra_interval);</div>
|
|
<div class="line"><a id="l04565" name="l04565"></a><span class="lineno"> 4565</span> }</div>
|
|
<div class="line"><a id="l04566" name="l04566"></a><span class="lineno"> 4566</span> </div>
|
|
<div class="line"><a id="l04567" name="l04567"></a><span class="lineno"> 4567</span> packed_dimensions_assignment_collector_ = solver_->MakeFirstSolutionCollector(</div>
|
|
<div class="line"><a id="l04568" name="l04568"></a><span class="lineno"> 4568</span> packed_dimensions_collector_assignment);</div>
|
|
<div class="line"><a id="l04569" name="l04569"></a><span class="lineno"> 4569</span>}</div>
|
|
<div class="line"><a id="l04570" name="l04570"></a><span class="lineno"> 4570</span> </div>
|
|
<div class="line"><a id="l04571" name="l04571"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a6e0fb2d4d5bbda1cad6bf795152cbe13"> 4571</a></span>std::vector<RoutingDimension*> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a6e0fb2d4d5bbda1cad6bf795152cbe13">RoutingModel::GetDimensionsWithSoftOrSpanCosts</a>()<span class="keyword"></span></div>
|
|
<div class="line"><a id="l04572" name="l04572"></a><span class="lineno"> 4572</span><span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l04573" name="l04573"></a><span class="lineno"> 4573</span> std::vector<RoutingDimension*> <a class="code hl_variable" href="arc__flow__builder_8cc.html#a85d16954ed793ec11f3250a16cab2a36">dimensions</a>;</div>
|
|
<div class="line"><a id="l04574" name="l04574"></a><span class="lineno"> 4574</span> <span class="keywordflow">for</span> (<a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* dimension : dimensions_) {</div>
|
|
<div class="line"><a id="l04575" name="l04575"></a><span class="lineno"> 4575</span> <span class="keywordtype">bool</span> has_soft_or_span_cost = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l04576" name="l04576"></a><span class="lineno"> 4576</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++vehicle) {</div>
|
|
<div class="line"><a id="l04577" name="l04577"></a><span class="lineno"> 4577</span> <span class="keywordflow">if</span> (dimension->GetSpanCostCoefficientForVehicle(vehicle) > 0) {</div>
|
|
<div class="line"><a id="l04578" name="l04578"></a><span class="lineno"> 4578</span> has_soft_or_span_cost = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l04579" name="l04579"></a><span class="lineno"> 4579</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l04580" name="l04580"></a><span class="lineno"> 4580</span> }</div>
|
|
<div class="line"><a id="l04581" name="l04581"></a><span class="lineno"> 4581</span> }</div>
|
|
<div class="line"><a id="l04582" name="l04582"></a><span class="lineno"> 4582</span> <span class="keywordflow">if</span> (!has_soft_or_span_cost) {</div>
|
|
<div class="line"><a id="l04583" name="l04583"></a><span class="lineno"> 4583</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < dimension->cumuls().size(); ++i) {</div>
|
|
<div class="line"><a id="l04584" name="l04584"></a><span class="lineno"> 4584</span> <span class="keywordflow">if</span> (dimension->HasCumulVarSoftUpperBound(i) ||</div>
|
|
<div class="line"><a id="l04585" name="l04585"></a><span class="lineno"> 4585</span> dimension->HasCumulVarSoftLowerBound(i)) {</div>
|
|
<div class="line"><a id="l04586" name="l04586"></a><span class="lineno"> 4586</span> has_soft_or_span_cost = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l04587" name="l04587"></a><span class="lineno"> 4587</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l04588" name="l04588"></a><span class="lineno"> 4588</span> }</div>
|
|
<div class="line"><a id="l04589" name="l04589"></a><span class="lineno"> 4589</span> }</div>
|
|
<div class="line"><a id="l04590" name="l04590"></a><span class="lineno"> 4590</span> }</div>
|
|
<div class="line"><a id="l04591" name="l04591"></a><span class="lineno"> 4591</span> <span class="keywordflow">if</span> (has_soft_or_span_cost) <a class="code hl_variable" href="arc__flow__builder_8cc.html#a85d16954ed793ec11f3250a16cab2a36">dimensions</a>.push_back(dimension);</div>
|
|
<div class="line"><a id="l04592" name="l04592"></a><span class="lineno"> 4592</span> }</div>
|
|
<div class="line"><a id="l04593" name="l04593"></a><span class="lineno"> 4593</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="arc__flow__builder_8cc.html#a85d16954ed793ec11f3250a16cab2a36">dimensions</a>;</div>
|
|
<div class="line"><a id="l04594" name="l04594"></a><span class="lineno"> 4594</span>}</div>
|
|
<div class="line"><a id="l04595" name="l04595"></a><span class="lineno"> 4595</span> </div>
|
|
<div class="line"><a id="l04596" name="l04596"></a><span class="lineno"> 4596</span><a class="code hl_class" href="classoperations__research_1_1_decision_builder.html">DecisionBuilder</a>*</div>
|
|
<div class="line"><a id="l04597" name="l04597"></a><span class="lineno"> 4597</span>RoutingModel::CreateFinalizerForMinimizedAndMaximizedVariables() {</div>
|
|
<div class="line"><a id="l04598" name="l04598"></a><span class="lineno"> 4598</span> std::stable_sort(finalizer_variable_cost_pairs_.begin(),</div>
|
|
<div class="line"><a id="l04599" name="l04599"></a><span class="lineno"> 4599</span> finalizer_variable_cost_pairs_.end(),</div>
|
|
<div class="line"><a id="l04600" name="l04600"></a><span class="lineno"> 4600</span> [](<span class="keyword">const</span> std::pair<IntVar*, int64_t>& var_cost1,</div>
|
|
<div class="line"><a id="l04601" name="l04601"></a><span class="lineno"> 4601</span> <span class="keyword">const</span> std::pair<IntVar*, int64_t>& var_cost2) {</div>
|
|
<div class="line"><a id="l04602" name="l04602"></a><span class="lineno"> 4602</span> return var_cost1.second > var_cost2.second;</div>
|
|
<div class="line"><a id="l04603" name="l04603"></a><span class="lineno"> 4603</span> });</div>
|
|
<div class="line"><a id="l04604" name="l04604"></a><span class="lineno"> 4604</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_variables = finalizer_variable_cost_pairs_.size() +</div>
|
|
<div class="line"><a id="l04605" name="l04605"></a><span class="lineno"> 4605</span> finalizer_variable_target_pairs_.size();</div>
|
|
<div class="line"><a id="l04606" name="l04606"></a><span class="lineno"> 4606</span> std::vector<IntVar*> variables;</div>
|
|
<div class="line"><a id="l04607" name="l04607"></a><span class="lineno"> 4607</span> std::vector<int64_t> targets;</div>
|
|
<div class="line"><a id="l04608" name="l04608"></a><span class="lineno"> 4608</span> variables.reserve(num_variables);</div>
|
|
<div class="line"><a id="l04609" name="l04609"></a><span class="lineno"> 4609</span> targets.reserve(num_variables);</div>
|
|
<div class="line"><a id="l04610" name="l04610"></a><span class="lineno"> 4610</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>& variable_cost : finalizer_variable_cost_pairs_) {</div>
|
|
<div class="line"><a id="l04611" name="l04611"></a><span class="lineno"> 4611</span> variables.push_back(variable_cost.first);</div>
|
|
<div class="line"><a id="l04612" name="l04612"></a><span class="lineno"> 4612</span> targets.push_back(<a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits<int64_t>::min</a>());</div>
|
|
<div class="line"><a id="l04613" name="l04613"></a><span class="lineno"> 4613</span> }</div>
|
|
<div class="line"><a id="l04614" name="l04614"></a><span class="lineno"> 4614</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span>& variable_target : finalizer_variable_target_pairs_) {</div>
|
|
<div class="line"><a id="l04615" name="l04615"></a><span class="lineno"> 4615</span> variables.push_back(variable_target.first);</div>
|
|
<div class="line"><a id="l04616" name="l04616"></a><span class="lineno"> 4616</span> targets.push_back(variable_target.second);</div>
|
|
<div class="line"><a id="l04617" name="l04617"></a><span class="lineno"> 4617</span> }</div>
|
|
<div class="line"><a id="l04618" name="l04618"></a><span class="lineno"> 4618</span> <span class="keywordflow">return</span> <a class="code hl_function" href="namespaceoperations__research.html#a7f3c7082ef5ac88b70d3488d5886812a">MakeSetValuesFromTargets</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>(), std::move(variables),</div>
|
|
<div class="line"><a id="l04619" name="l04619"></a><span class="lineno"> 4619</span> std::move(targets));</div>
|
|
<div class="line"><a id="l04620" name="l04620"></a><span class="lineno"> 4620</span>}</div>
|
|
<div class="line"><a id="l04621" name="l04621"></a><span class="lineno"> 4621</span> </div>
|
|
<div class="line"><a id="l04622" name="l04622"></a><span class="lineno"> 4622</span>DecisionBuilder* RoutingModel::CreateSolutionFinalizer(SearchLimit* lns_limit) {</div>
|
|
<div class="line"><a id="l04623" name="l04623"></a><span class="lineno"> 4623</span> std::vector<DecisionBuilder*> decision_builders;</div>
|
|
<div class="line"><a id="l04624" name="l04624"></a><span class="lineno"> 4624</span> decision_builders.push_back(solver_->MakePhase(</div>
|
|
<div class="line"><a id="l04625" name="l04625"></a><span class="lineno"> 4625</span> nexts_, <a class="code hl_enumvalue" href="classoperations__research_1_1_solver.html#ab7ab23bc58ea40dc03a5418ddbce7601a1a148a0aaaad7f56eea42df9876e7ae9">Solver::CHOOSE_FIRST_UNBOUND</a>, <a class="code hl_enumvalue" href="classoperations__research_1_1_solver.html#a45c5a2dd0d47110ef5b00408854d8d84a26ee6f4132972f3880a16bf01faf5886">Solver::ASSIGN_MIN_VALUE</a>));</div>
|
|
<div class="line"><a id="l04626" name="l04626"></a><span class="lineno"> 4626</span> </div>
|
|
<div class="line"><a id="l04627" name="l04627"></a><span class="lineno"> 4627</span> <span class="keywordflow">if</span> (!local_dimension_optimizers_.empty()) {</div>
|
|
<div class="line"><a id="l04628" name="l04628"></a><span class="lineno"> 4628</span> decision_builders.push_back(</div>
|
|
<div class="line"><a id="l04629" name="l04629"></a><span class="lineno"> 4629</span> solver_->RevAlloc(<span class="keyword">new</span> SetCumulsFromLocalDimensionCosts(</div>
|
|
<div class="line"><a id="l04630" name="l04630"></a><span class="lineno"> 4630</span> &local_dimension_optimizers_, &local_dimension_mp_optimizers_,</div>
|
|
<div class="line"><a id="l04631" name="l04631"></a><span class="lineno"> 4631</span> lns_limit)));</div>
|
|
<div class="line"><a id="l04632" name="l04632"></a><span class="lineno"> 4632</span> }</div>
|
|
<div class="line"><a id="l04633" name="l04633"></a><span class="lineno"> 4633</span> <span class="keywordflow">if</span> (!global_dimension_optimizers_.empty()) {</div>
|
|
<div class="line"><a id="l04634" name="l04634"></a><span class="lineno"> 4634</span> decision_builders.push_back(</div>
|
|
<div class="line"><a id="l04635" name="l04635"></a><span class="lineno"> 4635</span> solver_->RevAlloc(<span class="keyword">new</span> SetCumulsFromGlobalDimensionCosts(</div>
|
|
<div class="line"><a id="l04636" name="l04636"></a><span class="lineno"> 4636</span> &global_dimension_optimizers_, &global_dimension_mp_optimizers_,</div>
|
|
<div class="line"><a id="l04637" name="l04637"></a><span class="lineno"> 4637</span> lns_limit)));</div>
|
|
<div class="line"><a id="l04638" name="l04638"></a><span class="lineno"> 4638</span> }</div>
|
|
<div class="line"><a id="l04639" name="l04639"></a><span class="lineno"> 4639</span> decision_builders.push_back(</div>
|
|
<div class="line"><a id="l04640" name="l04640"></a><span class="lineno"> 4640</span> CreateFinalizerForMinimizedAndMaximizedVariables());</div>
|
|
<div class="line"><a id="l04641" name="l04641"></a><span class="lineno"> 4641</span> </div>
|
|
<div class="line"><a id="l04642" name="l04642"></a><span class="lineno"> 4642</span> <span class="keywordflow">return</span> solver_->Compose(decision_builders);</div>
|
|
<div class="line"><a id="l04643" name="l04643"></a><span class="lineno"> 4643</span>}</div>
|
|
<div class="line"><a id="l04644" name="l04644"></a><span class="lineno"> 4644</span> </div>
|
|
<div class="line"><a id="l04645" name="l04645"></a><span class="lineno"> 4645</span><span class="keywordtype">void</span> RoutingModel::CreateFirstSolutionDecisionBuilders(</div>
|
|
<div class="line"><a id="l04646" name="l04646"></a><span class="lineno"> 4646</span> <span class="keyword">const</span> RoutingSearchParameters& search_parameters) {</div>
|
|
<div class="line"><a id="l04647" name="l04647"></a><span class="lineno"> 4647</span> first_solution_decision_builders_.resize(</div>
|
|
<div class="line"><a id="l04648" name="l04648"></a><span class="lineno"> 4648</span> <a class="code hl_variable" href="namespaceoperations__research.html#a288aa8299841c0561fbe3505220f708a">FirstSolutionStrategy_Value_Value_ARRAYSIZE</a>, <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l04649" name="l04649"></a><span class="lineno"> 4649</span> first_solution_filtered_decision_builders_.resize(</div>
|
|
<div class="line"><a id="l04650" name="l04650"></a><span class="lineno"> 4650</span> <a class="code hl_variable" href="namespaceoperations__research.html#a288aa8299841c0561fbe3505220f708a">FirstSolutionStrategy_Value_Value_ARRAYSIZE</a>, <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l04651" name="l04651"></a><span class="lineno"> 4651</span> DecisionBuilder* <span class="keyword">const</span> finalize_solution =</div>
|
|
<div class="line"><a id="l04652" name="l04652"></a><span class="lineno"> 4652</span> CreateSolutionFinalizer(GetOrCreateLargeNeighborhoodSearchLimit());</div>
|
|
<div class="line"><a id="l04653" name="l04653"></a><span class="lineno"> 4653</span> <span class="comment">// Default heuristic</span></div>
|
|
<div class="line"><a id="l04654" name="l04654"></a><span class="lineno"> 4654</span> first_solution_decision_builders_</div>
|
|
<div class="line"><a id="l04655" name="l04655"></a><span class="lineno"> 4655</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#a4aa7531a8f305562e8db414b076c2547">FirstSolutionStrategy::FIRST_UNBOUND_MIN_VALUE</a>] = finalize_solution;</div>
|
|
<div class="line"><a id="l04656" name="l04656"></a><span class="lineno"> 4656</span> <span class="comment">// Global cheapest addition heuristic.</span></div>
|
|
<div class="line"><a id="l04657" name="l04657"></a><span class="lineno"> 4657</span> first_solution_decision_builders_</div>
|
|
<div class="line"><a id="l04658" name="l04658"></a><span class="lineno"> 4658</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#a11b9a9b7d0fdd3c25f85386594d92131">FirstSolutionStrategy::GLOBAL_CHEAPEST_ARC</a>] = solver_->MakePhase(</div>
|
|
<div class="line"><a id="l04659" name="l04659"></a><span class="lineno"> 4659</span> nexts_,</div>
|
|
<div class="line"><a id="l04660" name="l04660"></a><span class="lineno"> 4660</span> [<span class="keyword">this</span>](int64_t i, int64_t j) {</div>
|
|
<div class="line"><a id="l04661" name="l04661"></a><span class="lineno"> 4661</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a7c1886b567f58aff622ab91f7f0f8685">GetArcCostForFirstSolution</a>(i, j);</div>
|
|
<div class="line"><a id="l04662" name="l04662"></a><span class="lineno"> 4662</span> },</div>
|
|
<div class="line"><a id="l04663" name="l04663"></a><span class="lineno"> 4663</span> <a class="code hl_enumvalue" href="classoperations__research_1_1_solver.html#a8b1044e7c2b76345532f848a982a7106a3850e163a7085a9d2cf0109439baaff1">Solver::CHOOSE_STATIC_GLOBAL_BEST</a>);</div>
|
|
<div class="line"><a id="l04664" name="l04664"></a><span class="lineno"> 4664</span> <span class="comment">// Cheapest addition heuristic.</span></div>
|
|
<div class="line"><a id="l04665" name="l04665"></a><span class="lineno"> 4665</span> <a class="code hl_typedef" href="classoperations__research_1_1_solver.html#a55d833360c375d45a3c503437de9841c">Solver::IndexEvaluator2</a> eval = [<span class="keyword">this</span>](int64_t i, int64_t j) {</div>
|
|
<div class="line"><a id="l04666" name="l04666"></a><span class="lineno"> 4666</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a7c1886b567f58aff622ab91f7f0f8685">GetArcCostForFirstSolution</a>(i, j);</div>
|
|
<div class="line"><a id="l04667" name="l04667"></a><span class="lineno"> 4667</span> };</div>
|
|
<div class="line"><a id="l04668" name="l04668"></a><span class="lineno"> 4668</span> first_solution_decision_builders_[<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#a48a447de5f3e3a57cd6e0266a8b53825">FirstSolutionStrategy::LOCAL_CHEAPEST_ARC</a>] =</div>
|
|
<div class="line"><a id="l04669" name="l04669"></a><span class="lineno"> 4669</span> solver_->MakePhase(nexts_, <a class="code hl_enumvalue" href="classoperations__research_1_1_solver.html#ab7ab23bc58ea40dc03a5418ddbce7601a1a148a0aaaad7f56eea42df9876e7ae9">Solver::CHOOSE_FIRST_UNBOUND</a>, eval);</div>
|
|
<div class="line"><a id="l04670" name="l04670"></a><span class="lineno"> 4670</span> <span class="comment">// Path-based cheapest addition heuristic.</span></div>
|
|
<div class="line"><a id="l04671" name="l04671"></a><span class="lineno"> 4671</span> first_solution_decision_builders_[<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#af9514bec629ba99306ed93ab08252708">FirstSolutionStrategy::PATH_CHEAPEST_ARC</a>] =</div>
|
|
<div class="line"><a id="l04672" name="l04672"></a><span class="lineno"> 4672</span> solver_->MakePhase(nexts_, <a class="code hl_enumvalue" href="classoperations__research_1_1_solver.html#ab7ab23bc58ea40dc03a5418ddbce7601a1e36b06cc28522f212507ecaac29797d">Solver::CHOOSE_PATH</a>, eval);</div>
|
|
<div class="line"><a id="l04673" name="l04673"></a><span class="lineno"> 4673</span> <span class="keywordflow">if</span> (!search_parameters.use_unfiltered_first_solution_strategy()) {</div>
|
|
<div class="line"><a id="l04674" name="l04674"></a><span class="lineno"> 4674</span> first_solution_filtered_decision_builders_</div>
|
|
<div class="line"><a id="l04675" name="l04675"></a><span class="lineno"> 4675</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#af9514bec629ba99306ed93ab08252708">FirstSolutionStrategy::PATH_CHEAPEST_ARC</a>] =</div>
|
|
<div class="line"><a id="l04676" name="l04676"></a><span class="lineno"> 4676</span> solver_->RevAlloc(<span class="keyword">new</span> IntVarFilteredDecisionBuilder(</div>
|
|
<div class="line"><a id="l04677" name="l04677"></a><span class="lineno"> 4677</span> absl::make_unique<EvaluatorCheapestAdditionFilteredHeuristic>(</div>
|
|
<div class="line"><a id="l04678" name="l04678"></a><span class="lineno"> 4678</span> <span class="keyword">this</span>,</div>
|
|
<div class="line"><a id="l04679" name="l04679"></a><span class="lineno"> 4679</span> [<span class="keyword">this</span>](int64_t i, int64_t j) {</div>
|
|
<div class="line"><a id="l04680" name="l04680"></a><span class="lineno"> 4680</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a7c1886b567f58aff622ab91f7f0f8685">GetArcCostForFirstSolution</a>(i, j);</div>
|
|
<div class="line"><a id="l04681" name="l04681"></a><span class="lineno"> 4681</span> },</div>
|
|
<div class="line"><a id="l04682" name="l04682"></a><span class="lineno"> 4682</span> GetOrCreateFeasibilityFilterManager(search_parameters))));</div>
|
|
<div class="line"><a id="l04683" name="l04683"></a><span class="lineno"> 4683</span> first_solution_decision_builders_</div>
|
|
<div class="line"><a id="l04684" name="l04684"></a><span class="lineno"> 4684</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#af9514bec629ba99306ed93ab08252708">FirstSolutionStrategy::PATH_CHEAPEST_ARC</a>] =</div>
|
|
<div class="line"><a id="l04685" name="l04685"></a><span class="lineno"> 4685</span> solver_->Try(first_solution_filtered_decision_builders_</div>
|
|
<div class="line"><a id="l04686" name="l04686"></a><span class="lineno"> 4686</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#af9514bec629ba99306ed93ab08252708">FirstSolutionStrategy::PATH_CHEAPEST_ARC</a>],</div>
|
|
<div class="line"><a id="l04687" name="l04687"></a><span class="lineno"> 4687</span> first_solution_decision_builders_</div>
|
|
<div class="line"><a id="l04688" name="l04688"></a><span class="lineno"> 4688</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#af9514bec629ba99306ed93ab08252708">FirstSolutionStrategy::PATH_CHEAPEST_ARC</a>]);</div>
|
|
<div class="line"><a id="l04689" name="l04689"></a><span class="lineno"> 4689</span> }</div>
|
|
<div class="line"><a id="l04690" name="l04690"></a><span class="lineno"> 4690</span> <span class="comment">// Path-based most constrained arc addition heuristic.</span></div>
|
|
<div class="line"><a id="l04691" name="l04691"></a><span class="lineno"> 4691</span> <a class="code hl_typedef" href="classoperations__research_1_1_solver.html#af5502e2288132c081fc96fdbcee282e6">Solver::VariableValueComparator</a> comp = [<span class="keyword">this</span>](int64_t i, int64_t j,</div>
|
|
<div class="line"><a id="l04692" name="l04692"></a><span class="lineno"> 4692</span> int64_t k) {</div>
|
|
<div class="line"><a id="l04693" name="l04693"></a><span class="lineno"> 4693</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a78657faa6e076466c745caefdf732970">ArcIsMoreConstrainedThanArc</a>(i, j, k);</div>
|
|
<div class="line"><a id="l04694" name="l04694"></a><span class="lineno"> 4694</span> };</div>
|
|
<div class="line"><a id="l04695" name="l04695"></a><span class="lineno"> 4695</span> </div>
|
|
<div class="line"><a id="l04696" name="l04696"></a><span class="lineno"> 4696</span> first_solution_decision_builders_</div>
|
|
<div class="line"><a id="l04697" name="l04697"></a><span class="lineno"> 4697</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#aa3f1b8abbac547f481f99a26c0e223b7">FirstSolutionStrategy::PATH_MOST_CONSTRAINED_ARC</a>] =</div>
|
|
<div class="line"><a id="l04698" name="l04698"></a><span class="lineno"> 4698</span> solver_->MakePhase(nexts_, <a class="code hl_enumvalue" href="classoperations__research_1_1_solver.html#ab7ab23bc58ea40dc03a5418ddbce7601a1e36b06cc28522f212507ecaac29797d">Solver::CHOOSE_PATH</a>, comp);</div>
|
|
<div class="line"><a id="l04699" name="l04699"></a><span class="lineno"> 4699</span> <span class="keywordflow">if</span> (!search_parameters.use_unfiltered_first_solution_strategy()) {</div>
|
|
<div class="line"><a id="l04700" name="l04700"></a><span class="lineno"> 4700</span> first_solution_filtered_decision_builders_</div>
|
|
<div class="line"><a id="l04701" name="l04701"></a><span class="lineno"> 4701</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#aa3f1b8abbac547f481f99a26c0e223b7">FirstSolutionStrategy::PATH_MOST_CONSTRAINED_ARC</a>] =</div>
|
|
<div class="line"><a id="l04702" name="l04702"></a><span class="lineno"> 4702</span> solver_->RevAlloc(<span class="keyword">new</span> IntVarFilteredDecisionBuilder(</div>
|
|
<div class="line"><a id="l04703" name="l04703"></a><span class="lineno"> 4703</span> absl::make_unique<ComparatorCheapestAdditionFilteredHeuristic>(</div>
|
|
<div class="line"><a id="l04704" name="l04704"></a><span class="lineno"> 4704</span> <span class="keyword">this</span>, comp,</div>
|
|
<div class="line"><a id="l04705" name="l04705"></a><span class="lineno"> 4705</span> GetOrCreateFeasibilityFilterManager(search_parameters))));</div>
|
|
<div class="line"><a id="l04706" name="l04706"></a><span class="lineno"> 4706</span> first_solution_decision_builders_</div>
|
|
<div class="line"><a id="l04707" name="l04707"></a><span class="lineno"> 4707</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#aa3f1b8abbac547f481f99a26c0e223b7">FirstSolutionStrategy::PATH_MOST_CONSTRAINED_ARC</a>] = solver_->Try(</div>
|
|
<div class="line"><a id="l04708" name="l04708"></a><span class="lineno"> 4708</span> first_solution_filtered_decision_builders_</div>
|
|
<div class="line"><a id="l04709" name="l04709"></a><span class="lineno"> 4709</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#aa3f1b8abbac547f481f99a26c0e223b7">FirstSolutionStrategy::PATH_MOST_CONSTRAINED_ARC</a>],</div>
|
|
<div class="line"><a id="l04710" name="l04710"></a><span class="lineno"> 4710</span> first_solution_decision_builders_</div>
|
|
<div class="line"><a id="l04711" name="l04711"></a><span class="lineno"> 4711</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#aa3f1b8abbac547f481f99a26c0e223b7">FirstSolutionStrategy::PATH_MOST_CONSTRAINED_ARC</a>]);</div>
|
|
<div class="line"><a id="l04712" name="l04712"></a><span class="lineno"> 4712</span> }</div>
|
|
<div class="line"><a id="l04713" name="l04713"></a><span class="lineno"> 4713</span> <span class="comment">// Evaluator-based path heuristic.</span></div>
|
|
<div class="line"><a id="l04714" name="l04714"></a><span class="lineno"> 4714</span> <span class="keywordflow">if</span> (first_solution_evaluator_ != <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l04715" name="l04715"></a><span class="lineno"> 4715</span> first_solution_decision_builders_</div>
|
|
<div class="line"><a id="l04716" name="l04716"></a><span class="lineno"> 4716</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#aee8aae82281ff07467b56312b49edcd4">FirstSolutionStrategy::EVALUATOR_STRATEGY</a>] = solver_->MakePhase(</div>
|
|
<div class="line"><a id="l04717" name="l04717"></a><span class="lineno"> 4717</span> nexts_, <a class="code hl_enumvalue" href="classoperations__research_1_1_solver.html#ab7ab23bc58ea40dc03a5418ddbce7601a1e36b06cc28522f212507ecaac29797d">Solver::CHOOSE_PATH</a>, first_solution_evaluator_);</div>
|
|
<div class="line"><a id="l04718" name="l04718"></a><span class="lineno"> 4718</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l04719" name="l04719"></a><span class="lineno"> 4719</span> first_solution_decision_builders_</div>
|
|
<div class="line"><a id="l04720" name="l04720"></a><span class="lineno"> 4720</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#aee8aae82281ff07467b56312b49edcd4">FirstSolutionStrategy::EVALUATOR_STRATEGY</a>] = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l04721" name="l04721"></a><span class="lineno"> 4721</span> }</div>
|
|
<div class="line"><a id="l04722" name="l04722"></a><span class="lineno"> 4722</span> <span class="comment">// All unperformed heuristic.</span></div>
|
|
<div class="line"><a id="l04723" name="l04723"></a><span class="lineno"> 4723</span> first_solution_decision_builders_[<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#a5af655ec3247fcc1346b07db492918b0">FirstSolutionStrategy::ALL_UNPERFORMED</a>] =</div>
|
|
<div class="line"><a id="l04724" name="l04724"></a><span class="lineno"> 4724</span> <a class="code hl_function" href="namespaceoperations__research.html#a26a2d5d3c5887e436bf4da4c20a99a26">MakeAllUnperformed</a>(<span class="keyword">this</span>);</div>
|
|
<div class="line"><a id="l04725" name="l04725"></a><span class="lineno"> 4725</span> <span class="comment">// Best insertion heuristic.</span></div>
|
|
<div class="line"><a id="l04726" name="l04726"></a><span class="lineno"> 4726</span> RegularLimit* <span class="keyword">const</span> ls_limit = solver_->MakeLimit(</div>
|
|
<div class="line"><a id="l04727" name="l04727"></a><span class="lineno"> 4727</span> GetTimeLimit(search_parameters), <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(),</div>
|
|
<div class="line"><a id="l04728" name="l04728"></a><span class="lineno"> 4728</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(), <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(),</div>
|
|
<div class="line"><a id="l04729" name="l04729"></a><span class="lineno"> 4729</span> <span class="comment">/*smart_time_check=*/</span><span class="keyword">true</span>);</div>
|
|
<div class="line"><a id="l04730" name="l04730"></a><span class="lineno"> 4730</span> DecisionBuilder* <span class="keyword">const</span> finalize = solver_->MakeSolveOnce(</div>
|
|
<div class="line"><a id="l04731" name="l04731"></a><span class="lineno"> 4731</span> finalize_solution, GetOrCreateLargeNeighborhoodSearchLimit());</div>
|
|
<div class="line"><a id="l04732" name="l04732"></a><span class="lineno"> 4732</span> LocalSearchPhaseParameters* <span class="keyword">const</span> insertion_parameters =</div>
|
|
<div class="line"><a id="l04733" name="l04733"></a><span class="lineno"> 4733</span> solver_->MakeLocalSearchPhaseParameters(</div>
|
|
<div class="line"><a id="l04734" name="l04734"></a><span class="lineno"> 4734</span> <span class="keyword">nullptr</span>, CreateInsertionOperator(), finalize, ls_limit,</div>
|
|
<div class="line"><a id="l04735" name="l04735"></a><span class="lineno"> 4735</span> GetOrCreateLocalSearchFilterManager(search_parameters));</div>
|
|
<div class="line"><a id="l04736" name="l04736"></a><span class="lineno"> 4736</span> std::vector<IntVar*> decision_vars = nexts_;</div>
|
|
<div class="line"><a id="l04737" name="l04737"></a><span class="lineno"> 4737</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853">CostsAreHomogeneousAcrossVehicles</a>()) {</div>
|
|
<div class="line"><a id="l04738" name="l04738"></a><span class="lineno"> 4738</span> decision_vars.insert(decision_vars.end(), vehicle_vars_.begin(),</div>
|
|
<div class="line"><a id="l04739" name="l04739"></a><span class="lineno"> 4739</span> vehicle_vars_.end());</div>
|
|
<div class="line"><a id="l04740" name="l04740"></a><span class="lineno"> 4740</span> }</div>
|
|
<div class="line"><a id="l04741" name="l04741"></a><span class="lineno"> 4741</span> <span class="keyword">const</span> int64_t optimization_step = <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(</div>
|
|
<div class="line"><a id="l04742" name="l04742"></a><span class="lineno"> 4742</span> <a class="code hl_function" href="classoperations__research_1_1_math_util.html#a55fc8a3af7c2526c83e83586cd578d89">MathUtil::FastInt64Round</a>(search_parameters.optimization_step()), <a class="code hl_function" href="namespaceoperations__research.html#a9e48359348ad94d97e6c44ffd52b33e3">One</a>());</div>
|
|
<div class="line"><a id="l04743" name="l04743"></a><span class="lineno"> 4743</span> first_solution_decision_builders_[<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#a19fd09a7629e12dc005225f4ff7d9c35">FirstSolutionStrategy::BEST_INSERTION</a>] =</div>
|
|
<div class="line"><a id="l04744" name="l04744"></a><span class="lineno"> 4744</span> solver_->MakeNestedOptimize(</div>
|
|
<div class="line"><a id="l04745" name="l04745"></a><span class="lineno"> 4745</span> solver_->MakeLocalSearchPhase(decision_vars, <a class="code hl_function" href="namespaceoperations__research.html#a26a2d5d3c5887e436bf4da4c20a99a26">MakeAllUnperformed</a>(<span class="keyword">this</span>),</div>
|
|
<div class="line"><a id="l04746" name="l04746"></a><span class="lineno"> 4746</span> insertion_parameters),</div>
|
|
<div class="line"><a id="l04747" name="l04747"></a><span class="lineno"> 4747</span> GetOrCreateAssignment(), <span class="keyword">false</span>, optimization_step);</div>
|
|
<div class="line"><a id="l04748" name="l04748"></a><span class="lineno"> 4748</span> first_solution_decision_builders_[<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#a19fd09a7629e12dc005225f4ff7d9c35">FirstSolutionStrategy::BEST_INSERTION</a>] =</div>
|
|
<div class="line"><a id="l04749" name="l04749"></a><span class="lineno"> 4749</span> solver_->Compose(first_solution_decision_builders_</div>
|
|
<div class="line"><a id="l04750" name="l04750"></a><span class="lineno"> 4750</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#a19fd09a7629e12dc005225f4ff7d9c35">FirstSolutionStrategy::BEST_INSERTION</a>],</div>
|
|
<div class="line"><a id="l04751" name="l04751"></a><span class="lineno"> 4751</span> finalize);</div>
|
|
<div class="line"><a id="l04752" name="l04752"></a><span class="lineno"> 4752</span> </div>
|
|
<div class="line"><a id="l04753" name="l04753"></a><span class="lineno"> 4753</span> <span class="comment">// Parallel/Sequential Global cheapest insertion</span></div>
|
|
<div class="line"><a id="l04754" name="l04754"></a><span class="lineno"> 4754</span> GlobalCheapestInsertionFilteredHeuristic::GlobalCheapestInsertionParameters</div>
|
|
<div class="line"><a id="l04755" name="l04755"></a><span class="lineno"> 4755</span> gci_parameters;</div>
|
|
<div class="line"><a id="l04756" name="l04756"></a><span class="lineno"> 4756</span> gci_parameters.is_sequential = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l04757" name="l04757"></a><span class="lineno"> 4757</span> gci_parameters.farthest_seeds_ratio =</div>
|
|
<div class="line"><a id="l04758" name="l04758"></a><span class="lineno"> 4758</span> search_parameters.cheapest_insertion_farthest_seeds_ratio();</div>
|
|
<div class="line"><a id="l04759" name="l04759"></a><span class="lineno"> 4759</span> gci_parameters.neighbors_ratio =</div>
|
|
<div class="line"><a id="l04760" name="l04760"></a><span class="lineno"> 4760</span> search_parameters.cheapest_insertion_first_solution_neighbors_ratio();</div>
|
|
<div class="line"><a id="l04761" name="l04761"></a><span class="lineno"> 4761</span> gci_parameters.min_neighbors =</div>
|
|
<div class="line"><a id="l04762" name="l04762"></a><span class="lineno"> 4762</span> search_parameters.cheapest_insertion_first_solution_min_neighbors();</div>
|
|
<div class="line"><a id="l04763" name="l04763"></a><span class="lineno"> 4763</span> gci_parameters.use_neighbors_ratio_for_initialization =</div>
|
|
<div class="line"><a id="l04764" name="l04764"></a><span class="lineno"> 4764</span> search_parameters</div>
|
|
<div class="line"><a id="l04765" name="l04765"></a><span class="lineno"> 4765</span> .cheapest_insertion_first_solution_use_neighbors_ratio_for_initialization(); <span class="comment">// NOLINT</span></div>
|
|
<div class="line"><a id="l04766" name="l04766"></a><span class="lineno"> 4766</span> gci_parameters.add_unperformed_entries =</div>
|
|
<div class="line"><a id="l04767" name="l04767"></a><span class="lineno"> 4767</span> search_parameters.cheapest_insertion_add_unperformed_entries();</div>
|
|
<div class="line"><a id="l04768" name="l04768"></a><span class="lineno"> 4768</span> <span class="keywordflow">for</span> (<span class="keywordtype">bool</span> is_sequential : {<span class="keyword">false</span>, <span class="keyword">true</span>}) {</div>
|
|
<div class="line"><a id="l04769" name="l04769"></a><span class="lineno"> 4769</span> <a class="code hl_typedef" href="classoperations__research_1_1_first_solution_strategy.html#a31bc681b1d8ba03d79e0f08fd310e943">FirstSolutionStrategy::Value</a> first_solution_strategy =</div>
|
|
<div class="line"><a id="l04770" name="l04770"></a><span class="lineno"> 4770</span> is_sequential ? <a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#af8b7465c1391f91692bed327d5d4fa66">FirstSolutionStrategy::SEQUENTIAL_CHEAPEST_INSERTION</a></div>
|
|
<div class="line"><a id="l04771" name="l04771"></a><span class="lineno"> 4771</span> : <a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#ad881a20d00240fb652ccb3b0c8d4cfa9">FirstSolutionStrategy::PARALLEL_CHEAPEST_INSERTION</a>;</div>
|
|
<div class="line"><a id="l04772" name="l04772"></a><span class="lineno"> 4772</span> gci_parameters.is_sequential = is_sequential;</div>
|
|
<div class="line"><a id="l04773" name="l04773"></a><span class="lineno"> 4773</span> </div>
|
|
<div class="line"><a id="l04774" name="l04774"></a><span class="lineno"> 4774</span> first_solution_filtered_decision_builders_[first_solution_strategy] =</div>
|
|
<div class="line"><a id="l04775" name="l04775"></a><span class="lineno"> 4775</span> solver_->RevAlloc(<span class="keyword">new</span> IntVarFilteredDecisionBuilder(</div>
|
|
<div class="line"><a id="l04776" name="l04776"></a><span class="lineno"> 4776</span> absl::make_unique<GlobalCheapestInsertionFilteredHeuristic>(</div>
|
|
<div class="line"><a id="l04777" name="l04777"></a><span class="lineno"> 4777</span> <span class="keyword">this</span>,</div>
|
|
<div class="line"><a id="l04778" name="l04778"></a><span class="lineno"> 4778</span> [<span class="keyword">this</span>](int64_t i, int64_t j, int64_t vehicle) {</div>
|
|
<div class="line"><a id="l04779" name="l04779"></a><span class="lineno"> 4779</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8174e01c9a66c00a87cdbe86ccd3655c">GetArcCostForVehicle</a>(i, j, vehicle);</div>
|
|
<div class="line"><a id="l04780" name="l04780"></a><span class="lineno"> 4780</span> },</div>
|
|
<div class="line"><a id="l04781" name="l04781"></a><span class="lineno"> 4781</span> [<span class="keyword">this</span>](int64_t i) { <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a9285d707cc3302c913f5c88697743947">UnperformedPenaltyOrValue</a>(0, i); },</div>
|
|
<div class="line"><a id="l04782" name="l04782"></a><span class="lineno"> 4782</span> GetOrCreateFeasibilityFilterManager(search_parameters),</div>
|
|
<div class="line"><a id="l04783" name="l04783"></a><span class="lineno"> 4783</span> gci_parameters)));</div>
|
|
<div class="line"><a id="l04784" name="l04784"></a><span class="lineno"> 4784</span> IntVarFilteredDecisionBuilder* <span class="keyword">const</span> strong_gci =</div>
|
|
<div class="line"><a id="l04785" name="l04785"></a><span class="lineno"> 4785</span> solver_->RevAlloc(<span class="keyword">new</span> IntVarFilteredDecisionBuilder(</div>
|
|
<div class="line"><a id="l04786" name="l04786"></a><span class="lineno"> 4786</span> absl::make_unique<GlobalCheapestInsertionFilteredHeuristic>(</div>
|
|
<div class="line"><a id="l04787" name="l04787"></a><span class="lineno"> 4787</span> <span class="keyword">this</span>,</div>
|
|
<div class="line"><a id="l04788" name="l04788"></a><span class="lineno"> 4788</span> [<span class="keyword">this</span>](int64_t i, int64_t j, int64_t vehicle) {</div>
|
|
<div class="line"><a id="l04789" name="l04789"></a><span class="lineno"> 4789</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8174e01c9a66c00a87cdbe86ccd3655c">GetArcCostForVehicle</a>(i, j, vehicle);</div>
|
|
<div class="line"><a id="l04790" name="l04790"></a><span class="lineno"> 4790</span> },</div>
|
|
<div class="line"><a id="l04791" name="l04791"></a><span class="lineno"> 4791</span> [<span class="keyword">this</span>](int64_t i) { <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a9285d707cc3302c913f5c88697743947">UnperformedPenaltyOrValue</a>(0, i); },</div>
|
|
<div class="line"><a id="l04792" name="l04792"></a><span class="lineno"> 4792</span> GetOrCreateStrongFeasibilityFilterManager(search_parameters),</div>
|
|
<div class="line"><a id="l04793" name="l04793"></a><span class="lineno"> 4793</span> gci_parameters)));</div>
|
|
<div class="line"><a id="l04794" name="l04794"></a><span class="lineno"> 4794</span> first_solution_decision_builders_[first_solution_strategy] = solver_->Try(</div>
|
|
<div class="line"><a id="l04795" name="l04795"></a><span class="lineno"> 4795</span> first_solution_filtered_decision_builders_[first_solution_strategy],</div>
|
|
<div class="line"><a id="l04796" name="l04796"></a><span class="lineno"> 4796</span> solver_->Try(strong_gci, first_solution_decision_builders_</div>
|
|
<div class="line"><a id="l04797" name="l04797"></a><span class="lineno"> 4797</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#a19fd09a7629e12dc005225f4ff7d9c35">FirstSolutionStrategy::BEST_INSERTION</a>]));</div>
|
|
<div class="line"><a id="l04798" name="l04798"></a><span class="lineno"> 4798</span> }</div>
|
|
<div class="line"><a id="l04799" name="l04799"></a><span class="lineno"> 4799</span> </div>
|
|
<div class="line"><a id="l04800" name="l04800"></a><span class="lineno"> 4800</span> <span class="comment">// Local cheapest insertion</span></div>
|
|
<div class="line"><a id="l04801" name="l04801"></a><span class="lineno"> 4801</span> first_solution_filtered_decision_builders_</div>
|
|
<div class="line"><a id="l04802" name="l04802"></a><span class="lineno"> 4802</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#a8530d171da599ab97b7c85a9e07ca7fb">FirstSolutionStrategy::LOCAL_CHEAPEST_INSERTION</a>] =</div>
|
|
<div class="line"><a id="l04803" name="l04803"></a><span class="lineno"> 4803</span> solver_->RevAlloc(<span class="keyword">new</span> IntVarFilteredDecisionBuilder(</div>
|
|
<div class="line"><a id="l04804" name="l04804"></a><span class="lineno"> 4804</span> absl::make_unique<LocalCheapestInsertionFilteredHeuristic>(</div>
|
|
<div class="line"><a id="l04805" name="l04805"></a><span class="lineno"> 4805</span> <span class="keyword">this</span>,</div>
|
|
<div class="line"><a id="l04806" name="l04806"></a><span class="lineno"> 4806</span> [<span class="keyword">this</span>](int64_t i, int64_t j, int64_t vehicle) {</div>
|
|
<div class="line"><a id="l04807" name="l04807"></a><span class="lineno"> 4807</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8174e01c9a66c00a87cdbe86ccd3655c">GetArcCostForVehicle</a>(i, j, vehicle);</div>
|
|
<div class="line"><a id="l04808" name="l04808"></a><span class="lineno"> 4808</span> },</div>
|
|
<div class="line"><a id="l04809" name="l04809"></a><span class="lineno"> 4809</span> GetOrCreateFeasibilityFilterManager(search_parameters))));</div>
|
|
<div class="line"><a id="l04810" name="l04810"></a><span class="lineno"> 4810</span> IntVarFilteredDecisionBuilder* <span class="keyword">const</span> strong_lci =</div>
|
|
<div class="line"><a id="l04811" name="l04811"></a><span class="lineno"> 4811</span> solver_->RevAlloc(<span class="keyword">new</span> IntVarFilteredDecisionBuilder(</div>
|
|
<div class="line"><a id="l04812" name="l04812"></a><span class="lineno"> 4812</span> absl::make_unique<LocalCheapestInsertionFilteredHeuristic>(</div>
|
|
<div class="line"><a id="l04813" name="l04813"></a><span class="lineno"> 4813</span> <span class="keyword">this</span>,</div>
|
|
<div class="line"><a id="l04814" name="l04814"></a><span class="lineno"> 4814</span> [<span class="keyword">this</span>](int64_t i, int64_t j, int64_t vehicle) {</div>
|
|
<div class="line"><a id="l04815" name="l04815"></a><span class="lineno"> 4815</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8174e01c9a66c00a87cdbe86ccd3655c">GetArcCostForVehicle</a>(i, j, vehicle);</div>
|
|
<div class="line"><a id="l04816" name="l04816"></a><span class="lineno"> 4816</span> },</div>
|
|
<div class="line"><a id="l04817" name="l04817"></a><span class="lineno"> 4817</span> GetOrCreateStrongFeasibilityFilterManager(search_parameters))));</div>
|
|
<div class="line"><a id="l04818" name="l04818"></a><span class="lineno"> 4818</span> first_solution_decision_builders_</div>
|
|
<div class="line"><a id="l04819" name="l04819"></a><span class="lineno"> 4819</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#a8530d171da599ab97b7c85a9e07ca7fb">FirstSolutionStrategy::LOCAL_CHEAPEST_INSERTION</a>] = solver_->Try(</div>
|
|
<div class="line"><a id="l04820" name="l04820"></a><span class="lineno"> 4820</span> first_solution_filtered_decision_builders_</div>
|
|
<div class="line"><a id="l04821" name="l04821"></a><span class="lineno"> 4821</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#a8530d171da599ab97b7c85a9e07ca7fb">FirstSolutionStrategy::LOCAL_CHEAPEST_INSERTION</a>],</div>
|
|
<div class="line"><a id="l04822" name="l04822"></a><span class="lineno"> 4822</span> solver_->Try(strong_lci,</div>
|
|
<div class="line"><a id="l04823" name="l04823"></a><span class="lineno"> 4823</span> first_solution_decision_builders_</div>
|
|
<div class="line"><a id="l04824" name="l04824"></a><span class="lineno"> 4824</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#a19fd09a7629e12dc005225f4ff7d9c35">FirstSolutionStrategy::BEST_INSERTION</a>]));</div>
|
|
<div class="line"><a id="l04825" name="l04825"></a><span class="lineno"> 4825</span> <span class="comment">// Savings</span></div>
|
|
<div class="line"><a id="l04826" name="l04826"></a><span class="lineno"> 4826</span> SavingsFilteredHeuristic::SavingsParameters savings_parameters;</div>
|
|
<div class="line"><a id="l04827" name="l04827"></a><span class="lineno"> 4827</span> savings_parameters.neighbors_ratio =</div>
|
|
<div class="line"><a id="l04828" name="l04828"></a><span class="lineno"> 4828</span> search_parameters.savings_neighbors_ratio();</div>
|
|
<div class="line"><a id="l04829" name="l04829"></a><span class="lineno"> 4829</span> savings_parameters.max_memory_usage_bytes =</div>
|
|
<div class="line"><a id="l04830" name="l04830"></a><span class="lineno"> 4830</span> search_parameters.savings_max_memory_usage_bytes();</div>
|
|
<div class="line"><a id="l04831" name="l04831"></a><span class="lineno"> 4831</span> savings_parameters.add_reverse_arcs =</div>
|
|
<div class="line"><a id="l04832" name="l04832"></a><span class="lineno"> 4832</span> search_parameters.savings_add_reverse_arcs();</div>
|
|
<div class="line"><a id="l04833" name="l04833"></a><span class="lineno"> 4833</span> savings_parameters.arc_coefficient =</div>
|
|
<div class="line"><a id="l04834" name="l04834"></a><span class="lineno"> 4834</span> search_parameters.savings_arc_coefficient();</div>
|
|
<div class="line"><a id="l04835" name="l04835"></a><span class="lineno"> 4835</span> LocalSearchFilterManager* filter_manager = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l04836" name="l04836"></a><span class="lineno"> 4836</span> <span class="keywordflow">if</span> (!search_parameters.use_unfiltered_first_solution_strategy()) {</div>
|
|
<div class="line"><a id="l04837" name="l04837"></a><span class="lineno"> 4837</span> filter_manager = GetOrCreateFeasibilityFilterManager(search_parameters);</div>
|
|
<div class="line"><a id="l04838" name="l04838"></a><span class="lineno"> 4838</span> }</div>
|
|
<div class="line"><a id="l04839" name="l04839"></a><span class="lineno"> 4839</span> </div>
|
|
<div class="line"><a id="l04840" name="l04840"></a><span class="lineno"> 4840</span> <span class="keywordflow">if</span> (search_parameters.savings_parallel_routes()) {</div>
|
|
<div class="line"><a id="l04841" name="l04841"></a><span class="lineno"> 4841</span> IntVarFilteredDecisionBuilder* savings_db =</div>
|
|
<div class="line"><a id="l04842" name="l04842"></a><span class="lineno"> 4842</span> solver_->RevAlloc(<span class="keyword">new</span> IntVarFilteredDecisionBuilder(</div>
|
|
<div class="line"><a id="l04843" name="l04843"></a><span class="lineno"> 4843</span> absl::make_unique<ParallelSavingsFilteredHeuristic>(</div>
|
|
<div class="line"><a id="l04844" name="l04844"></a><span class="lineno"> 4844</span> <span class="keyword">this</span>, &manager_, savings_parameters, filter_manager)));</div>
|
|
<div class="line"><a id="l04845" name="l04845"></a><span class="lineno"> 4845</span> <span class="keywordflow">if</span> (!search_parameters.use_unfiltered_first_solution_strategy()) {</div>
|
|
<div class="line"><a id="l04846" name="l04846"></a><span class="lineno"> 4846</span> first_solution_filtered_decision_builders_</div>
|
|
<div class="line"><a id="l04847" name="l04847"></a><span class="lineno"> 4847</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#a3fe8067f96051727ad3cdb085328f4e6">FirstSolutionStrategy::SAVINGS</a>] = savings_db;</div>
|
|
<div class="line"><a id="l04848" name="l04848"></a><span class="lineno"> 4848</span> }</div>
|
|
<div class="line"><a id="l04849" name="l04849"></a><span class="lineno"> 4849</span> </div>
|
|
<div class="line"><a id="l04850" name="l04850"></a><span class="lineno"> 4850</span> first_solution_decision_builders_[<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#a3fe8067f96051727ad3cdb085328f4e6">FirstSolutionStrategy::SAVINGS</a>] =</div>
|
|
<div class="line"><a id="l04851" name="l04851"></a><span class="lineno"> 4851</span> solver_->Try(savings_db,</div>
|
|
<div class="line"><a id="l04852" name="l04852"></a><span class="lineno"> 4852</span> solver_->RevAlloc(<span class="keyword">new</span> IntVarFilteredDecisionBuilder(</div>
|
|
<div class="line"><a id="l04853" name="l04853"></a><span class="lineno"> 4853</span> absl::make_unique<ParallelSavingsFilteredHeuristic>(</div>
|
|
<div class="line"><a id="l04854" name="l04854"></a><span class="lineno"> 4854</span> <span class="keyword">this</span>, &manager_, savings_parameters,</div>
|
|
<div class="line"><a id="l04855" name="l04855"></a><span class="lineno"> 4855</span> GetOrCreateStrongFeasibilityFilterManager(</div>
|
|
<div class="line"><a id="l04856" name="l04856"></a><span class="lineno"> 4856</span> search_parameters)))));</div>
|
|
<div class="line"><a id="l04857" name="l04857"></a><span class="lineno"> 4857</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l04858" name="l04858"></a><span class="lineno"> 4858</span> IntVarFilteredDecisionBuilder* savings_db =</div>
|
|
<div class="line"><a id="l04859" name="l04859"></a><span class="lineno"> 4859</span> solver_->RevAlloc(<span class="keyword">new</span> IntVarFilteredDecisionBuilder(</div>
|
|
<div class="line"><a id="l04860" name="l04860"></a><span class="lineno"> 4860</span> absl::make_unique<SequentialSavingsFilteredHeuristic>(</div>
|
|
<div class="line"><a id="l04861" name="l04861"></a><span class="lineno"> 4861</span> <span class="keyword">this</span>, &manager_, savings_parameters, filter_manager)));</div>
|
|
<div class="line"><a id="l04862" name="l04862"></a><span class="lineno"> 4862</span> <span class="keywordflow">if</span> (!search_parameters.use_unfiltered_first_solution_strategy()) {</div>
|
|
<div class="line"><a id="l04863" name="l04863"></a><span class="lineno"> 4863</span> first_solution_filtered_decision_builders_</div>
|
|
<div class="line"><a id="l04864" name="l04864"></a><span class="lineno"> 4864</span> [<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#a3fe8067f96051727ad3cdb085328f4e6">FirstSolutionStrategy::SAVINGS</a>] = savings_db;</div>
|
|
<div class="line"><a id="l04865" name="l04865"></a><span class="lineno"> 4865</span> }</div>
|
|
<div class="line"><a id="l04866" name="l04866"></a><span class="lineno"> 4866</span> </div>
|
|
<div class="line"><a id="l04867" name="l04867"></a><span class="lineno"> 4867</span> first_solution_decision_builders_[<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#a3fe8067f96051727ad3cdb085328f4e6">FirstSolutionStrategy::SAVINGS</a>] =</div>
|
|
<div class="line"><a id="l04868" name="l04868"></a><span class="lineno"> 4868</span> solver_->Try(savings_db,</div>
|
|
<div class="line"><a id="l04869" name="l04869"></a><span class="lineno"> 4869</span> solver_->RevAlloc(<span class="keyword">new</span> IntVarFilteredDecisionBuilder(</div>
|
|
<div class="line"><a id="l04870" name="l04870"></a><span class="lineno"> 4870</span> absl::make_unique<SequentialSavingsFilteredHeuristic>(</div>
|
|
<div class="line"><a id="l04871" name="l04871"></a><span class="lineno"> 4871</span> <span class="keyword">this</span>, &manager_, savings_parameters,</div>
|
|
<div class="line"><a id="l04872" name="l04872"></a><span class="lineno"> 4872</span> GetOrCreateStrongFeasibilityFilterManager(</div>
|
|
<div class="line"><a id="l04873" name="l04873"></a><span class="lineno"> 4873</span> search_parameters)))));</div>
|
|
<div class="line"><a id="l04874" name="l04874"></a><span class="lineno"> 4874</span> }</div>
|
|
<div class="line"><a id="l04875" name="l04875"></a><span class="lineno"> 4875</span> <span class="comment">// Sweep</span></div>
|
|
<div class="line"><a id="l04876" name="l04876"></a><span class="lineno"> 4876</span> first_solution_decision_builders_[<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#aca22eabfd47888ab251053351b3b20d5">FirstSolutionStrategy::SWEEP</a>] =</div>
|
|
<div class="line"><a id="l04877" name="l04877"></a><span class="lineno"> 4877</span> <a class="code hl_function" href="namespaceoperations__research.html#ab5b064a7895b1fc8084546441a57b46a">MakeSweepDecisionBuilder</a>(<span class="keyword">this</span>, <span class="keyword">true</span>);</div>
|
|
<div class="line"><a id="l04878" name="l04878"></a><span class="lineno"> 4878</span> DecisionBuilder* sweep_builder = <a class="code hl_function" href="namespaceoperations__research.html#ab5b064a7895b1fc8084546441a57b46a">MakeSweepDecisionBuilder</a>(<span class="keyword">this</span>, <span class="keyword">false</span>);</div>
|
|
<div class="line"><a id="l04879" name="l04879"></a><span class="lineno"> 4879</span> first_solution_decision_builders_[<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#aca22eabfd47888ab251053351b3b20d5">FirstSolutionStrategy::SWEEP</a>] =</div>
|
|
<div class="line"><a id="l04880" name="l04880"></a><span class="lineno"> 4880</span> solver_->Try(</div>
|
|
<div class="line"><a id="l04881" name="l04881"></a><span class="lineno"> 4881</span> sweep_builder,</div>
|
|
<div class="line"><a id="l04882" name="l04882"></a><span class="lineno"> 4882</span> first_solution_decision_builders_[<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#aca22eabfd47888ab251053351b3b20d5">FirstSolutionStrategy::SWEEP</a>]);</div>
|
|
<div class="line"><a id="l04883" name="l04883"></a><span class="lineno"> 4883</span> <span class="comment">// Christofides</span></div>
|
|
<div class="line"><a id="l04884" name="l04884"></a><span class="lineno"> 4884</span> first_solution_decision_builders_[<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#ab295f9b95b94beadfd87c99e057ec703">FirstSolutionStrategy::CHRISTOFIDES</a>] =</div>
|
|
<div class="line"><a id="l04885" name="l04885"></a><span class="lineno"> 4885</span> solver_->RevAlloc(<span class="keyword">new</span> IntVarFilteredDecisionBuilder(</div>
|
|
<div class="line"><a id="l04886" name="l04886"></a><span class="lineno"> 4886</span> absl::make_unique<ChristofidesFilteredHeuristic>(</div>
|
|
<div class="line"><a id="l04887" name="l04887"></a><span class="lineno"> 4887</span> <span class="keyword">this</span>, GetOrCreateFeasibilityFilterManager(search_parameters),</div>
|
|
<div class="line"><a id="l04888" name="l04888"></a><span class="lineno"> 4888</span> search_parameters.christofides_use_minimum_matching())));</div>
|
|
<div class="line"><a id="l04889" name="l04889"></a><span class="lineno"> 4889</span> <span class="comment">// Automatic</span></div>
|
|
<div class="line"><a id="l04890" name="l04890"></a><span class="lineno"> 4890</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> has_precedences = std::any_of(</div>
|
|
<div class="line"><a id="l04891" name="l04891"></a><span class="lineno"> 4891</span> dimensions_.begin(), dimensions_.end(),</div>
|
|
<div class="line"><a id="l04892" name="l04892"></a><span class="lineno"> 4892</span> [](<a class="code hl_friend" href="classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* dim) { return !dim->GetNodePrecedences().empty(); });</div>
|
|
<div class="line"><a id="l04893" name="l04893"></a><span class="lineno"> 4893</span> <span class="keywordtype">bool</span> has_single_vehicle_node = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l04894" name="l04894"></a><span class="lineno"> 4894</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> node = 0; node < <a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#a24926108b770033792d015cb86aeffb3">Size</a>(); node++) {</div>
|
|
<div class="line"><a id="l04895" name="l04895"></a><span class="lineno"> 4895</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a3582f01eabc65ba4b801215ca6420a7c">IsStart</a>(node) && !<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(node) && allowed_vehicles_[node].size() == 1) {</div>
|
|
<div class="line"><a id="l04896" name="l04896"></a><span class="lineno"> 4896</span> has_single_vehicle_node = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l04897" name="l04897"></a><span class="lineno"> 4897</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l04898" name="l04898"></a><span class="lineno"> 4898</span> }</div>
|
|
<div class="line"><a id="l04899" name="l04899"></a><span class="lineno"> 4899</span> }</div>
|
|
<div class="line"><a id="l04900" name="l04900"></a><span class="lineno"> 4900</span> automatic_first_solution_strategy_ =</div>
|
|
<div class="line"><a id="l04901" name="l04901"></a><span class="lineno"> 4901</span> <a class="code hl_function" href="namespaceoperations__research.html#a89152c6d7ca6a92ff106fe602c706816">AutomaticFirstSolutionStrategy</a>(!pickup_delivery_pairs_.empty(),</div>
|
|
<div class="line"><a id="l04902" name="l04902"></a><span class="lineno"> 4902</span> has_precedences, has_single_vehicle_node);</div>
|
|
<div class="line"><a id="l04903" name="l04903"></a><span class="lineno"> 4903</span> first_solution_decision_builders_[<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#a9af610cf53b13943acd6c4cb7be7c43c">FirstSolutionStrategy::AUTOMATIC</a>] =</div>
|
|
<div class="line"><a id="l04904" name="l04904"></a><span class="lineno"> 4904</span> first_solution_decision_builders_[automatic_first_solution_strategy_];</div>
|
|
<div class="line"><a id="l04905" name="l04905"></a><span class="lineno"> 4905</span> first_solution_decision_builders_[<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#ab0844c2ed1a1fa91a23f06ec2b96eaf4">FirstSolutionStrategy::UNSET</a>] =</div>
|
|
<div class="line"><a id="l04906" name="l04906"></a><span class="lineno"> 4906</span> first_solution_decision_builders_[<a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#a9af610cf53b13943acd6c4cb7be7c43c">FirstSolutionStrategy::AUTOMATIC</a>];</div>
|
|
<div class="line"><a id="l04907" name="l04907"></a><span class="lineno"> 4907</span>}</div>
|
|
<div class="line"><a id="l04908" name="l04908"></a><span class="lineno"> 4908</span> </div>
|
|
<div class="line"><a id="l04909" name="l04909"></a><span class="lineno"> 4909</span>DecisionBuilder* RoutingModel::GetFirstSolutionDecisionBuilder(</div>
|
|
<div class="line"><a id="l04910" name="l04910"></a><span class="lineno"> 4910</span> <span class="keyword">const</span> RoutingSearchParameters& search_parameters)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l04911" name="l04911"></a><span class="lineno"> 4911</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_first_solution_strategy.html#a31bc681b1d8ba03d79e0f08fd310e943">FirstSolutionStrategy::Value</a> first_solution_strategy =</div>
|
|
<div class="line"><a id="l04912" name="l04912"></a><span class="lineno"> 4912</span> search_parameters.first_solution_strategy();</div>
|
|
<div class="line"><a id="l04913" name="l04913"></a><span class="lineno"> 4913</span> <span class="keywordflow">if</span> (first_solution_strategy < first_solution_decision_builders_.size()) {</div>
|
|
<div class="line"><a id="l04914" name="l04914"></a><span class="lineno"> 4914</span> <span class="keywordflow">return</span> first_solution_decision_builders_[first_solution_strategy];</div>
|
|
<div class="line"><a id="l04915" name="l04915"></a><span class="lineno"> 4915</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l04916" name="l04916"></a><span class="lineno"> 4916</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l04917" name="l04917"></a><span class="lineno"> 4917</span> }</div>
|
|
<div class="line"><a id="l04918" name="l04918"></a><span class="lineno"> 4918</span>}</div>
|
|
<div class="line"><a id="l04919" name="l04919"></a><span class="lineno"> 4919</span> </div>
|
|
<div class="line"><a id="l04920" name="l04920"></a><span class="lineno"> 4920</span>IntVarFilteredDecisionBuilder*</div>
|
|
<div class="line"><a id="l04921" name="l04921"></a><span class="lineno"> 4921</span>RoutingModel::GetFilteredFirstSolutionDecisionBuilderOrNull(</div>
|
|
<div class="line"><a id="l04922" name="l04922"></a><span class="lineno"> 4922</span> <span class="keyword">const</span> RoutingSearchParameters& search_parameters)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l04923" name="l04923"></a><span class="lineno"> 4923</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_first_solution_strategy.html#a31bc681b1d8ba03d79e0f08fd310e943">FirstSolutionStrategy::Value</a> first_solution_strategy =</div>
|
|
<div class="line"><a id="l04924" name="l04924"></a><span class="lineno"> 4924</span> search_parameters.first_solution_strategy();</div>
|
|
<div class="line"><a id="l04925" name="l04925"></a><span class="lineno"> 4925</span> <span class="keywordflow">return</span> first_solution_filtered_decision_builders_[first_solution_strategy];</div>
|
|
<div class="line"><a id="l04926" name="l04926"></a><span class="lineno"> 4926</span>}</div>
|
|
<div class="line"><a id="l04927" name="l04927"></a><span class="lineno"> 4927</span> </div>
|
|
<div class="line"><a id="l04928" name="l04928"></a><span class="lineno"> 4928</span>LocalSearchPhaseParameters* RoutingModel::CreateLocalSearchParameters(</div>
|
|
<div class="line"><a id="l04929" name="l04929"></a><span class="lineno"> 4929</span> <span class="keyword">const</span> RoutingSearchParameters& search_parameters) {</div>
|
|
<div class="line"><a id="l04930" name="l04930"></a><span class="lineno"> 4930</span> SearchLimit* lns_limit = GetOrCreateLargeNeighborhoodSearchLimit();</div>
|
|
<div class="line"><a id="l04931" name="l04931"></a><span class="lineno"> 4931</span> <span class="keywordflow">return</span> solver_->MakeLocalSearchPhaseParameters(</div>
|
|
<div class="line"><a id="l04932" name="l04932"></a><span class="lineno"> 4932</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#abb61fc6939fecebe93387f63319d2b7f">CostVar</a>(), GetNeighborhoodOperators(search_parameters),</div>
|
|
<div class="line"><a id="l04933" name="l04933"></a><span class="lineno"> 4933</span> solver_->MakeSolveOnce(CreateSolutionFinalizer(lns_limit), lns_limit),</div>
|
|
<div class="line"><a id="l04934" name="l04934"></a><span class="lineno"> 4934</span> GetOrCreateLocalSearchLimit(),</div>
|
|
<div class="line"><a id="l04935" name="l04935"></a><span class="lineno"> 4935</span> GetOrCreateLocalSearchFilterManager(search_parameters));</div>
|
|
<div class="line"><a id="l04936" name="l04936"></a><span class="lineno"> 4936</span>}</div>
|
|
<div class="line"><a id="l04937" name="l04937"></a><span class="lineno"> 4937</span> </div>
|
|
<div class="line"><a id="l04938" name="l04938"></a><span class="lineno"> 4938</span>DecisionBuilder* RoutingModel::CreateLocalSearchDecisionBuilder(</div>
|
|
<div class="line"><a id="l04939" name="l04939"></a><span class="lineno"> 4939</span> <span class="keyword">const</span> RoutingSearchParameters& search_parameters) {</div>
|
|
<div class="line"><a id="l04940" name="l04940"></a><span class="lineno"> 4940</span> <span class="keyword">const</span> <span class="keywordtype">int</span> size = <a class="code hl_function" href="classoperations__research_1_1_routing_model_1_1_resource_group.html#a24926108b770033792d015cb86aeffb3">Size</a>();</div>
|
|
<div class="line"><a id="l04941" name="l04941"></a><span class="lineno"> 4941</span> DecisionBuilder* first_solution =</div>
|
|
<div class="line"><a id="l04942" name="l04942"></a><span class="lineno"> 4942</span> GetFirstSolutionDecisionBuilder(search_parameters);</div>
|
|
<div class="line"><a id="l04943" name="l04943"></a><span class="lineno"> 4943</span> LocalSearchPhaseParameters* <span class="keyword">const</span> <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a> =</div>
|
|
<div class="line"><a id="l04944" name="l04944"></a><span class="lineno"> 4944</span> CreateLocalSearchParameters(search_parameters);</div>
|
|
<div class="line"><a id="l04945" name="l04945"></a><span class="lineno"> 4945</span> SearchLimit* first_solution_lns_limit =</div>
|
|
<div class="line"><a id="l04946" name="l04946"></a><span class="lineno"> 4946</span> GetOrCreateFirstSolutionLargeNeighborhoodSearchLimit();</div>
|
|
<div class="line"><a id="l04947" name="l04947"></a><span class="lineno"> 4947</span> DecisionBuilder* <span class="keyword">const</span> first_solution_sub_decision_builder =</div>
|
|
<div class="line"><a id="l04948" name="l04948"></a><span class="lineno"> 4948</span> solver_->MakeSolveOnce(CreateSolutionFinalizer(first_solution_lns_limit),</div>
|
|
<div class="line"><a id="l04949" name="l04949"></a><span class="lineno"> 4949</span> first_solution_lns_limit);</div>
|
|
<div class="line"><a id="l04950" name="l04950"></a><span class="lineno"> 4950</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853">CostsAreHomogeneousAcrossVehicles</a>()) {</div>
|
|
<div class="line"><a id="l04951" name="l04951"></a><span class="lineno"> 4951</span> <span class="keywordflow">return</span> solver_->MakeLocalSearchPhase(nexts_, first_solution,</div>
|
|
<div class="line"><a id="l04952" name="l04952"></a><span class="lineno"> 4952</span> first_solution_sub_decision_builder,</div>
|
|
<div class="line"><a id="l04953" name="l04953"></a><span class="lineno"> 4953</span> <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>);</div>
|
|
<div class="line"><a id="l04954" name="l04954"></a><span class="lineno"> 4954</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l04955" name="l04955"></a><span class="lineno"> 4955</span> <span class="keyword">const</span> <span class="keywordtype">int</span> all_size = size + size + vehicles_;</div>
|
|
<div class="line"><a id="l04956" name="l04956"></a><span class="lineno"> 4956</span> std::vector<IntVar*> all_vars(all_size);</div>
|
|
<div class="line"><a id="l04957" name="l04957"></a><span class="lineno"> 4957</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < size; ++i) {</div>
|
|
<div class="line"><a id="l04958" name="l04958"></a><span class="lineno"> 4958</span> all_vars[i] = nexts_[i];</div>
|
|
<div class="line"><a id="l04959" name="l04959"></a><span class="lineno"> 4959</span> }</div>
|
|
<div class="line"><a id="l04960" name="l04960"></a><span class="lineno"> 4960</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = size; i < all_size; ++i) {</div>
|
|
<div class="line"><a id="l04961" name="l04961"></a><span class="lineno"> 4961</span> all_vars[i] = vehicle_vars_[i - size];</div>
|
|
<div class="line"><a id="l04962" name="l04962"></a><span class="lineno"> 4962</span> }</div>
|
|
<div class="line"><a id="l04963" name="l04963"></a><span class="lineno"> 4963</span> <span class="keywordflow">return</span> solver_->MakeLocalSearchPhase(all_vars, first_solution,</div>
|
|
<div class="line"><a id="l04964" name="l04964"></a><span class="lineno"> 4964</span> first_solution_sub_decision_builder,</div>
|
|
<div class="line"><a id="l04965" name="l04965"></a><span class="lineno"> 4965</span> <a class="code hl_variable" href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a>);</div>
|
|
<div class="line"><a id="l04966" name="l04966"></a><span class="lineno"> 4966</span> }</div>
|
|
<div class="line"><a id="l04967" name="l04967"></a><span class="lineno"> 4967</span>}</div>
|
|
<div class="line"><a id="l04968" name="l04968"></a><span class="lineno"> 4968</span> </div>
|
|
<div class="line"><a id="l04969" name="l04969"></a><span class="lineno"> 4969</span><span class="keywordtype">void</span> RoutingModel::SetupDecisionBuilders(</div>
|
|
<div class="line"><a id="l04970" name="l04970"></a><span class="lineno"> 4970</span> <span class="keyword">const</span> RoutingSearchParameters& search_parameters) {</div>
|
|
<div class="line"><a id="l04971" name="l04971"></a><span class="lineno"> 4971</span> <span class="keywordflow">if</span> (search_parameters.use_depth_first_search()) {</div>
|
|
<div class="line"><a id="l04972" name="l04972"></a><span class="lineno"> 4972</span> SearchLimit* first_lns_limit =</div>
|
|
<div class="line"><a id="l04973" name="l04973"></a><span class="lineno"> 4973</span> GetOrCreateFirstSolutionLargeNeighborhoodSearchLimit();</div>
|
|
<div class="line"><a id="l04974" name="l04974"></a><span class="lineno"> 4974</span> solve_db_ = solver_->Compose(</div>
|
|
<div class="line"><a id="l04975" name="l04975"></a><span class="lineno"> 4975</span> GetFirstSolutionDecisionBuilder(search_parameters),</div>
|
|
<div class="line"><a id="l04976" name="l04976"></a><span class="lineno"> 4976</span> solver_->MakeSolveOnce(CreateSolutionFinalizer(first_lns_limit),</div>
|
|
<div class="line"><a id="l04977" name="l04977"></a><span class="lineno"> 4977</span> first_lns_limit));</div>
|
|
<div class="line"><a id="l04978" name="l04978"></a><span class="lineno"> 4978</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l04979" name="l04979"></a><span class="lineno"> 4979</span> solve_db_ = CreateLocalSearchDecisionBuilder(search_parameters);</div>
|
|
<div class="line"><a id="l04980" name="l04980"></a><span class="lineno"> 4980</span> }</div>
|
|
<div class="line"><a id="l04981" name="l04981"></a><span class="lineno"> 4981</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(preassignment_ != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l04982" name="l04982"></a><span class="lineno"> 4982</span> DecisionBuilder* restore_preassignment =</div>
|
|
<div class="line"><a id="l04983" name="l04983"></a><span class="lineno"> 4983</span> solver_->MakeRestoreAssignment(preassignment_);</div>
|
|
<div class="line"><a id="l04984" name="l04984"></a><span class="lineno"> 4984</span> solve_db_ = solver_->Compose(restore_preassignment, solve_db_);</div>
|
|
<div class="line"><a id="l04985" name="l04985"></a><span class="lineno"> 4985</span> improve_db_ =</div>
|
|
<div class="line"><a id="l04986" name="l04986"></a><span class="lineno"> 4986</span> solver_->Compose(restore_preassignment,</div>
|
|
<div class="line"><a id="l04987" name="l04987"></a><span class="lineno"> 4987</span> solver_->MakeLocalSearchPhase(</div>
|
|
<div class="line"><a id="l04988" name="l04988"></a><span class="lineno"> 4988</span> GetOrCreateAssignment(),</div>
|
|
<div class="line"><a id="l04989" name="l04989"></a><span class="lineno"> 4989</span> CreateLocalSearchParameters(search_parameters)));</div>
|
|
<div class="line"><a id="l04990" name="l04990"></a><span class="lineno"> 4990</span> restore_assignment_ = solver_->Compose(</div>
|
|
<div class="line"><a id="l04991" name="l04991"></a><span class="lineno"> 4991</span> solver_->MakeRestoreAssignment(GetOrCreateAssignment()),</div>
|
|
<div class="line"><a id="l04992" name="l04992"></a><span class="lineno"> 4992</span> CreateSolutionFinalizer(GetOrCreateLargeNeighborhoodSearchLimit()));</div>
|
|
<div class="line"><a id="l04993" name="l04993"></a><span class="lineno"> 4993</span> restore_tmp_assignment_ = solver_->Compose(</div>
|
|
<div class="line"><a id="l04994" name="l04994"></a><span class="lineno"> 4994</span> restore_preassignment,</div>
|
|
<div class="line"><a id="l04995" name="l04995"></a><span class="lineno"> 4995</span> solver_->MakeRestoreAssignment(GetOrCreateTmpAssignment()),</div>
|
|
<div class="line"><a id="l04996" name="l04996"></a><span class="lineno"> 4996</span> CreateSolutionFinalizer(GetOrCreateLargeNeighborhoodSearchLimit()));</div>
|
|
<div class="line"><a id="l04997" name="l04997"></a><span class="lineno"> 4997</span>}</div>
|
|
<div class="line"><a id="l04998" name="l04998"></a><span class="lineno"> 4998</span> </div>
|
|
<div class="line"><a id="l04999" name="l04999"></a><span class="lineno"> 4999</span><span class="keywordtype">void</span> RoutingModel::SetupMetaheuristics(</div>
|
|
<div class="line"><a id="l05000" name="l05000"></a><span class="lineno"> 5000</span> <span class="keyword">const</span> RoutingSearchParameters& search_parameters) {</div>
|
|
<div class="line"><a id="l05001" name="l05001"></a><span class="lineno"> 5001</span> SearchMonitor* optimize;</div>
|
|
<div class="line"><a id="l05002" name="l05002"></a><span class="lineno"> 5002</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_local_search_metaheuristic.html#aa04540e46b556c56082408cda31fd514">LocalSearchMetaheuristic::Value</a> metaheuristic =</div>
|
|
<div class="line"><a id="l05003" name="l05003"></a><span class="lineno"> 5003</span> search_parameters.local_search_metaheuristic();</div>
|
|
<div class="line"><a id="l05004" name="l05004"></a><span class="lineno"> 5004</span> <span class="comment">// Some metaheuristics will effectively never terminate; warn</span></div>
|
|
<div class="line"><a id="l05005" name="l05005"></a><span class="lineno"> 5005</span> <span class="comment">// user if they fail to set a time limit.</span></div>
|
|
<div class="line"><a id="l05006" name="l05006"></a><span class="lineno"> 5006</span> <span class="keywordtype">bool</span> limit_too_long =</div>
|
|
<div class="line"><a id="l05007" name="l05007"></a><span class="lineno"> 5007</span> !search_parameters.has_time_limit() &&</div>
|
|
<div class="line"><a id="l05008" name="l05008"></a><span class="lineno"> 5008</span> search_parameters.solution_limit() == <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>();</div>
|
|
<div class="line"><a id="l05009" name="l05009"></a><span class="lineno"> 5009</span> <span class="keyword">const</span> int64_t optimization_step = <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(</div>
|
|
<div class="line"><a id="l05010" name="l05010"></a><span class="lineno"> 5010</span> <a class="code hl_function" href="classoperations__research_1_1_math_util.html#a55fc8a3af7c2526c83e83586cd578d89">MathUtil::FastInt64Round</a>(search_parameters.optimization_step()), <a class="code hl_function" href="namespaceoperations__research.html#a9e48359348ad94d97e6c44ffd52b33e3">One</a>());</div>
|
|
<div class="line"><a id="l05011" name="l05011"></a><span class="lineno"> 5011</span> <span class="keywordflow">switch</span> (metaheuristic) {</div>
|
|
<div class="line"><a id="l05012" name="l05012"></a><span class="lineno"> 5012</span> <span class="keywordflow">case</span> <a class="code hl_variable" href="classoperations__research_1_1_local_search_metaheuristic.html#a3efed50baf4fb5d0fd2434c3c7f0b586">LocalSearchMetaheuristic::GUIDED_LOCAL_SEARCH</a>:</div>
|
|
<div class="line"><a id="l05013" name="l05013"></a><span class="lineno"> 5013</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853">CostsAreHomogeneousAcrossVehicles</a>()) {</div>
|
|
<div class="line"><a id="l05014" name="l05014"></a><span class="lineno"> 5014</span> optimize = solver_->MakeGuidedLocalSearch(</div>
|
|
<div class="line"><a id="l05015" name="l05015"></a><span class="lineno"> 5015</span> <span class="keyword">false</span>, cost_,</div>
|
|
<div class="line"><a id="l05016" name="l05016"></a><span class="lineno"> 5016</span> [<span class="keyword">this</span>](int64_t i, int64_t j) { <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a51b526b532fc95cfed13d54ed2d6db95">GetHomogeneousCost</a>(i, j); },</div>
|
|
<div class="line"><a id="l05017" name="l05017"></a><span class="lineno"> 5017</span> optimization_step, nexts_,</div>
|
|
<div class="line"><a id="l05018" name="l05018"></a><span class="lineno"> 5018</span> search_parameters.guided_local_search_lambda_coefficient());</div>
|
|
<div class="line"><a id="l05019" name="l05019"></a><span class="lineno"> 5019</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l05020" name="l05020"></a><span class="lineno"> 5020</span> optimize = solver_->MakeGuidedLocalSearch(</div>
|
|
<div class="line"><a id="l05021" name="l05021"></a><span class="lineno"> 5021</span> <span class="keyword">false</span>, cost_,</div>
|
|
<div class="line"><a id="l05022" name="l05022"></a><span class="lineno"> 5022</span> [<span class="keyword">this</span>](int64_t i, int64_t j, int64_t k) {</div>
|
|
<div class="line"><a id="l05023" name="l05023"></a><span class="lineno"> 5023</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8174e01c9a66c00a87cdbe86ccd3655c">GetArcCostForVehicle</a>(i, j, k);</div>
|
|
<div class="line"><a id="l05024" name="l05024"></a><span class="lineno"> 5024</span> },</div>
|
|
<div class="line"><a id="l05025" name="l05025"></a><span class="lineno"> 5025</span> optimization_step, nexts_, vehicle_vars_,</div>
|
|
<div class="line"><a id="l05026" name="l05026"></a><span class="lineno"> 5026</span> search_parameters.guided_local_search_lambda_coefficient());</div>
|
|
<div class="line"><a id="l05027" name="l05027"></a><span class="lineno"> 5027</span> }</div>
|
|
<div class="line"><a id="l05028" name="l05028"></a><span class="lineno"> 5028</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l05029" name="l05029"></a><span class="lineno"> 5029</span> <span class="keywordflow">case</span> <a class="code hl_variable" href="classoperations__research_1_1_local_search_metaheuristic.html#a04f2564a49d86fca19f1f00379927756">LocalSearchMetaheuristic::SIMULATED_ANNEALING</a>:</div>
|
|
<div class="line"><a id="l05030" name="l05030"></a><span class="lineno"> 5030</span> optimize =</div>
|
|
<div class="line"><a id="l05031" name="l05031"></a><span class="lineno"> 5031</span> solver_->MakeSimulatedAnnealing(<span class="keyword">false</span>, cost_, optimization_step, 100);</div>
|
|
<div class="line"><a id="l05032" name="l05032"></a><span class="lineno"> 5032</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l05033" name="l05033"></a><span class="lineno"> 5033</span> <span class="keywordflow">case</span> <a class="code hl_variable" href="classoperations__research_1_1_local_search_metaheuristic.html#a39bb4fe872d4536162c79c5b85d647f6">LocalSearchMetaheuristic::TABU_SEARCH</a>:</div>
|
|
<div class="line"><a id="l05034" name="l05034"></a><span class="lineno"> 5034</span> optimize = solver_->MakeTabuSearch(<span class="keyword">false</span>, cost_, optimization_step,</div>
|
|
<div class="line"><a id="l05035" name="l05035"></a><span class="lineno"> 5035</span> nexts_, 10, 10, .8);</div>
|
|
<div class="line"><a id="l05036" name="l05036"></a><span class="lineno"> 5036</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l05037" name="l05037"></a><span class="lineno"> 5037</span> <span class="keywordflow">case</span> <a class="code hl_variable" href="classoperations__research_1_1_local_search_metaheuristic.html#a689551414de01c3e0b5483bafc4f8877">LocalSearchMetaheuristic::GENERIC_TABU_SEARCH</a>: {</div>
|
|
<div class="line"><a id="l05038" name="l05038"></a><span class="lineno"> 5038</span> std::vector<operations_research::IntVar*> tabu_vars;</div>
|
|
<div class="line"><a id="l05039" name="l05039"></a><span class="lineno"> 5039</span> <span class="keywordflow">if</span> (tabu_var_callback_) {</div>
|
|
<div class="line"><a id="l05040" name="l05040"></a><span class="lineno"> 5040</span> tabu_vars = tabu_var_callback_(<span class="keyword">this</span>);</div>
|
|
<div class="line"><a id="l05041" name="l05041"></a><span class="lineno"> 5041</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l05042" name="l05042"></a><span class="lineno"> 5042</span> tabu_vars.push_back(cost_);</div>
|
|
<div class="line"><a id="l05043" name="l05043"></a><span class="lineno"> 5043</span> }</div>
|
|
<div class="line"><a id="l05044" name="l05044"></a><span class="lineno"> 5044</span> optimize = solver_->MakeGenericTabuSearch(<span class="keyword">false</span>, cost_, optimization_step,</div>
|
|
<div class="line"><a id="l05045" name="l05045"></a><span class="lineno"> 5045</span> tabu_vars, 100);</div>
|
|
<div class="line"><a id="l05046" name="l05046"></a><span class="lineno"> 5046</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l05047" name="l05047"></a><span class="lineno"> 5047</span> }</div>
|
|
<div class="line"><a id="l05048" name="l05048"></a><span class="lineno"> 5048</span> <span class="keywordflow">default</span>:</div>
|
|
<div class="line"><a id="l05049" name="l05049"></a><span class="lineno"> 5049</span> limit_too_long = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l05050" name="l05050"></a><span class="lineno"> 5050</span> optimize = solver_->MakeMinimize(cost_, optimization_step);</div>
|
|
<div class="line"><a id="l05051" name="l05051"></a><span class="lineno"> 5051</span> }</div>
|
|
<div class="line"><a id="l05052" name="l05052"></a><span class="lineno"> 5052</span> <span class="keywordflow">if</span> (limit_too_long) {</div>
|
|
<div class="line"><a id="l05053" name="l05053"></a><span class="lineno"> 5053</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7">WARNING</a>) << <a class="code hl_function" href="classoperations__research_1_1_local_search_metaheuristic.html#adc4a0aa5c9965a51b9e07be9c1e328a1">LocalSearchMetaheuristic::Value_Name</a>(metaheuristic)</div>
|
|
<div class="line"><a id="l05054" name="l05054"></a><span class="lineno"> 5054</span> << <span class="stringliteral">" specified without sane timeout: solve may run forever."</span>;</div>
|
|
<div class="line"><a id="l05055" name="l05055"></a><span class="lineno"> 5055</span> }</div>
|
|
<div class="line"><a id="l05056" name="l05056"></a><span class="lineno"> 5056</span> monitors_.push_back(optimize);</div>
|
|
<div class="line"><a id="l05057" name="l05057"></a><span class="lineno"> 5057</span>}</div>
|
|
<div class="line"><a id="l05058" name="l05058"></a><span class="lineno"> 5058</span> </div>
|
|
<div class="line"><a id="l05059" name="l05059"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a7e2d405cde11bc4a08d752d0e669912c"> 5059</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a7e2d405cde11bc4a08d752d0e669912c">RoutingModel::SetTabuVarsCallback</a>(<a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a0e106a97f0156868f1d1c741b283793e">GetTabuVarsCallback</a> tabu_var_callback) {</div>
|
|
<div class="line"><a id="l05060" name="l05060"></a><span class="lineno"> 5060</span> tabu_var_callback_ = std::move(tabu_var_callback);</div>
|
|
<div class="line"><a id="l05061" name="l05061"></a><span class="lineno"> 5061</span>}</div>
|
|
<div class="line"><a id="l05062" name="l05062"></a><span class="lineno"> 5062</span> </div>
|
|
<div class="line"><a id="l05063" name="l05063"></a><span class="lineno"> 5063</span><span class="keywordtype">void</span> RoutingModel::SetupAssignmentCollector(</div>
|
|
<div class="line"><a id="l05064" name="l05064"></a><span class="lineno"> 5064</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_search_parameters.html">RoutingSearchParameters</a>& search_parameters) {</div>
|
|
<div class="line"><a id="l05065" name="l05065"></a><span class="lineno"> 5065</span> <a class="code hl_class" href="classoperations__research_1_1_assignment.html">Assignment</a>* full_assignment = solver_->MakeAssignment();</div>
|
|
<div class="line"><a id="l05066" name="l05066"></a><span class="lineno"> 5066</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* <span class="keyword">const</span> dimension : dimensions_) {</div>
|
|
<div class="line"><a id="l05067" name="l05067"></a><span class="lineno"> 5067</span> full_assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb">Add</a>(dimension->cumuls());</div>
|
|
<div class="line"><a id="l05068" name="l05068"></a><span class="lineno"> 5068</span> }</div>
|
|
<div class="line"><a id="l05069" name="l05069"></a><span class="lineno"> 5069</span> <span class="keywordflow">for</span> (IntVar* <span class="keyword">const</span> extra_var : extra_vars_) {</div>
|
|
<div class="line"><a id="l05070" name="l05070"></a><span class="lineno"> 5070</span> full_assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb">Add</a>(extra_var);</div>
|
|
<div class="line"><a id="l05071" name="l05071"></a><span class="lineno"> 5071</span> }</div>
|
|
<div class="line"><a id="l05072" name="l05072"></a><span class="lineno"> 5072</span> <span class="keywordflow">for</span> (IntervalVar* <span class="keyword">const</span> extra_interval : extra_intervals_) {</div>
|
|
<div class="line"><a id="l05073" name="l05073"></a><span class="lineno"> 5073</span> full_assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb">Add</a>(extra_interval);</div>
|
|
<div class="line"><a id="l05074" name="l05074"></a><span class="lineno"> 5074</span> }</div>
|
|
<div class="line"><a id="l05075" name="l05075"></a><span class="lineno"> 5075</span> full_assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb">Add</a>(nexts_);</div>
|
|
<div class="line"><a id="l05076" name="l05076"></a><span class="lineno"> 5076</span> full_assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb">Add</a>(active_);</div>
|
|
<div class="line"><a id="l05077" name="l05077"></a><span class="lineno"> 5077</span> full_assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb">Add</a>(vehicle_vars_);</div>
|
|
<div class="line"><a id="l05078" name="l05078"></a><span class="lineno"> 5078</span> full_assignment-><a class="code hl_function" href="classoperations__research_1_1_assignment.html#a86601a2dad7a051d7b387ffa789898ff">AddObjective</a>(cost_);</div>
|
|
<div class="line"><a id="l05079" name="l05079"></a><span class="lineno"> 5079</span> </div>
|
|
<div class="line"><a id="l05080" name="l05080"></a><span class="lineno"> 5080</span> collect_assignments_ = solver_->MakeNBestValueSolutionCollector(</div>
|
|
<div class="line"><a id="l05081" name="l05081"></a><span class="lineno"> 5081</span> full_assignment, search_parameters.<a class="code hl_function" href="classoperations__research_1_1_routing_search_parameters.html#a2a0fd7ce08b3bdbcffa69f132fb4b963">number_of_solutions_to_collect</a>(),</div>
|
|
<div class="line"><a id="l05082" name="l05082"></a><span class="lineno"> 5082</span> <span class="keyword">false</span>);</div>
|
|
<div class="line"><a id="l05083" name="l05083"></a><span class="lineno"> 5083</span> collect_one_assignment_ =</div>
|
|
<div class="line"><a id="l05084" name="l05084"></a><span class="lineno"> 5084</span> solver_->MakeFirstSolutionCollector(full_assignment);</div>
|
|
<div class="line"><a id="l05085" name="l05085"></a><span class="lineno"> 5085</span> monitors_.push_back(collect_assignments_);</div>
|
|
<div class="line"><a id="l05086" name="l05086"></a><span class="lineno"> 5086</span>}</div>
|
|
<div class="line"><a id="l05087" name="l05087"></a><span class="lineno"> 5087</span> </div>
|
|
<div class="line"><a id="l05088" name="l05088"></a><span class="lineno"> 5088</span><span class="keywordtype">void</span> RoutingModel::SetupTrace(</div>
|
|
<div class="line"><a id="l05089" name="l05089"></a><span class="lineno"> 5089</span> <span class="keyword">const</span> RoutingSearchParameters& search_parameters) {</div>
|
|
<div class="line"><a id="l05090" name="l05090"></a><span class="lineno"> 5090</span> <span class="keywordflow">if</span> (search_parameters.log_search()) {</div>
|
|
<div class="line"><a id="l05091" name="l05091"></a><span class="lineno"> 5091</span> Solver::SearchLogParameters search_log_parameters;</div>
|
|
<div class="line"><a id="l05092" name="l05092"></a><span class="lineno"> 5092</span> search_log_parameters.branch_period = 10000;</div>
|
|
<div class="line"><a id="l05093" name="l05093"></a><span class="lineno"> 5093</span> search_log_parameters.objective = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l05094" name="l05094"></a><span class="lineno"> 5094</span> search_log_parameters.variable = cost_;</div>
|
|
<div class="line"><a id="l05095" name="l05095"></a><span class="lineno"> 5095</span> search_log_parameters.scaling_factor =</div>
|
|
<div class="line"><a id="l05096" name="l05096"></a><span class="lineno"> 5096</span> search_parameters.log_cost_scaling_factor();</div>
|
|
<div class="line"><a id="l05097" name="l05097"></a><span class="lineno"> 5097</span> search_log_parameters.offset = search_parameters.log_cost_offset();</div>
|
|
<div class="line"><a id="l05098" name="l05098"></a><span class="lineno"> 5098</span> <span class="keywordflow">if</span> (!search_parameters.log_tag().empty()) {</div>
|
|
<div class="line"><a id="l05099" name="l05099"></a><span class="lineno"> 5099</span> <span class="keyword">const</span> std::string& tag = search_parameters.log_tag();</div>
|
|
<div class="line"><a id="l05100" name="l05100"></a><span class="lineno"> 5100</span> search_log_parameters.display_callback = [tag]() { <span class="keywordflow">return</span> tag; };</div>
|
|
<div class="line"><a id="l05101" name="l05101"></a><span class="lineno"> 5101</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l05102" name="l05102"></a><span class="lineno"> 5102</span> search_log_parameters.display_callback = <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l05103" name="l05103"></a><span class="lineno"> 5103</span> }</div>
|
|
<div class="line"><a id="l05104" name="l05104"></a><span class="lineno"> 5104</span> search_log_parameters.display_on_new_solutions_only = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l05105" name="l05105"></a><span class="lineno"> 5105</span> monitors_.push_back(solver_->MakeSearchLog(search_log_parameters));</div>
|
|
<div class="line"><a id="l05106" name="l05106"></a><span class="lineno"> 5106</span> }</div>
|
|
<div class="line"><a id="l05107" name="l05107"></a><span class="lineno"> 5107</span>}</div>
|
|
<div class="line"><a id="l05108" name="l05108"></a><span class="lineno"> 5108</span> </div>
|
|
<div class="line"><a id="l05109" name="l05109"></a><span class="lineno"> 5109</span><span class="keywordtype">void</span> RoutingModel::SetupImprovementLimit(</div>
|
|
<div class="line"><a id="l05110" name="l05110"></a><span class="lineno"> 5110</span> <span class="keyword">const</span> RoutingSearchParameters& search_parameters) {</div>
|
|
<div class="line"><a id="l05111" name="l05111"></a><span class="lineno"> 5111</span> <span class="keywordflow">if</span> (search_parameters.has_improvement_limit_parameters()) {</div>
|
|
<div class="line"><a id="l05112" name="l05112"></a><span class="lineno"> 5112</span> monitors_.push_back(solver_->MakeImprovementLimit(</div>
|
|
<div class="line"><a id="l05113" name="l05113"></a><span class="lineno"> 5113</span> cost_, <span class="comment">/*maximize=*/</span><span class="keyword">false</span>, search_parameters.log_cost_scaling_factor(),</div>
|
|
<div class="line"><a id="l05114" name="l05114"></a><span class="lineno"> 5114</span> search_parameters.log_cost_offset(),</div>
|
|
<div class="line"><a id="l05115" name="l05115"></a><span class="lineno"> 5115</span> search_parameters.improvement_limit_parameters()</div>
|
|
<div class="line"><a id="l05116" name="l05116"></a><span class="lineno"> 5116</span> .improvement_rate_coefficient(),</div>
|
|
<div class="line"><a id="l05117" name="l05117"></a><span class="lineno"> 5117</span> search_parameters.improvement_limit_parameters()</div>
|
|
<div class="line"><a id="l05118" name="l05118"></a><span class="lineno"> 5118</span> .improvement_rate_solutions_distance()));</div>
|
|
<div class="line"><a id="l05119" name="l05119"></a><span class="lineno"> 5119</span> }</div>
|
|
<div class="line"><a id="l05120" name="l05120"></a><span class="lineno"> 5120</span>}</div>
|
|
<div class="line"><a id="l05121" name="l05121"></a><span class="lineno"> 5121</span> </div>
|
|
<div class="line"><a id="l05122" name="l05122"></a><span class="lineno"> 5122</span><span class="keywordtype">void</span> RoutingModel::SetupSearchMonitors(</div>
|
|
<div class="line"><a id="l05123" name="l05123"></a><span class="lineno"> 5123</span> <span class="keyword">const</span> RoutingSearchParameters& search_parameters) {</div>
|
|
<div class="line"><a id="l05124" name="l05124"></a><span class="lineno"> 5124</span> monitors_.push_back(GetOrCreateLimit());</div>
|
|
<div class="line"><a id="l05125" name="l05125"></a><span class="lineno"> 5125</span> SetupImprovementLimit(search_parameters);</div>
|
|
<div class="line"><a id="l05126" name="l05126"></a><span class="lineno"> 5126</span> SetupMetaheuristics(search_parameters);</div>
|
|
<div class="line"><a id="l05127" name="l05127"></a><span class="lineno"> 5127</span> SetupAssignmentCollector(search_parameters);</div>
|
|
<div class="line"><a id="l05128" name="l05128"></a><span class="lineno"> 5128</span> SetupTrace(search_parameters);</div>
|
|
<div class="line"><a id="l05129" name="l05129"></a><span class="lineno"> 5129</span>}</div>
|
|
<div class="line"><a id="l05130" name="l05130"></a><span class="lineno"> 5130</span> </div>
|
|
<div class="line"><a id="l05131" name="l05131"></a><span class="lineno"> 5131</span><span class="keywordtype">bool</span> RoutingModel::UsesLightPropagation(</div>
|
|
<div class="line"><a id="l05132" name="l05132"></a><span class="lineno"> 5132</span> <span class="keyword">const</span> RoutingSearchParameters& search_parameters)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l05133" name="l05133"></a><span class="lineno"> 5133</span> <span class="keywordflow">return</span> !search_parameters.use_full_propagation() &&</div>
|
|
<div class="line"><a id="l05134" name="l05134"></a><span class="lineno"> 5134</span> !search_parameters.use_depth_first_search() &&</div>
|
|
<div class="line"><a id="l05135" name="l05135"></a><span class="lineno"> 5135</span> search_parameters.first_solution_strategy() !=</div>
|
|
<div class="line"><a id="l05136" name="l05136"></a><span class="lineno"> 5136</span> <a class="code hl_variable" href="classoperations__research_1_1_first_solution_strategy.html#a4aa7531a8f305562e8db414b076c2547">FirstSolutionStrategy::FIRST_UNBOUND_MIN_VALUE</a>;</div>
|
|
<div class="line"><a id="l05137" name="l05137"></a><span class="lineno"> 5137</span>}</div>
|
|
<div class="line"><a id="l05138" name="l05138"></a><span class="lineno"> 5138</span> </div>
|
|
<div class="line"><a id="l05139" name="l05139"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#ab81fff41f3dde630902e1c4e2f534732"> 5139</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab81fff41f3dde630902e1c4e2f534732">RoutingModel::AddWeightedVariableMinimizedByFinalizer</a>(<a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>,</div>
|
|
<div class="line"><a id="l05140" name="l05140"></a><span class="lineno"> 5140</span> int64_t <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a>) {</div>
|
|
<div class="line"><a id="l05141" name="l05141"></a><span class="lineno"> 5141</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l05142" name="l05142"></a><span class="lineno"> 5142</span> <span class="keyword">const</span> <span class="keywordtype">int</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> = <a class="code hl_function" href="namespacegtl.html#a523b266127b26ec3817cae4c5f41c391">gtl::LookupOrInsert</a>(&finalizer_variable_cost_index_, <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>,</div>
|
|
<div class="line"><a id="l05143" name="l05143"></a><span class="lineno"> 5143</span> finalizer_variable_cost_pairs_.size());</div>
|
|
<div class="line"><a id="l05144" name="l05144"></a><span class="lineno"> 5144</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < finalizer_variable_cost_pairs_.size()) {</div>
|
|
<div class="line"><a id="l05145" name="l05145"></a><span class="lineno"> 5145</span> <span class="keyword">const</span> int64_t old_cost = finalizer_variable_cost_pairs_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].second;</div>
|
|
<div class="line"><a id="l05146" name="l05146"></a><span class="lineno"> 5146</span> finalizer_variable_cost_pairs_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].second = <a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(old_cost, <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a>);</div>
|
|
<div class="line"><a id="l05147" name="l05147"></a><span class="lineno"> 5147</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l05148" name="l05148"></a><span class="lineno"> 5148</span> finalizer_variable_cost_pairs_.emplace_back(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a>);</div>
|
|
<div class="line"><a id="l05149" name="l05149"></a><span class="lineno"> 5149</span> }</div>
|
|
<div class="line"><a id="l05150" name="l05150"></a><span class="lineno"> 5150</span>}</div>
|
|
<div class="line"><a id="l05151" name="l05151"></a><span class="lineno"> 5151</span> </div>
|
|
<div class="line"><a id="l05152" name="l05152"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a8fc98154baec00fd3be88c9d6a0234dc"> 5152</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8fc98154baec00fd3be88c9d6a0234dc">RoutingModel::AddVariableTargetToFinalizer</a>(<a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, int64_t target) {</div>
|
|
<div class="line"><a id="l05153" name="l05153"></a><span class="lineno"> 5153</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a> != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l05154" name="l05154"></a><span class="lineno"> 5154</span> <span class="keywordflow">if</span> (finalizer_variable_target_set_.contains(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>)) <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l05155" name="l05155"></a><span class="lineno"> 5155</span> finalizer_variable_target_set_.insert(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
|
|
<div class="line"><a id="l05156" name="l05156"></a><span class="lineno"> 5156</span> finalizer_variable_target_pairs_.emplace_back(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, target);</div>
|
|
<div class="line"><a id="l05157" name="l05157"></a><span class="lineno"> 5157</span>}</div>
|
|
<div class="line"><a id="l05158" name="l05158"></a><span class="lineno"> 5158</span> </div>
|
|
<div class="line"><a id="l05159" name="l05159"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#aabdcf3bd412a5a61d811ef85e115e5ff"> 5159</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aabdcf3bd412a5a61d811ef85e115e5ff">RoutingModel::AddVariableMaximizedByFinalizer</a>(<a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) {</div>
|
|
<div class="line"><a id="l05160" name="l05160"></a><span class="lineno"> 5160</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8fc98154baec00fd3be88c9d6a0234dc">AddVariableTargetToFinalizer</a>(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>());</div>
|
|
<div class="line"><a id="l05161" name="l05161"></a><span class="lineno"> 5161</span>}</div>
|
|
<div class="line"><a id="l05162" name="l05162"></a><span class="lineno"> 5162</span> </div>
|
|
<div class="line"><a id="l05163" name="l05163"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a4768ba91c34c542eddec212a68d79473"> 5163</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a4768ba91c34c542eddec212a68d79473">RoutingModel::AddVariableMinimizedByFinalizer</a>(<a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) {</div>
|
|
<div class="line"><a id="l05164" name="l05164"></a><span class="lineno"> 5164</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8fc98154baec00fd3be88c9d6a0234dc">AddVariableTargetToFinalizer</a>(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>, <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits<int64_t>::min</a>());</div>
|
|
<div class="line"><a id="l05165" name="l05165"></a><span class="lineno"> 5165</span>}</div>
|
|
<div class="line"><a id="l05166" name="l05166"></a><span class="lineno"> 5166</span> </div>
|
|
<div class="line"><a id="l05167" name="l05167"></a><span class="lineno"> 5167</span><span class="keywordtype">void</span> RoutingModel::SetupSearch(</div>
|
|
<div class="line"><a id="l05168" name="l05168"></a><span class="lineno"> 5168</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_search_parameters.html">RoutingSearchParameters</a>& search_parameters) {</div>
|
|
<div class="line"><a id="l05169" name="l05169"></a><span class="lineno"> 5169</span> SetupDecisionBuilders(search_parameters);</div>
|
|
<div class="line"><a id="l05170" name="l05170"></a><span class="lineno"> 5170</span> SetupSearchMonitors(search_parameters);</div>
|
|
<div class="line"><a id="l05171" name="l05171"></a><span class="lineno"> 5171</span>}</div>
|
|
<div class="line"><a id="l05172" name="l05172"></a><span class="lineno"> 5172</span> </div>
|
|
<div class="line"><a id="l05173" name="l05173"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a437ae499bef0aa64f2753166a000f5bd"> 5173</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a437ae499bef0aa64f2753166a000f5bd">RoutingModel::AddToAssignment</a>(<a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> <a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>) {</div>
|
|
<div class="line"><a id="l05174" name="l05174"></a><span class="lineno"> 5174</span> extra_vars_.push_back(<a class="code hl_variable" href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a>);</div>
|
|
<div class="line"><a id="l05175" name="l05175"></a><span class="lineno"> 5175</span>}</div>
|
|
<div class="line"><a id="l05176" name="l05176"></a><span class="lineno"> 5176</span> </div>
|
|
<div class="line"><a id="l05177" name="l05177"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#ab878a81ace850e3ecd26e95966409f61"> 5177</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab878a81ace850e3ecd26e95966409f61">RoutingModel::AddIntervalToAssignment</a>(<a class="code hl_class" href="classoperations__research_1_1_interval_var.html">IntervalVar</a>* <span class="keyword">const</span> <a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>) {</div>
|
|
<div class="line"><a id="l05178" name="l05178"></a><span class="lineno"> 5178</span> extra_intervals_.push_back(<a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>);</div>
|
|
<div class="line"><a id="l05179" name="l05179"></a><span class="lineno"> 5179</span>}</div>
|
|
<div class="line"><a id="l05180" name="l05180"></a><span class="lineno"> 5180</span> </div>
|
|
<div class="line"><a id="l05181" name="l05181"></a><span class="lineno"> 5181</span><span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a id="l05182" name="l05182"></a><span class="lineno"> 5182</span> </div>
|
|
<div class="line"><a id="l05183" name="l05183"></a><span class="lineno"> 5183</span><span class="keyword">class </span>PathSpansAndTotalSlacks : <span class="keyword">public</span> <a class="code hl_class" href="classoperations__research_1_1_constraint.html">Constraint</a> {</div>
|
|
<div class="line"><a id="l05184" name="l05184"></a><span class="lineno"> 5184</span> <span class="keyword">public</span>:</div>
|
|
<div class="line"><a id="l05185" name="l05185"></a><span class="lineno"> 5185</span> PathSpansAndTotalSlacks(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_model.html">RoutingModel</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>,</div>
|
|
<div class="line"><a id="l05186" name="l05186"></a><span class="lineno"> 5186</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* dimension,</div>
|
|
<div class="line"><a id="l05187" name="l05187"></a><span class="lineno"> 5187</span> std::vector<IntVar*> spans,</div>
|
|
<div class="line"><a id="l05188" name="l05188"></a><span class="lineno"> 5188</span> std::vector<IntVar*> total_slacks)</div>
|
|
<div class="line"><a id="l05189" name="l05189"></a><span class="lineno"> 5189</span> : <a class="code hl_class" href="classoperations__research_1_1_constraint.html">Constraint</a>(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>()),</div>
|
|
<div class="line"><a id="l05190" name="l05190"></a><span class="lineno"> 5190</span> model_(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>),</div>
|
|
<div class="line"><a id="l05191" name="l05191"></a><span class="lineno"> 5191</span> dimension_(dimension),</div>
|
|
<div class="line"><a id="l05192" name="l05192"></a><span class="lineno"> 5192</span> spans_(<a class="code hl_namespace" href="namespacestd.html">std</a>::move(spans)),</div>
|
|
<div class="line"><a id="l05193" name="l05193"></a><span class="lineno"> 5193</span> total_slacks_(<a class="code hl_namespace" href="namespacestd.html">std</a>::move(total_slacks)) {</div>
|
|
<div class="line"><a id="l05194" name="l05194"></a><span class="lineno"> 5194</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(spans_.size(), model_->vehicles());</div>
|
|
<div class="line"><a id="l05195" name="l05195"></a><span class="lineno"> 5195</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(total_slacks_.size(), model_->vehicles());</div>
|
|
<div class="line"><a id="l05196" name="l05196"></a><span class="lineno"> 5196</span> vehicle_demons_.resize(model_->vehicles());</div>
|
|
<div class="line"><a id="l05197" name="l05197"></a><span class="lineno"> 5197</span> }</div>
|
|
<div class="line"><a id="l05198" name="l05198"></a><span class="lineno"> 5198</span> </div>
|
|
<div class="line"><a id="l05199" name="l05199"></a><span class="lineno"> 5199</span> std::string DebugString()<span class="keyword"> const override </span>{ <span class="keywordflow">return</span> <span class="stringliteral">"PathSpansAndTotalSlacks"</span>; }</div>
|
|
<div class="line"><a id="l05200" name="l05200"></a><span class="lineno"> 5200</span> </div>
|
|
<div class="line"><a id="l05201" name="l05201"></a><span class="lineno"> 5201</span> <span class="keywordtype">void</span> Post()<span class="keyword"> override </span>{</div>
|
|
<div class="line"><a id="l05202" name="l05202"></a><span class="lineno"> 5202</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_nodes = model_->VehicleVars().size();</div>
|
|
<div class="line"><a id="l05203" name="l05203"></a><span class="lineno"> 5203</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_transits = model_->Nexts().size();</div>
|
|
<div class="line"><a id="l05204" name="l05204"></a><span class="lineno"> 5204</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> node = 0; node < num_nodes; ++node) {</div>
|
|
<div class="line"><a id="l05205" name="l05205"></a><span class="lineno"> 5205</span> <span class="keyword">auto</span>* demon = <a class="code hl_function" href="namespaceoperations__research.html#ae0190f4a9c848c207d0bff97f625fcd1">MakeConstraintDemon1</a>(</div>
|
|
<div class="line"><a id="l05206" name="l05206"></a><span class="lineno"> 5206</span> model_->solver(), <span class="keyword">this</span>, &PathSpansAndTotalSlacks::PropagateNode,</div>
|
|
<div class="line"><a id="l05207" name="l05207"></a><span class="lineno"> 5207</span> <span class="stringliteral">"PathSpansAndTotalSlacks::PropagateNode"</span>, node);</div>
|
|
<div class="line"><a id="l05208" name="l05208"></a><span class="lineno"> 5208</span> dimension_->CumulVar(node)->WhenRange(demon);</div>
|
|
<div class="line"><a id="l05209" name="l05209"></a><span class="lineno"> 5209</span> model_->VehicleVar(node)->WhenBound(demon);</div>
|
|
<div class="line"><a id="l05210" name="l05210"></a><span class="lineno"> 5210</span> <span class="keywordflow">if</span> (node < num_transits) {</div>
|
|
<div class="line"><a id="l05211" name="l05211"></a><span class="lineno"> 5211</span> dimension_->TransitVar(node)->WhenRange(demon);</div>
|
|
<div class="line"><a id="l05212" name="l05212"></a><span class="lineno"> 5212</span> dimension_->FixedTransitVar(node)->WhenBound(demon);</div>
|
|
<div class="line"><a id="l05213" name="l05213"></a><span class="lineno"> 5213</span> model_->NextVar(node)->WhenBound(demon);</div>
|
|
<div class="line"><a id="l05214" name="l05214"></a><span class="lineno"> 5214</span> }</div>
|
|
<div class="line"><a id="l05215" name="l05215"></a><span class="lineno"> 5215</span> }</div>
|
|
<div class="line"><a id="l05216" name="l05216"></a><span class="lineno"> 5216</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < spans_.size(); ++vehicle) {</div>
|
|
<div class="line"><a id="l05217" name="l05217"></a><span class="lineno"> 5217</span> <span class="keywordflow">if</span> (!spans_[vehicle] && !total_slacks_[vehicle]) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l05218" name="l05218"></a><span class="lineno"> 5218</span> <span class="keyword">auto</span>* demon = <a class="code hl_function" href="namespaceoperations__research.html#ac316c82f31293db18e25c809592908dd">MakeDelayedConstraintDemon1</a>(</div>
|
|
<div class="line"><a id="l05219" name="l05219"></a><span class="lineno"> 5219</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>(), <span class="keyword">this</span>, &PathSpansAndTotalSlacks::PropagateVehicle,</div>
|
|
<div class="line"><a id="l05220" name="l05220"></a><span class="lineno"> 5220</span> <span class="stringliteral">"PathSpansAndTotalSlacks::PropagateVehicle"</span>, vehicle);</div>
|
|
<div class="line"><a id="l05221" name="l05221"></a><span class="lineno"> 5221</span> vehicle_demons_[vehicle] = demon;</div>
|
|
<div class="line"><a id="l05222" name="l05222"></a><span class="lineno"> 5222</span> <span class="keywordflow">if</span> (spans_[vehicle]) spans_[vehicle]->WhenRange(demon);</div>
|
|
<div class="line"><a id="l05223" name="l05223"></a><span class="lineno"> 5223</span> <span class="keywordflow">if</span> (total_slacks_[vehicle]) total_slacks_[vehicle]->WhenRange(demon);</div>
|
|
<div class="line"><a id="l05224" name="l05224"></a><span class="lineno"> 5224</span> <span class="keywordflow">if</span> (dimension_->HasBreakConstraints()) {</div>
|
|
<div class="line"><a id="l05225" name="l05225"></a><span class="lineno"> 5225</span> <span class="keywordflow">for</span> (IntervalVar* <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a> : dimension_->GetBreakIntervalsOfVehicle(vehicle)) {</div>
|
|
<div class="line"><a id="l05226" name="l05226"></a><span class="lineno"> 5226</span> <a class="code hl_variable" href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a>->WhenAnything(demon);</div>
|
|
<div class="line"><a id="l05227" name="l05227"></a><span class="lineno"> 5227</span> }</div>
|
|
<div class="line"><a id="l05228" name="l05228"></a><span class="lineno"> 5228</span> }</div>
|
|
<div class="line"><a id="l05229" name="l05229"></a><span class="lineno"> 5229</span> }</div>
|
|
<div class="line"><a id="l05230" name="l05230"></a><span class="lineno"> 5230</span> }</div>
|
|
<div class="line"><a id="l05231" name="l05231"></a><span class="lineno"> 5231</span> </div>
|
|
<div class="line"><a id="l05232" name="l05232"></a><span class="lineno"> 5232</span> <span class="comment">// Call propagator on all vehicles.</span></div>
|
|
<div class="line"><a id="l05233" name="l05233"></a><span class="lineno"> 5233</span> <span class="keywordtype">void</span> InitialPropagate()<span class="keyword"> override </span>{</div>
|
|
<div class="line"><a id="l05234" name="l05234"></a><span class="lineno"> 5234</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < spans_.size(); ++vehicle) {</div>
|
|
<div class="line"><a id="l05235" name="l05235"></a><span class="lineno"> 5235</span> <span class="keywordflow">if</span> (!spans_[vehicle] && !total_slacks_[vehicle]) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l05236" name="l05236"></a><span class="lineno"> 5236</span> PropagateVehicle(vehicle);</div>
|
|
<div class="line"><a id="l05237" name="l05237"></a><span class="lineno"> 5237</span> }</div>
|
|
<div class="line"><a id="l05238" name="l05238"></a><span class="lineno"> 5238</span> }</div>
|
|
<div class="line"><a id="l05239" name="l05239"></a><span class="lineno"> 5239</span> </div>
|
|
<div class="line"><a id="l05240" name="l05240"></a><span class="lineno"> 5240</span> <span class="keyword">private</span>:</div>
|
|
<div class="line"><a id="l05241" name="l05241"></a><span class="lineno"> 5241</span> <span class="comment">// Called when a path/dimension variables of the node changes,</span></div>
|
|
<div class="line"><a id="l05242" name="l05242"></a><span class="lineno"> 5242</span> <span class="comment">// this delays propagator calls until path variables (Next and VehicleVar)</span></div>
|
|
<div class="line"><a id="l05243" name="l05243"></a><span class="lineno"> 5243</span> <span class="comment">// are instantiated, which saves fruitless and multiple identical calls.</span></div>
|
|
<div class="line"><a id="l05244" name="l05244"></a><span class="lineno"> 5244</span> <span class="keywordtype">void</span> PropagateNode(<span class="keywordtype">int</span> node) {</div>
|
|
<div class="line"><a id="l05245" name="l05245"></a><span class="lineno"> 5245</span> <span class="keywordflow">if</span> (!model_->VehicleVar(node)->Bound()) <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l05246" name="l05246"></a><span class="lineno"> 5246</span> <span class="keyword">const</span> <span class="keywordtype">int</span> vehicle = model_->VehicleVar(node)->Min();</div>
|
|
<div class="line"><a id="l05247" name="l05247"></a><span class="lineno"> 5247</span> <span class="keywordflow">if</span> (vehicle < 0 || vehicle_demons_[vehicle] == <span class="keyword">nullptr</span>) <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l05248" name="l05248"></a><span class="lineno"> 5248</span> EnqueueDelayedDemon(vehicle_demons_[vehicle]);</div>
|
|
<div class="line"><a id="l05249" name="l05249"></a><span class="lineno"> 5249</span> }</div>
|
|
<div class="line"><a id="l05250" name="l05250"></a><span class="lineno"> 5250</span> </div>
|
|
<div class="line"><a id="l05251" name="l05251"></a><span class="lineno"> 5251</span> <span class="comment">// In order to make reasoning on span and total_slack of a vehicle uniform,</span></div>
|
|
<div class="line"><a id="l05252" name="l05252"></a><span class="lineno"> 5252</span> <span class="comment">// we rely on the fact that span == sum_fixed_transits + total_slack</span></div>
|
|
<div class="line"><a id="l05253" name="l05253"></a><span class="lineno"> 5253</span> <span class="comment">// to present both span and total_slack in terms of span and fixed transit.</span></div>
|
|
<div class="line"><a id="l05254" name="l05254"></a><span class="lineno"> 5254</span> <span class="comment">// This allows to use the same code whether there actually are variables</span></div>
|
|
<div class="line"><a id="l05255" name="l05255"></a><span class="lineno"> 5255</span> <span class="comment">// for span and total_slack or not.</span></div>
|
|
<div class="line"><a id="l05256" name="l05256"></a><span class="lineno"> 5256</span> int64_t SpanMin(<span class="keywordtype">int</span> vehicle, int64_t sum_fixed_transits) {</div>
|
|
<div class="line"><a id="l05257" name="l05257"></a><span class="lineno"> 5257</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(sum_fixed_transits, 0);</div>
|
|
<div class="line"><a id="l05258" name="l05258"></a><span class="lineno"> 5258</span> <span class="keyword">const</span> int64_t span_min = spans_[vehicle]</div>
|
|
<div class="line"><a id="l05259" name="l05259"></a><span class="lineno"> 5259</span> ? spans_[vehicle]->Min()</div>
|
|
<div class="line"><a id="l05260" name="l05260"></a><span class="lineno"> 5260</span> : <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>();</div>
|
|
<div class="line"><a id="l05261" name="l05261"></a><span class="lineno"> 5261</span> <span class="keyword">const</span> int64_t total_slack_min = total_slacks_[vehicle]</div>
|
|
<div class="line"><a id="l05262" name="l05262"></a><span class="lineno"> 5262</span> ? total_slacks_[vehicle]->Min()</div>
|
|
<div class="line"><a id="l05263" name="l05263"></a><span class="lineno"> 5263</span> : <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>();</div>
|
|
<div class="line"><a id="l05264" name="l05264"></a><span class="lineno"> 5264</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::min</a>(span_min, <a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(total_slack_min, sum_fixed_transits));</div>
|
|
<div class="line"><a id="l05265" name="l05265"></a><span class="lineno"> 5265</span> }</div>
|
|
<div class="line"><a id="l05266" name="l05266"></a><span class="lineno"> 5266</span> int64_t SpanMax(<span class="keywordtype">int</span> vehicle, int64_t sum_fixed_transits) {</div>
|
|
<div class="line"><a id="l05267" name="l05267"></a><span class="lineno"> 5267</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(sum_fixed_transits, 0);</div>
|
|
<div class="line"><a id="l05268" name="l05268"></a><span class="lineno"> 5268</span> <span class="keyword">const</span> int64_t span_max = spans_[vehicle]</div>
|
|
<div class="line"><a id="l05269" name="l05269"></a><span class="lineno"> 5269</span> ? spans_[vehicle]->Max()</div>
|
|
<div class="line"><a id="l05270" name="l05270"></a><span class="lineno"> 5270</span> : <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits<int64_t>::min</a>();</div>
|
|
<div class="line"><a id="l05271" name="l05271"></a><span class="lineno"> 5271</span> <span class="keyword">const</span> int64_t total_slack_max = total_slacks_[vehicle]</div>
|
|
<div class="line"><a id="l05272" name="l05272"></a><span class="lineno"> 5272</span> ? total_slacks_[vehicle]->Max()</div>
|
|
<div class="line"><a id="l05273" name="l05273"></a><span class="lineno"> 5273</span> : <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits<int64_t>::min</a>();</div>
|
|
<div class="line"><a id="l05274" name="l05274"></a><span class="lineno"> 5274</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(span_max, <a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(total_slack_max, sum_fixed_transits));</div>
|
|
<div class="line"><a id="l05275" name="l05275"></a><span class="lineno"> 5275</span> }</div>
|
|
<div class="line"><a id="l05276" name="l05276"></a><span class="lineno"> 5276</span> <span class="keywordtype">void</span> SetSpanMin(<span class="keywordtype">int</span> vehicle, int64_t <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">min</a>, int64_t sum_fixed_transits) {</div>
|
|
<div class="line"><a id="l05277" name="l05277"></a><span class="lineno"> 5277</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(sum_fixed_transits, 0);</div>
|
|
<div class="line"><a id="l05278" name="l05278"></a><span class="lineno"> 5278</span> <span class="keywordflow">if</span> (spans_[vehicle]) {</div>
|
|
<div class="line"><a id="l05279" name="l05279"></a><span class="lineno"> 5279</span> spans_[vehicle]->SetMin(<a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">min</a>);</div>
|
|
<div class="line"><a id="l05280" name="l05280"></a><span class="lineno"> 5280</span> }</div>
|
|
<div class="line"><a id="l05281" name="l05281"></a><span class="lineno"> 5281</span> <span class="keywordflow">if</span> (total_slacks_[vehicle]) {</div>
|
|
<div class="line"><a id="l05282" name="l05282"></a><span class="lineno"> 5282</span> total_slacks_[vehicle]->SetMin(<a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(<a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">min</a>, sum_fixed_transits));</div>
|
|
<div class="line"><a id="l05283" name="l05283"></a><span class="lineno"> 5283</span> }</div>
|
|
<div class="line"><a id="l05284" name="l05284"></a><span class="lineno"> 5284</span> }</div>
|
|
<div class="line"><a id="l05285" name="l05285"></a><span class="lineno"> 5285</span> <span class="keywordtype">void</span> SetSpanMax(<span class="keywordtype">int</span> vehicle, int64_t <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">max</a>, int64_t sum_fixed_transits) {</div>
|
|
<div class="line"><a id="l05286" name="l05286"></a><span class="lineno"> 5286</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(sum_fixed_transits, 0);</div>
|
|
<div class="line"><a id="l05287" name="l05287"></a><span class="lineno"> 5287</span> <span class="keywordflow">if</span> (spans_[vehicle]) {</div>
|
|
<div class="line"><a id="l05288" name="l05288"></a><span class="lineno"> 5288</span> spans_[vehicle]->SetMax(<a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">max</a>);</div>
|
|
<div class="line"><a id="l05289" name="l05289"></a><span class="lineno"> 5289</span> }</div>
|
|
<div class="line"><a id="l05290" name="l05290"></a><span class="lineno"> 5290</span> <span class="keywordflow">if</span> (total_slacks_[vehicle]) {</div>
|
|
<div class="line"><a id="l05291" name="l05291"></a><span class="lineno"> 5291</span> total_slacks_[vehicle]->SetMax(<a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(<a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">max</a>, sum_fixed_transits));</div>
|
|
<div class="line"><a id="l05292" name="l05292"></a><span class="lineno"> 5292</span> }</div>
|
|
<div class="line"><a id="l05293" name="l05293"></a><span class="lineno"> 5293</span> }</div>
|
|
<div class="line"><a id="l05294" name="l05294"></a><span class="lineno"> 5294</span> <span class="comment">// Propagates span == sum_fixed_transits + total_slack.</span></div>
|
|
<div class="line"><a id="l05295" name="l05295"></a><span class="lineno"> 5295</span> <span class="comment">// This should be called at least once during PropagateVehicle().</span></div>
|
|
<div class="line"><a id="l05296" name="l05296"></a><span class="lineno"> 5296</span> <span class="keywordtype">void</span> SynchronizeSpanAndTotalSlack(<span class="keywordtype">int</span> vehicle, int64_t sum_fixed_transits) {</div>
|
|
<div class="line"><a id="l05297" name="l05297"></a><span class="lineno"> 5297</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(sum_fixed_transits, 0);</div>
|
|
<div class="line"><a id="l05298" name="l05298"></a><span class="lineno"> 5298</span> IntVar* span = spans_[vehicle];</div>
|
|
<div class="line"><a id="l05299" name="l05299"></a><span class="lineno"> 5299</span> IntVar* total_slack = total_slacks_[vehicle];</div>
|
|
<div class="line"><a id="l05300" name="l05300"></a><span class="lineno"> 5300</span> <span class="keywordflow">if</span> (!span || !total_slack) <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l05301" name="l05301"></a><span class="lineno"> 5301</span> span->SetMin(<a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(total_slack->Min(), sum_fixed_transits));</div>
|
|
<div class="line"><a id="l05302" name="l05302"></a><span class="lineno"> 5302</span> span->SetMax(<a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(total_slack->Max(), sum_fixed_transits));</div>
|
|
<div class="line"><a id="l05303" name="l05303"></a><span class="lineno"> 5303</span> total_slack->SetMin(<a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(span->Min(), sum_fixed_transits));</div>
|
|
<div class="line"><a id="l05304" name="l05304"></a><span class="lineno"> 5304</span> total_slack->SetMax(<a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(span->Max(), sum_fixed_transits));</div>
|
|
<div class="line"><a id="l05305" name="l05305"></a><span class="lineno"> 5305</span> }</div>
|
|
<div class="line"><a id="l05306" name="l05306"></a><span class="lineno"> 5306</span> </div>
|
|
<div class="line"><a id="l05307" name="l05307"></a><span class="lineno"> 5307</span> <span class="keywordtype">void</span> PropagateVehicle(<span class="keywordtype">int</span> vehicle) {</div>
|
|
<div class="line"><a id="l05308" name="l05308"></a><span class="lineno"> 5308</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(spans_[vehicle] || total_slacks_[vehicle]);</div>
|
|
<div class="line"><a id="l05309" name="l05309"></a><span class="lineno"> 5309</span> <span class="keyword">const</span> <span class="keywordtype">int</span> start = model_->Start(vehicle);</div>
|
|
<div class="line"><a id="l05310" name="l05310"></a><span class="lineno"> 5310</span> <span class="keyword">const</span> <span class="keywordtype">int</span> end = model_->End(vehicle);</div>
|
|
<div class="line"><a id="l05311" name="l05311"></a><span class="lineno"> 5311</span> <span class="comment">// Record path, if it is not fixed from start to end, stop here.</span></div>
|
|
<div class="line"><a id="l05312" name="l05312"></a><span class="lineno"> 5312</span> <span class="comment">// TRICKY: do not put end node yet, we look only at transits in the next</span></div>
|
|
<div class="line"><a id="l05313" name="l05313"></a><span class="lineno"> 5313</span> <span class="comment">// reasonings, we will append the end when we look at cumuls.</span></div>
|
|
<div class="line"><a id="l05314" name="l05314"></a><span class="lineno"> 5314</span> {</div>
|
|
<div class="line"><a id="l05315" name="l05315"></a><span class="lineno"> 5315</span> path_.clear();</div>
|
|
<div class="line"><a id="l05316" name="l05316"></a><span class="lineno"> 5316</span> <span class="keywordtype">int</span> curr_node = start;</div>
|
|
<div class="line"><a id="l05317" name="l05317"></a><span class="lineno"> 5317</span> <span class="keywordflow">while</span> (!model_->IsEnd(curr_node)) {</div>
|
|
<div class="line"><a id="l05318" name="l05318"></a><span class="lineno"> 5318</span> <span class="keyword">const</span> IntVar* next_var = model_->NextVar(curr_node);</div>
|
|
<div class="line"><a id="l05319" name="l05319"></a><span class="lineno"> 5319</span> <span class="keywordflow">if</span> (!next_var->Bound()) <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l05320" name="l05320"></a><span class="lineno"> 5320</span> path_.push_back(curr_node);</div>
|
|
<div class="line"><a id="l05321" name="l05321"></a><span class="lineno"> 5321</span> curr_node = next_var->Value();</div>
|
|
<div class="line"><a id="l05322" name="l05322"></a><span class="lineno"> 5322</span> }</div>
|
|
<div class="line"><a id="l05323" name="l05323"></a><span class="lineno"> 5323</span> }</div>
|
|
<div class="line"><a id="l05324" name="l05324"></a><span class="lineno"> 5324</span> <span class="comment">// Compute the sum of fixed transits. Fixed transit variables should all be</span></div>
|
|
<div class="line"><a id="l05325" name="l05325"></a><span class="lineno"> 5325</span> <span class="comment">// fixed, otherwise we wait to get called later when propagation does it.</span></div>
|
|
<div class="line"><a id="l05326" name="l05326"></a><span class="lineno"> 5326</span> int64_t sum_fixed_transits = 0;</div>
|
|
<div class="line"><a id="l05327" name="l05327"></a><span class="lineno"> 5327</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> node : path_) {</div>
|
|
<div class="line"><a id="l05328" name="l05328"></a><span class="lineno"> 5328</span> <span class="keyword">const</span> IntVar* fixed_transit_var = dimension_->FixedTransitVar(node);</div>
|
|
<div class="line"><a id="l05329" name="l05329"></a><span class="lineno"> 5329</span> <span class="keywordflow">if</span> (!fixed_transit_var->Bound()) <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l05330" name="l05330"></a><span class="lineno"> 5330</span> sum_fixed_transits =</div>
|
|
<div class="line"><a id="l05331" name="l05331"></a><span class="lineno"> 5331</span> <a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(sum_fixed_transits, fixed_transit_var->Value());</div>
|
|
<div class="line"><a id="l05332" name="l05332"></a><span class="lineno"> 5332</span> }</div>
|
|
<div class="line"><a id="l05333" name="l05333"></a><span class="lineno"> 5333</span> </div>
|
|
<div class="line"><a id="l05334" name="l05334"></a><span class="lineno"> 5334</span> SynchronizeSpanAndTotalSlack(vehicle, sum_fixed_transits);</div>
|
|
<div class="line"><a id="l05335" name="l05335"></a><span class="lineno"> 5335</span> </div>
|
|
<div class="line"><a id="l05336" name="l05336"></a><span class="lineno"> 5336</span> <span class="comment">// The amount of break time that must occur during the route must be smaller</span></div>
|
|
<div class="line"><a id="l05337" name="l05337"></a><span class="lineno"> 5337</span> <span class="comment">// than span max - sum_fixed_transits. A break must occur on the route if it</span></div>
|
|
<div class="line"><a id="l05338" name="l05338"></a><span class="lineno"> 5338</span> <span class="comment">// must be after the route's start and before the route's end.</span></div>
|
|
<div class="line"><a id="l05339" name="l05339"></a><span class="lineno"> 5339</span> <span class="comment">// Propagate lower bound on span, then filter out values</span></div>
|
|
<div class="line"><a id="l05340" name="l05340"></a><span class="lineno"> 5340</span> <span class="comment">// that would force more breaks in route than possible.</span></div>
|
|
<div class="line"><a id="l05341" name="l05341"></a><span class="lineno"> 5341</span> <span class="keywordflow">if</span> (dimension_->HasBreakConstraints() &&</div>
|
|
<div class="line"><a id="l05342" name="l05342"></a><span class="lineno"> 5342</span> !dimension_->GetBreakIntervalsOfVehicle(vehicle).empty()) {</div>
|
|
<div class="line"><a id="l05343" name="l05343"></a><span class="lineno"> 5343</span> <span class="keyword">const</span> int64_t vehicle_start_max = dimension_->CumulVar(start)->Max();</div>
|
|
<div class="line"><a id="l05344" name="l05344"></a><span class="lineno"> 5344</span> <span class="keyword">const</span> int64_t vehicle_end_min = dimension_->CumulVar(end)->Min();</div>
|
|
<div class="line"><a id="l05345" name="l05345"></a><span class="lineno"> 5345</span> <span class="comment">// Compute and propagate lower bound.</span></div>
|
|
<div class="line"><a id="l05346" name="l05346"></a><span class="lineno"> 5346</span> int64_t min_break_duration = 0;</div>
|
|
<div class="line"><a id="l05347" name="l05347"></a><span class="lineno"> 5347</span> <span class="keywordflow">for</span> (IntervalVar* br : dimension_->GetBreakIntervalsOfVehicle(vehicle)) {</div>
|
|
<div class="line"><a id="l05348" name="l05348"></a><span class="lineno"> 5348</span> <span class="keywordflow">if</span> (!br->MustBePerformed()) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l05349" name="l05349"></a><span class="lineno"> 5349</span> <span class="keywordflow">if</span> (vehicle_start_max < br->EndMin() &&</div>
|
|
<div class="line"><a id="l05350" name="l05350"></a><span class="lineno"> 5350</span> br->StartMax() < vehicle_end_min) {</div>
|
|
<div class="line"><a id="l05351" name="l05351"></a><span class="lineno"> 5351</span> min_break_duration = <a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(min_break_duration, br->DurationMin());</div>
|
|
<div class="line"><a id="l05352" name="l05352"></a><span class="lineno"> 5352</span> }</div>
|
|
<div class="line"><a id="l05353" name="l05353"></a><span class="lineno"> 5353</span> }</div>
|
|
<div class="line"><a id="l05354" name="l05354"></a><span class="lineno"> 5354</span> SetSpanMin(vehicle, <a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(min_break_duration, sum_fixed_transits),</div>
|
|
<div class="line"><a id="l05355" name="l05355"></a><span class="lineno"> 5355</span> sum_fixed_transits);</div>
|
|
<div class="line"><a id="l05356" name="l05356"></a><span class="lineno"> 5356</span> <span class="comment">// If a break that is not inside the route may violate slack_max,</span></div>
|
|
<div class="line"><a id="l05357" name="l05357"></a><span class="lineno"> 5357</span> <span class="comment">// we can propagate in some cases: when the break must be before or</span></div>
|
|
<div class="line"><a id="l05358" name="l05358"></a><span class="lineno"> 5358</span> <span class="comment">// must be after the route.</span></div>
|
|
<div class="line"><a id="l05359" name="l05359"></a><span class="lineno"> 5359</span> <span class="comment">// In the other cases, we cannot deduce a better bound on a CumulVar or</span></div>
|
|
<div class="line"><a id="l05360" name="l05360"></a><span class="lineno"> 5360</span> <span class="comment">// on a break, so we do nothing.</span></div>
|
|
<div class="line"><a id="l05361" name="l05361"></a><span class="lineno"> 5361</span> <span class="keyword">const</span> int64_t slack_max =</div>
|
|
<div class="line"><a id="l05362" name="l05362"></a><span class="lineno"> 5362</span> <a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(SpanMax(vehicle, sum_fixed_transits), sum_fixed_transits);</div>
|
|
<div class="line"><a id="l05363" name="l05363"></a><span class="lineno"> 5363</span> <span class="keyword">const</span> int64_t max_additional_slack =</div>
|
|
<div class="line"><a id="l05364" name="l05364"></a><span class="lineno"> 5364</span> <a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(slack_max, min_break_duration);</div>
|
|
<div class="line"><a id="l05365" name="l05365"></a><span class="lineno"> 5365</span> <span class="keywordflow">for</span> (IntervalVar* br : dimension_->GetBreakIntervalsOfVehicle(vehicle)) {</div>
|
|
<div class="line"><a id="l05366" name="l05366"></a><span class="lineno"> 5366</span> <span class="keywordflow">if</span> (!br->MustBePerformed()) <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l05367" name="l05367"></a><span class="lineno"> 5367</span> <span class="comment">// Break must be before end, detect whether it must be before start.</span></div>
|
|
<div class="line"><a id="l05368" name="l05368"></a><span class="lineno"> 5368</span> <span class="keywordflow">if</span> (vehicle_start_max >= br->EndMin() &&</div>
|
|
<div class="line"><a id="l05369" name="l05369"></a><span class="lineno"> 5369</span> br->StartMax() < vehicle_end_min) {</div>
|
|
<div class="line"><a id="l05370" name="l05370"></a><span class="lineno"> 5370</span> <span class="keywordflow">if</span> (br->DurationMin() > max_additional_slack) {</div>
|
|
<div class="line"><a id="l05371" name="l05371"></a><span class="lineno"> 5371</span> <span class="comment">// Having the break inside would violate max_additional_slack..</span></div>
|
|
<div class="line"><a id="l05372" name="l05372"></a><span class="lineno"> 5372</span> <span class="comment">// Thus, it must be outside the route, in this case, before.</span></div>
|
|
<div class="line"><a id="l05373" name="l05373"></a><span class="lineno"> 5373</span> br->SetEndMax(vehicle_start_max);</div>
|
|
<div class="line"><a id="l05374" name="l05374"></a><span class="lineno"> 5374</span> dimension_->CumulVar(start)->SetMin(br->EndMin());</div>
|
|
<div class="line"><a id="l05375" name="l05375"></a><span class="lineno"> 5375</span> }</div>
|
|
<div class="line"><a id="l05376" name="l05376"></a><span class="lineno"> 5376</span> }</div>
|
|
<div class="line"><a id="l05377" name="l05377"></a><span class="lineno"> 5377</span> <span class="comment">// Break must be after start, detect whether it must be after end.</span></div>
|
|
<div class="line"><a id="l05378" name="l05378"></a><span class="lineno"> 5378</span> <span class="comment">// Same reasoning, in the case where the break is after.</span></div>
|
|
<div class="line"><a id="l05379" name="l05379"></a><span class="lineno"> 5379</span> <span class="keywordflow">if</span> (vehicle_start_max < br->EndMin() &&</div>
|
|
<div class="line"><a id="l05380" name="l05380"></a><span class="lineno"> 5380</span> br->StartMax() >= vehicle_end_min) {</div>
|
|
<div class="line"><a id="l05381" name="l05381"></a><span class="lineno"> 5381</span> <span class="keywordflow">if</span> (br->DurationMin() > max_additional_slack) {</div>
|
|
<div class="line"><a id="l05382" name="l05382"></a><span class="lineno"> 5382</span> br->SetStartMin(vehicle_end_min);</div>
|
|
<div class="line"><a id="l05383" name="l05383"></a><span class="lineno"> 5383</span> dimension_->CumulVar(end)->SetMax(br->StartMax());</div>
|
|
<div class="line"><a id="l05384" name="l05384"></a><span class="lineno"> 5384</span> }</div>
|
|
<div class="line"><a id="l05385" name="l05385"></a><span class="lineno"> 5385</span> }</div>
|
|
<div class="line"><a id="l05386" name="l05386"></a><span class="lineno"> 5386</span> }</div>
|
|
<div class="line"><a id="l05387" name="l05387"></a><span class="lineno"> 5387</span> }</div>
|
|
<div class="line"><a id="l05388" name="l05388"></a><span class="lineno"> 5388</span> </div>
|
|
<div class="line"><a id="l05389" name="l05389"></a><span class="lineno"> 5389</span> <span class="comment">// Propagate span == cumul(end) - cumul(start).</span></div>
|
|
<div class="line"><a id="l05390" name="l05390"></a><span class="lineno"> 5390</span> {</div>
|
|
<div class="line"><a id="l05391" name="l05391"></a><span class="lineno"> 5391</span> IntVar* start_cumul = dimension_->CumulVar(start);</div>
|
|
<div class="line"><a id="l05392" name="l05392"></a><span class="lineno"> 5392</span> IntVar* end_cumul = dimension_->CumulVar(end);</div>
|
|
<div class="line"><a id="l05393" name="l05393"></a><span class="lineno"> 5393</span> <span class="keyword">const</span> int64_t <a class="code hl_variable" href="sched__constraints_8cc.html#a826c744af066625acb241b17ae3e2be9">start_min</a> = start_cumul->Min();</div>
|
|
<div class="line"><a id="l05394" name="l05394"></a><span class="lineno"> 5394</span> <span class="keyword">const</span> int64_t <a class="code hl_variable" href="sched__constraints_8cc.html#a0d94a083ebe1975ac196611f87a4e0a2">start_max</a> = start_cumul->Max();</div>
|
|
<div class="line"><a id="l05395" name="l05395"></a><span class="lineno"> 5395</span> <span class="keyword">const</span> int64_t <a class="code hl_variable" href="sched__constraints_8cc.html#ad3f96403731a9e915dad229813609e74">end_min</a> = end_cumul->Min();</div>
|
|
<div class="line"><a id="l05396" name="l05396"></a><span class="lineno"> 5396</span> <span class="keyword">const</span> int64_t <a class="code hl_variable" href="sched__constraints_8cc.html#a368fa95d42fa4962a75cedd9df656694">end_max</a> = end_cumul->Max();</div>
|
|
<div class="line"><a id="l05397" name="l05397"></a><span class="lineno"> 5397</span> <span class="comment">// Propagate from cumuls to span.</span></div>
|
|
<div class="line"><a id="l05398" name="l05398"></a><span class="lineno"> 5398</span> <span class="keyword">const</span> int64_t span_lb = <a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(<a class="code hl_variable" href="sched__constraints_8cc.html#ad3f96403731a9e915dad229813609e74">end_min</a>, <a class="code hl_variable" href="sched__constraints_8cc.html#a0d94a083ebe1975ac196611f87a4e0a2">start_max</a>);</div>
|
|
<div class="line"><a id="l05399" name="l05399"></a><span class="lineno"> 5399</span> SetSpanMin(vehicle, span_lb, sum_fixed_transits);</div>
|
|
<div class="line"><a id="l05400" name="l05400"></a><span class="lineno"> 5400</span> <span class="keyword">const</span> int64_t span_ub = <a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(<a class="code hl_variable" href="sched__constraints_8cc.html#a368fa95d42fa4962a75cedd9df656694">end_max</a>, <a class="code hl_variable" href="sched__constraints_8cc.html#a826c744af066625acb241b17ae3e2be9">start_min</a>);</div>
|
|
<div class="line"><a id="l05401" name="l05401"></a><span class="lineno"> 5401</span> SetSpanMax(vehicle, span_ub, sum_fixed_transits);</div>
|
|
<div class="line"><a id="l05402" name="l05402"></a><span class="lineno"> 5402</span> <span class="comment">// Propagate from span to cumuls.</span></div>
|
|
<div class="line"><a id="l05403" name="l05403"></a><span class="lineno"> 5403</span> <span class="keyword">const</span> int64_t span_min = SpanMin(vehicle, sum_fixed_transits);</div>
|
|
<div class="line"><a id="l05404" name="l05404"></a><span class="lineno"> 5404</span> <span class="keyword">const</span> int64_t span_max = SpanMax(vehicle, sum_fixed_transits);</div>
|
|
<div class="line"><a id="l05405" name="l05405"></a><span class="lineno"> 5405</span> <span class="keyword">const</span> int64_t slack_from_lb = <a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(span_max, span_lb);</div>
|
|
<div class="line"><a id="l05406" name="l05406"></a><span class="lineno"> 5406</span> <span class="keyword">const</span> int64_t slack_from_ub = <a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(span_ub, span_min);</div>
|
|
<div class="line"><a id="l05407" name="l05407"></a><span class="lineno"> 5407</span> <span class="comment">// start >= start_max - (span_max - span_lb).</span></div>
|
|
<div class="line"><a id="l05408" name="l05408"></a><span class="lineno"> 5408</span> start_cumul->SetMin(<a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(<a class="code hl_variable" href="sched__constraints_8cc.html#a0d94a083ebe1975ac196611f87a4e0a2">start_max</a>, slack_from_lb));</div>
|
|
<div class="line"><a id="l05409" name="l05409"></a><span class="lineno"> 5409</span> <span class="comment">// end <= end_min + (span_max - span_lb).</span></div>
|
|
<div class="line"><a id="l05410" name="l05410"></a><span class="lineno"> 5410</span> end_cumul->SetMax(<a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(<a class="code hl_variable" href="sched__constraints_8cc.html#ad3f96403731a9e915dad229813609e74">end_min</a>, slack_from_lb));</div>
|
|
<div class="line"><a id="l05411" name="l05411"></a><span class="lineno"> 5411</span> <span class="comment">// // start <= start_min + (span_ub - span_min)</span></div>
|
|
<div class="line"><a id="l05412" name="l05412"></a><span class="lineno"> 5412</span> start_cumul->SetMax(<a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(<a class="code hl_variable" href="sched__constraints_8cc.html#a826c744af066625acb241b17ae3e2be9">start_min</a>, slack_from_ub));</div>
|
|
<div class="line"><a id="l05413" name="l05413"></a><span class="lineno"> 5413</span> <span class="comment">// // end >= end_max - (span_ub - span_min)</span></div>
|
|
<div class="line"><a id="l05414" name="l05414"></a><span class="lineno"> 5414</span> end_cumul->SetMin(<a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(<a class="code hl_variable" href="sched__constraints_8cc.html#a368fa95d42fa4962a75cedd9df656694">end_max</a>, slack_from_ub));</div>
|
|
<div class="line"><a id="l05415" name="l05415"></a><span class="lineno"> 5415</span> }</div>
|
|
<div class="line"><a id="l05416" name="l05416"></a><span class="lineno"> 5416</span> </div>
|
|
<div class="line"><a id="l05417" name="l05417"></a><span class="lineno"> 5417</span> <span class="comment">// Propagate sum transits == span.</span></div>
|
|
<div class="line"><a id="l05418" name="l05418"></a><span class="lineno"> 5418</span> {</div>
|
|
<div class="line"><a id="l05419" name="l05419"></a><span class="lineno"> 5419</span> <span class="comment">// Propagate from transits to span.</span></div>
|
|
<div class="line"><a id="l05420" name="l05420"></a><span class="lineno"> 5420</span> int64_t span_lb = 0;</div>
|
|
<div class="line"><a id="l05421" name="l05421"></a><span class="lineno"> 5421</span> int64_t span_ub = 0;</div>
|
|
<div class="line"><a id="l05422" name="l05422"></a><span class="lineno"> 5422</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> node : path_) {</div>
|
|
<div class="line"><a id="l05423" name="l05423"></a><span class="lineno"> 5423</span> span_lb = <a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(span_lb, dimension_->TransitVar(node)->Min());</div>
|
|
<div class="line"><a id="l05424" name="l05424"></a><span class="lineno"> 5424</span> span_ub = <a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(span_ub, dimension_->TransitVar(node)->Max());</div>
|
|
<div class="line"><a id="l05425" name="l05425"></a><span class="lineno"> 5425</span> }</div>
|
|
<div class="line"><a id="l05426" name="l05426"></a><span class="lineno"> 5426</span> SetSpanMin(vehicle, span_lb, sum_fixed_transits);</div>
|
|
<div class="line"><a id="l05427" name="l05427"></a><span class="lineno"> 5427</span> SetSpanMax(vehicle, span_ub, sum_fixed_transits);</div>
|
|
<div class="line"><a id="l05428" name="l05428"></a><span class="lineno"> 5428</span> <span class="comment">// Propagate from span to transits.</span></div>
|
|
<div class="line"><a id="l05429" name="l05429"></a><span class="lineno"> 5429</span> <span class="comment">// transit[i] <= transit_i_min + (span_max - span_lb)</span></div>
|
|
<div class="line"><a id="l05430" name="l05430"></a><span class="lineno"> 5430</span> <span class="comment">// transit[i] >= transit_i_max - (span_ub - span_min)</span></div>
|
|
<div class="line"><a id="l05431" name="l05431"></a><span class="lineno"> 5431</span> <span class="keyword">const</span> int64_t span_min = SpanMin(vehicle, sum_fixed_transits);</div>
|
|
<div class="line"><a id="l05432" name="l05432"></a><span class="lineno"> 5432</span> <span class="keyword">const</span> int64_t span_max = SpanMax(vehicle, sum_fixed_transits);</div>
|
|
<div class="line"><a id="l05433" name="l05433"></a><span class="lineno"> 5433</span> <span class="keyword">const</span> int64_t slack_from_lb = <a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(span_max, span_lb);</div>
|
|
<div class="line"><a id="l05434" name="l05434"></a><span class="lineno"> 5434</span> <span class="keyword">const</span> int64_t slack_from_ub =</div>
|
|
<div class="line"><a id="l05435" name="l05435"></a><span class="lineno"> 5435</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">span_ub < std::numeric_limits<int64_t>::max</a>()</div>
|
|
<div class="line"><a id="l05436" name="l05436"></a><span class="lineno"> 5436</span> ? <a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(span_ub, span_min)</div>
|
|
<div class="line"><a id="l05437" name="l05437"></a><span class="lineno"> 5437</span> : <a class="code hl_namespace" href="namespacestd.html">std</a>::numeric_limits<int64_t>::<a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">max</a>();</div>
|
|
<div class="line"><a id="l05438" name="l05438"></a><span class="lineno"> 5438</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> node : path_) {</div>
|
|
<div class="line"><a id="l05439" name="l05439"></a><span class="lineno"> 5439</span> IntVar* transit_var = dimension_->TransitVar(node);</div>
|
|
<div class="line"><a id="l05440" name="l05440"></a><span class="lineno"> 5440</span> <span class="keyword">const</span> int64_t transit_i_min = transit_var->Min();</div>
|
|
<div class="line"><a id="l05441" name="l05441"></a><span class="lineno"> 5441</span> <span class="keyword">const</span> int64_t transit_i_max = transit_var->Max();</div>
|
|
<div class="line"><a id="l05442" name="l05442"></a><span class="lineno"> 5442</span> <span class="comment">// TRICKY: the first propagation might change transit_var->Max(),</span></div>
|
|
<div class="line"><a id="l05443" name="l05443"></a><span class="lineno"> 5443</span> <span class="comment">// but we must use the same value of transit_i_max in the computation</span></div>
|
|
<div class="line"><a id="l05444" name="l05444"></a><span class="lineno"> 5444</span> <span class="comment">// of transit[i]'s lower bound that was used for span_ub.</span></div>
|
|
<div class="line"><a id="l05445" name="l05445"></a><span class="lineno"> 5445</span> transit_var->SetMax(<a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(transit_i_min, slack_from_lb));</div>
|
|
<div class="line"><a id="l05446" name="l05446"></a><span class="lineno"> 5446</span> transit_var->SetMin(<a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(transit_i_max, slack_from_ub));</div>
|
|
<div class="line"><a id="l05447" name="l05447"></a><span class="lineno"> 5447</span> }</div>
|
|
<div class="line"><a id="l05448" name="l05448"></a><span class="lineno"> 5448</span> }</div>
|
|
<div class="line"><a id="l05449" name="l05449"></a><span class="lineno"> 5449</span> </div>
|
|
<div class="line"><a id="l05450" name="l05450"></a><span class="lineno"> 5450</span> <span class="comment">// TRICKY: add end node now, we will look at cumuls.</span></div>
|
|
<div class="line"><a id="l05451" name="l05451"></a><span class="lineno"> 5451</span> path_.push_back(end);</div>
|
|
<div class="line"><a id="l05452" name="l05452"></a><span class="lineno"> 5452</span> </div>
|
|
<div class="line"><a id="l05453" name="l05453"></a><span class="lineno"> 5453</span> <span class="comment">// A stronger bound: from start min of the route, go to node i+1 with time</span></div>
|
|
<div class="line"><a id="l05454" name="l05454"></a><span class="lineno"> 5454</span> <span class="comment">// max(cumul[i] + fixed_transit, cumul[i+1].Min()).</span></div>
|
|
<div class="line"><a id="l05455" name="l05455"></a><span class="lineno"> 5455</span> <span class="comment">// Record arrival time (should be the same as end cumul min).</span></div>
|
|
<div class="line"><a id="l05456" name="l05456"></a><span class="lineno"> 5456</span> <span class="comment">// Then do the reverse route, going to time</span></div>
|
|
<div class="line"><a id="l05457" name="l05457"></a><span class="lineno"> 5457</span> <span class="comment">// min(cumul[i+1] - fixed_transit, cumul[i].Max())</span></div>
|
|
<div class="line"><a id="l05458" name="l05458"></a><span class="lineno"> 5458</span> <span class="comment">// Record final time as departure time.</span></div>
|
|
<div class="line"><a id="l05459" name="l05459"></a><span class="lineno"> 5459</span> <span class="comment">// Then arrival time - departure time is a valid lower bound of span.</span></div>
|
|
<div class="line"><a id="l05460" name="l05460"></a><span class="lineno"> 5460</span> <span class="comment">// First reasoning: start - end - start</span></div>
|
|
<div class="line"><a id="l05461" name="l05461"></a><span class="lineno"> 5461</span> {</div>
|
|
<div class="line"><a id="l05462" name="l05462"></a><span class="lineno"> 5462</span> int64_t arrival_time = dimension_->CumulVar(start)->Min();</div>
|
|
<div class="line"><a id="l05463" name="l05463"></a><span class="lineno"> 5463</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i < path_.size(); ++i) {</div>
|
|
<div class="line"><a id="l05464" name="l05464"></a><span class="lineno"> 5464</span> arrival_time =</div>
|
|
<div class="line"><a id="l05465" name="l05465"></a><span class="lineno"> 5465</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(<a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(arrival_time,</div>
|
|
<div class="line"><a id="l05466" name="l05466"></a><span class="lineno"> 5466</span> dimension_->FixedTransitVar(path_[i - 1])->Min()),</div>
|
|
<div class="line"><a id="l05467" name="l05467"></a><span class="lineno"> 5467</span> dimension_->CumulVar(path_[i])->Min());</div>
|
|
<div class="line"><a id="l05468" name="l05468"></a><span class="lineno"> 5468</span> }</div>
|
|
<div class="line"><a id="l05469" name="l05469"></a><span class="lineno"> 5469</span> int64_t departure_time = arrival_time;</div>
|
|
<div class="line"><a id="l05470" name="l05470"></a><span class="lineno"> 5470</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = path_.size() - 2; i >= 0; --i) {</div>
|
|
<div class="line"><a id="l05471" name="l05471"></a><span class="lineno"> 5471</span> departure_time =</div>
|
|
<div class="line"><a id="l05472" name="l05472"></a><span class="lineno"> 5472</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::min</a>(<a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(departure_time,</div>
|
|
<div class="line"><a id="l05473" name="l05473"></a><span class="lineno"> 5473</span> dimension_->FixedTransitVar(path_[i])->Min()),</div>
|
|
<div class="line"><a id="l05474" name="l05474"></a><span class="lineno"> 5474</span> dimension_->CumulVar(path_[i])->Max());</div>
|
|
<div class="line"><a id="l05475" name="l05475"></a><span class="lineno"> 5475</span> }</div>
|
|
<div class="line"><a id="l05476" name="l05476"></a><span class="lineno"> 5476</span> <span class="keyword">const</span> int64_t span_lb = <a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(arrival_time, departure_time);</div>
|
|
<div class="line"><a id="l05477" name="l05477"></a><span class="lineno"> 5477</span> SetSpanMin(vehicle, span_lb, sum_fixed_transits);</div>
|
|
<div class="line"><a id="l05478" name="l05478"></a><span class="lineno"> 5478</span> <span class="keyword">const</span> int64_t maximum_deviation =</div>
|
|
<div class="line"><a id="l05479" name="l05479"></a><span class="lineno"> 5479</span> <a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(SpanMax(vehicle, sum_fixed_transits), span_lb);</div>
|
|
<div class="line"><a id="l05480" name="l05480"></a><span class="lineno"> 5480</span> <span class="keyword">const</span> int64_t start_lb = <a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(departure_time, maximum_deviation);</div>
|
|
<div class="line"><a id="l05481" name="l05481"></a><span class="lineno"> 5481</span> dimension_->CumulVar(start)->SetMin(start_lb);</div>
|
|
<div class="line"><a id="l05482" name="l05482"></a><span class="lineno"> 5482</span> }</div>
|
|
<div class="line"><a id="l05483" name="l05483"></a><span class="lineno"> 5483</span> <span class="comment">// Second reasoning: end - start - end</span></div>
|
|
<div class="line"><a id="l05484" name="l05484"></a><span class="lineno"> 5484</span> {</div>
|
|
<div class="line"><a id="l05485" name="l05485"></a><span class="lineno"> 5485</span> int64_t departure_time = dimension_->CumulVar(end)->Max();</div>
|
|
<div class="line"><a id="l05486" name="l05486"></a><span class="lineno"> 5486</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = path_.size() - 2; i >= 0; --i) {</div>
|
|
<div class="line"><a id="l05487" name="l05487"></a><span class="lineno"> 5487</span> <span class="keyword">const</span> <span class="keywordtype">int</span> curr_node = path_[i];</div>
|
|
<div class="line"><a id="l05488" name="l05488"></a><span class="lineno"> 5488</span> departure_time =</div>
|
|
<div class="line"><a id="l05489" name="l05489"></a><span class="lineno"> 5489</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::min</a>(<a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(departure_time,</div>
|
|
<div class="line"><a id="l05490" name="l05490"></a><span class="lineno"> 5490</span> dimension_->FixedTransitVar(curr_node)->Min()),</div>
|
|
<div class="line"><a id="l05491" name="l05491"></a><span class="lineno"> 5491</span> dimension_->CumulVar(curr_node)->Max());</div>
|
|
<div class="line"><a id="l05492" name="l05492"></a><span class="lineno"> 5492</span> }</div>
|
|
<div class="line"><a id="l05493" name="l05493"></a><span class="lineno"> 5493</span> <span class="keywordtype">int</span> arrival_time = departure_time;</div>
|
|
<div class="line"><a id="l05494" name="l05494"></a><span class="lineno"> 5494</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i < path_.size(); ++i) {</div>
|
|
<div class="line"><a id="l05495" name="l05495"></a><span class="lineno"> 5495</span> arrival_time =</div>
|
|
<div class="line"><a id="l05496" name="l05496"></a><span class="lineno"> 5496</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(<a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(arrival_time,</div>
|
|
<div class="line"><a id="l05497" name="l05497"></a><span class="lineno"> 5497</span> dimension_->FixedTransitVar(path_[i - 1])->Min()),</div>
|
|
<div class="line"><a id="l05498" name="l05498"></a><span class="lineno"> 5498</span> dimension_->CumulVar(path_[i])->Min());</div>
|
|
<div class="line"><a id="l05499" name="l05499"></a><span class="lineno"> 5499</span> }</div>
|
|
<div class="line"><a id="l05500" name="l05500"></a><span class="lineno"> 5500</span> <span class="keyword">const</span> int64_t span_lb = <a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(arrival_time, departure_time);</div>
|
|
<div class="line"><a id="l05501" name="l05501"></a><span class="lineno"> 5501</span> SetSpanMin(vehicle, span_lb, sum_fixed_transits);</div>
|
|
<div class="line"><a id="l05502" name="l05502"></a><span class="lineno"> 5502</span> <span class="keyword">const</span> int64_t maximum_deviation =</div>
|
|
<div class="line"><a id="l05503" name="l05503"></a><span class="lineno"> 5503</span> <a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(SpanMax(vehicle, sum_fixed_transits), span_lb);</div>
|
|
<div class="line"><a id="l05504" name="l05504"></a><span class="lineno"> 5504</span> dimension_->CumulVar(end)->SetMax(</div>
|
|
<div class="line"><a id="l05505" name="l05505"></a><span class="lineno"> 5505</span> <a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(arrival_time, maximum_deviation));</div>
|
|
<div class="line"><a id="l05506" name="l05506"></a><span class="lineno"> 5506</span> }</div>
|
|
<div class="line"><a id="l05507" name="l05507"></a><span class="lineno"> 5507</span> }</div>
|
|
<div class="line"><a id="l05508" name="l05508"></a><span class="lineno"> 5508</span> </div>
|
|
<div class="line"><a id="l05509" name="l05509"></a><span class="lineno"> 5509</span> <span class="keyword">const</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#af12674b693b7b7cfe271e5b066e10bff">RoutingModel</a>* <span class="keyword">const</span> model_;</div>
|
|
<div class="line"><a id="l05510" name="l05510"></a><span class="lineno"> 5510</span> <span class="keyword">const</span> <a class="code hl_friend" href="classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff">RoutingDimension</a>* <span class="keyword">const</span> dimension_;</div>
|
|
<div class="line"><a id="l05511" name="l05511"></a><span class="lineno"> 5511</span> std::vector<IntVar*> spans_;</div>
|
|
<div class="line"><a id="l05512" name="l05512"></a><span class="lineno"> 5512</span> std::vector<IntVar*> total_slacks_;</div>
|
|
<div class="line"><a id="l05513" name="l05513"></a><span class="lineno"> 5513</span> std::vector<int> path_;</div>
|
|
<div class="line"><a id="l05514" name="l05514"></a><span class="lineno"> 5514</span> std::vector<Demon*> vehicle_demons_;</div>
|
|
<div class="line"><a id="l05515" name="l05515"></a><span class="lineno"> 5515</span>};</div>
|
|
<div class="line"><a id="l05516" name="l05516"></a><span class="lineno"> 5516</span> </div>
|
|
<div class="line"><a id="l05517" name="l05517"></a><span class="lineno"> 5517</span>} <span class="comment">// namespace</span></div>
|
|
<div class="line"><a id="l05518" name="l05518"></a><span class="lineno"> 5518</span> </div>
|
|
<div class="line"><a id="l05519" name="l05519"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_model.html#a4ffedcd1ce5dc6b224edff0b417aad5c"> 5519</a></span><a class="code hl_class" href="classoperations__research_1_1_constraint.html">Constraint</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a4ffedcd1ce5dc6b224edff0b417aad5c">RoutingModel::MakePathSpansAndTotalSlacks</a>(</div>
|
|
<div class="line"><a id="l05520" name="l05520"></a><span class="lineno"> 5520</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* dimension, std::vector<IntVar*> spans,</div>
|
|
<div class="line"><a id="l05521" name="l05521"></a><span class="lineno"> 5521</span> std::vector<IntVar*> total_slacks) {</div>
|
|
<div class="line"><a id="l05522" name="l05522"></a><span class="lineno"> 5522</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(vehicles_, spans.size());</div>
|
|
<div class="line"><a id="l05523" name="l05523"></a><span class="lineno"> 5523</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(vehicles_, total_slacks.size());</div>
|
|
<div class="line"><a id="l05524" name="l05524"></a><span class="lineno"> 5524</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>()-><a class="code hl_function" href="classoperations__research_1_1_solver.html#af5a1f8b1ea0ab0796c8667b9e2ef0ce7">RevAlloc</a>(</div>
|
|
<div class="line"><a id="l05525" name="l05525"></a><span class="lineno"> 5525</span> <span class="keyword">new</span> PathSpansAndTotalSlacks(<span class="keyword">this</span>, dimension, spans, total_slacks));</div>
|
|
<div class="line"><a id="l05526" name="l05526"></a><span class="lineno"> 5526</span>}</div>
|
|
<div class="line"><a id="l05527" name="l05527"></a><span class="lineno"> 5527</span> </div>
|
|
<div class="line"><a id="l05528" name="l05528"></a><span class="lineno"> 5528</span><span class="keyword">const</span> <span class="keywordtype">char</span> <a class="code hl_variable" href="classoperations__research_1_1_routing_model_visitor.html#a3408a1e02997042597b7499dad0cb343">RoutingModelVisitor::kLightElement</a>[] = <span class="stringliteral">"LightElement"</span>;</div>
|
|
<div class="line"><a id="l05529" name="l05529"></a><span class="lineno"> 5529</span><span class="keyword">const</span> <span class="keywordtype">char</span> <a class="code hl_variable" href="classoperations__research_1_1_routing_model_visitor.html#a0ce138792ec79a561f17dd17b2c0610d">RoutingModelVisitor::kLightElement2</a>[] = <span class="stringliteral">"LightElement2"</span>;</div>
|
|
<div class="line"><a id="l05530" name="l05530"></a><span class="lineno"> 5530</span><span class="keyword">const</span> <span class="keywordtype">char</span> <a class="code hl_variable" href="classoperations__research_1_1_routing_model_visitor.html#a22cceffdff8afb41f5d2422ed014d4d0">RoutingModelVisitor::kRemoveValues</a>[] = <span class="stringliteral">"RemoveValues"</span>;</div>
|
|
<div class="line"><a id="l05531" name="l05531"></a><span class="lineno"> 5531</span> </div>
|
|
<div class="line"><a id="l05532" name="l05532"></a><span class="lineno"> 5532</span>RoutingDimension::RoutingDimension(<a class="code hl_class" href="classoperations__research_1_1_routing_model.html">RoutingModel</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>,</div>
|
|
<div class="line"><a id="l05533" name="l05533"></a><span class="lineno"> 5533</span> std::vector<int64_t> vehicle_capacities,</div>
|
|
<div class="line"><a id="l05534" name="l05534"></a><span class="lineno"> 5534</span> <span class="keyword">const</span> std::string& <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>,</div>
|
|
<div class="line"><a id="l05535" name="l05535"></a><span class="lineno"> 5535</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_dimension.html">RoutingDimension</a>* base_dimension)</div>
|
|
<div class="line"><a id="l05536" name="l05536"></a><span class="lineno"> 5536</span> : vehicle_capacities_(<a class="code hl_namespace" href="namespacestd.html">std</a>::move(vehicle_capacities)),</div>
|
|
<div class="line"><a id="l05537" name="l05537"></a><span class="lineno"> 5537</span> base_dimension_(base_dimension),</div>
|
|
<div class="line"><a id="l05538" name="l05538"></a><span class="lineno"> 5538</span> global_span_cost_coefficient_(0),</div>
|
|
<div class="line"><a id="l05539" name="l05539"></a><span class="lineno"> 5539</span> model_(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>),</div>
|
|
<div class="line"><a id="l05540" name="l05540"></a><span class="lineno"> 5540</span> name_(<a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>),</div>
|
|
<div class="line"><a id="l05541" name="l05541"></a><span class="lineno"> 5541</span> global_optimizer_offset_(0) {</div>
|
|
<div class="line"><a id="l05542" name="l05542"></a><span class="lineno"> 5542</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a> != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l05543" name="l05543"></a><span class="lineno"> 5543</span> vehicle_span_upper_bounds_.assign(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->vehicles(),</div>
|
|
<div class="line"><a id="l05544" name="l05544"></a><span class="lineno"> 5544</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>());</div>
|
|
<div class="line"><a id="l05545" name="l05545"></a><span class="lineno"> 5545</span> vehicle_span_cost_coefficients_.assign(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->vehicles(), 0);</div>
|
|
<div class="line"><a id="l05546" name="l05546"></a><span class="lineno"> 5546</span>}</div>
|
|
<div class="line"><a id="l05547" name="l05547"></a><span class="lineno"> 5547</span> </div>
|
|
<div class="line"><a id="l05548" name="l05548"></a><span class="lineno"> 5548</span>RoutingDimension::RoutingDimension(RoutingModel* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>,</div>
|
|
<div class="line"><a id="l05549" name="l05549"></a><span class="lineno"> 5549</span> std::vector<int64_t> vehicle_capacities,</div>
|
|
<div class="line"><a id="l05550" name="l05550"></a><span class="lineno"> 5550</span> <span class="keyword">const</span> std::string& <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>, SelfBased)</div>
|
|
<div class="line"><a id="l05551" name="l05551"></a><span class="lineno"> 5551</span> : RoutingDimension(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, <a class="code hl_namespace" href="namespacestd.html">std</a>::move(vehicle_capacities), <a class="code hl_variable" href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a>, this) {}</div>
|
|
<div class="line"><a id="l05552" name="l05552"></a><span class="lineno"> 5552</span> </div>
|
|
<div class="line"><a id="l05553" name="l05553"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#af42a5771d18b334091cc0f786219fe04"> 5553</a></span><a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#af42a5771d18b334091cc0f786219fe04">RoutingDimension::~RoutingDimension</a>() {</div>
|
|
<div class="line"><a id="l05554" name="l05554"></a><span class="lineno"> 5554</span> cumul_var_piecewise_linear_cost_.clear();</div>
|
|
<div class="line"><a id="l05555" name="l05555"></a><span class="lineno"> 5555</span>}</div>
|
|
<div class="line"><a id="l05556" name="l05556"></a><span class="lineno"> 5556</span> </div>
|
|
<div class="line"><a id="l05557" name="l05557"></a><span class="lineno"> 5557</span><span class="keywordtype">void</span> RoutingDimension::Initialize(</div>
|
|
<div class="line"><a id="l05558" name="l05558"></a><span class="lineno"> 5558</span> <span class="keyword">const</span> std::vector<int>& transit_evaluators,</div>
|
|
<div class="line"><a id="l05559" name="l05559"></a><span class="lineno"> 5559</span> <span class="keyword">const</span> std::vector<int>& state_dependent_transit_evaluators,</div>
|
|
<div class="line"><a id="l05560" name="l05560"></a><span class="lineno"> 5560</span> int64_t slack_max) {</div>
|
|
<div class="line"><a id="l05561" name="l05561"></a><span class="lineno"> 5561</span> InitializeCumuls();</div>
|
|
<div class="line"><a id="l05562" name="l05562"></a><span class="lineno"> 5562</span> InitializeTransits(transit_evaluators, state_dependent_transit_evaluators,</div>
|
|
<div class="line"><a id="l05563" name="l05563"></a><span class="lineno"> 5563</span> slack_max);</div>
|
|
<div class="line"><a id="l05564" name="l05564"></a><span class="lineno"> 5564</span>}</div>
|
|
<div class="line"><a id="l05565" name="l05565"></a><span class="lineno"> 5565</span> </div>
|
|
<div class="line"><a id="l05566" name="l05566"></a><span class="lineno"> 5566</span><span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a id="l05567" name="l05567"></a><span class="lineno"> 5567</span><span class="comment">// Very light version of the RangeLessOrEqual constraint (see ./range_cst.cc).</span></div>
|
|
<div class="line"><a id="l05568" name="l05568"></a><span class="lineno"> 5568</span><span class="comment">// Only performs initial propagation and then checks the compatibility of the</span></div>
|
|
<div class="line"><a id="l05569" name="l05569"></a><span class="lineno"> 5569</span><span class="comment">// variable domains without domain pruning.</span></div>
|
|
<div class="line"><a id="l05570" name="l05570"></a><span class="lineno"> 5570</span><span class="comment">// This is useful when to avoid ping-pong effects with costly constraints</span></div>
|
|
<div class="line"><a id="l05571" name="l05571"></a><span class="lineno"> 5571</span><span class="comment">// such as the PathCumul constraint.</span></div>
|
|
<div class="line"><a id="l05572" name="l05572"></a><span class="lineno"> 5572</span><span class="comment">// This constraint has not been added to the cp library (in range_cst.cc) given</span></div>
|
|
<div class="line"><a id="l05573" name="l05573"></a><span class="lineno"> 5573</span><span class="comment">// it only does checking and no propagation (except the initial propagation)</span></div>
|
|
<div class="line"><a id="l05574" name="l05574"></a><span class="lineno"> 5574</span><span class="comment">// and is only fit for local search, in particular in the context of vehicle</span></div>
|
|
<div class="line"><a id="l05575" name="l05575"></a><span class="lineno"> 5575</span><span class="comment">// routing.</span></div>
|
|
<div class="line"><a id="l05576" name="l05576"></a><span class="lineno"> 5576</span><span class="keyword">class </span>LightRangeLessOrEqual : <span class="keyword">public</span> Constraint {</div>
|
|
<div class="line"><a id="l05577" name="l05577"></a><span class="lineno"> 5577</span> <span class="keyword">public</span>:</div>
|
|
<div class="line"><a id="l05578" name="l05578"></a><span class="lineno"> 5578</span> LightRangeLessOrEqual(Solver* <span class="keyword">const</span> s, IntExpr* <span class="keyword">const</span> l, IntExpr* <span class="keyword">const</span> r);</div>
|
|
<div class="line"><a id="l05579" name="l05579"></a><span class="lineno"> 5579</span> ~LightRangeLessOrEqual()<span class="keyword"> override </span>{}</div>
|
|
<div class="line"><a id="l05580" name="l05580"></a><span class="lineno"> 5580</span> <span class="keywordtype">void</span> Post() <span class="keyword">override</span>;</div>
|
|
<div class="line"><a id="l05581" name="l05581"></a><span class="lineno"> 5581</span> <span class="keywordtype">void</span> InitialPropagate() <span class="keyword">override</span>;</div>
|
|
<div class="line"><a id="l05582" name="l05582"></a><span class="lineno"> 5582</span> std::string DebugString() <span class="keyword">const override</span>;</div>
|
|
<div class="line"><a id="l05583" name="l05583"></a><span class="lineno"> 5583</span> IntVar* Var()<span class="keyword"> override </span>{</div>
|
|
<div class="line"><a id="l05584" name="l05584"></a><span class="lineno"> 5584</span> <span class="keywordflow">return</span> solver()->MakeIsLessOrEqualVar(left_, right_);</div>
|
|
<div class="line"><a id="l05585" name="l05585"></a><span class="lineno"> 5585</span> }</div>
|
|
<div class="line"><a id="l05586" name="l05586"></a><span class="lineno"> 5586</span> <span class="comment">// TODO(user): introduce a kLightLessOrEqual tag.</span></div>
|
|
<div class="line"><a id="l05587" name="l05587"></a><span class="lineno"> 5587</span> <span class="keywordtype">void</span> Accept(ModelVisitor* <span class="keyword">const</span> visitor)<span class="keyword"> const override </span>{</div>
|
|
<div class="line"><a id="l05588" name="l05588"></a><span class="lineno"> 5588</span> visitor->BeginVisitConstraint(<a class="code hl_variable" href="classoperations__research_1_1_model_visitor.html#a764c2bb6842cf7a1a5aedac877295b46">ModelVisitor::kLessOrEqual</a>, <span class="keyword">this</span>);</div>
|
|
<div class="line"><a id="l05589" name="l05589"></a><span class="lineno"> 5589</span> visitor->VisitIntegerExpressionArgument(<a class="code hl_variable" href="classoperations__research_1_1_model_visitor.html#a8e24c7d309e4aaa23eca1c75bd42bdc5">ModelVisitor::kLeftArgument</a>, left_);</div>
|
|
<div class="line"><a id="l05590" name="l05590"></a><span class="lineno"> 5590</span> visitor->VisitIntegerExpressionArgument(<a class="code hl_variable" href="classoperations__research_1_1_model_visitor.html#aaeff643bea5491c9055dc67124d5d3d2">ModelVisitor::kRightArgument</a>,</div>
|
|
<div class="line"><a id="l05591" name="l05591"></a><span class="lineno"> 5591</span> right_);</div>
|
|
<div class="line"><a id="l05592" name="l05592"></a><span class="lineno"> 5592</span> visitor->EndVisitConstraint(<a class="code hl_variable" href="classoperations__research_1_1_model_visitor.html#a764c2bb6842cf7a1a5aedac877295b46">ModelVisitor::kLessOrEqual</a>, <span class="keyword">this</span>);</div>
|
|
<div class="line"><a id="l05593" name="l05593"></a><span class="lineno"> 5593</span> }</div>
|
|
<div class="line"><a id="l05594" name="l05594"></a><span class="lineno"> 5594</span> </div>
|
|
<div class="line"><a id="l05595" name="l05595"></a><span class="lineno"> 5595</span> <span class="keyword">private</span>:</div>
|
|
<div class="line"><a id="l05596" name="l05596"></a><span class="lineno"> 5596</span> <span class="keywordtype">void</span> CheckRange();</div>
|
|
<div class="line"><a id="l05597" name="l05597"></a><span class="lineno"> 5597</span> </div>
|
|
<div class="line"><a id="l05598" name="l05598"></a><span class="lineno"> 5598</span> IntExpr* <span class="keyword">const</span> left_;</div>
|
|
<div class="line"><a id="l05599" name="l05599"></a><span class="lineno"> 5599</span> IntExpr* <span class="keyword">const</span> right_;</div>
|
|
<div class="line"><a id="l05600" name="l05600"></a><span class="lineno"> 5600</span> Demon* demon_;</div>
|
|
<div class="line"><a id="l05601" name="l05601"></a><span class="lineno"> 5601</span>};</div>
|
|
<div class="line"><a id="l05602" name="l05602"></a><span class="lineno"> 5602</span> </div>
|
|
<div class="line"><a id="l05603" name="l05603"></a><span class="lineno"> 5603</span>LightRangeLessOrEqual::LightRangeLessOrEqual(Solver* <span class="keyword">const</span> s, IntExpr* <span class="keyword">const</span> l,</div>
|
|
<div class="line"><a id="l05604" name="l05604"></a><span class="lineno"> 5604</span> IntExpr* <span class="keyword">const</span> r)</div>
|
|
<div class="line"><a id="l05605" name="l05605"></a><span class="lineno"> 5605</span> : Constraint(s), left_(l), right_(r), demon_(nullptr) {}</div>
|
|
<div class="line"><a id="l05606" name="l05606"></a><span class="lineno"> 5606</span> </div>
|
|
<div class="line"><a id="l05607" name="l05607"></a><span class="lineno"> 5607</span><span class="keywordtype">void</span> LightRangeLessOrEqual::Post() {</div>
|
|
<div class="line"><a id="l05608" name="l05608"></a><span class="lineno"> 5608</span> demon_ = <a class="code hl_function" href="namespaceoperations__research.html#aa213d8f884283e0d72712243cbbefa7c">MakeConstraintDemon0</a>(</div>
|
|
<div class="line"><a id="l05609" name="l05609"></a><span class="lineno"> 5609</span> solver(), <span class="keyword">this</span>, &LightRangeLessOrEqual::CheckRange, <span class="stringliteral">"CheckRange"</span>);</div>
|
|
<div class="line"><a id="l05610" name="l05610"></a><span class="lineno"> 5610</span> left_->WhenRange(demon_);</div>
|
|
<div class="line"><a id="l05611" name="l05611"></a><span class="lineno"> 5611</span> right_->WhenRange(demon_);</div>
|
|
<div class="line"><a id="l05612" name="l05612"></a><span class="lineno"> 5612</span>}</div>
|
|
<div class="line"><a id="l05613" name="l05613"></a><span class="lineno"> 5613</span> </div>
|
|
<div class="line"><a id="l05614" name="l05614"></a><span class="lineno"> 5614</span><span class="keywordtype">void</span> LightRangeLessOrEqual::InitialPropagate() {</div>
|
|
<div class="line"><a id="l05615" name="l05615"></a><span class="lineno"> 5615</span> left_->SetMax(right_->Max());</div>
|
|
<div class="line"><a id="l05616" name="l05616"></a><span class="lineno"> 5616</span> right_->SetMin(left_->Min());</div>
|
|
<div class="line"><a id="l05617" name="l05617"></a><span class="lineno"> 5617</span> <span class="keywordflow">if</span> (left_->Max() <= right_->Min()) {</div>
|
|
<div class="line"><a id="l05618" name="l05618"></a><span class="lineno"> 5618</span> demon_-><a class="code hl_function" href="classoperations__research_1_1_demon.html#a0c1ff1e86b1eb08d0f87eab2943dac2a">inhibit</a>(solver());</div>
|
|
<div class="line"><a id="l05619" name="l05619"></a><span class="lineno"> 5619</span> }</div>
|
|
<div class="line"><a id="l05620" name="l05620"></a><span class="lineno"> 5620</span>}</div>
|
|
<div class="line"><a id="l05621" name="l05621"></a><span class="lineno"> 5621</span> </div>
|
|
<div class="line"><a id="l05622" name="l05622"></a><span class="lineno"> 5622</span><span class="keywordtype">void</span> LightRangeLessOrEqual::CheckRange() {</div>
|
|
<div class="line"><a id="l05623" name="l05623"></a><span class="lineno"> 5623</span> <span class="keywordflow">if</span> (left_->Min() > right_->Max()) {</div>
|
|
<div class="line"><a id="l05624" name="l05624"></a><span class="lineno"> 5624</span> solver()->Fail();</div>
|
|
<div class="line"><a id="l05625" name="l05625"></a><span class="lineno"> 5625</span> }</div>
|
|
<div class="line"><a id="l05626" name="l05626"></a><span class="lineno"> 5626</span> <span class="keywordflow">if</span> (left_->Max() <= right_->Min()) {</div>
|
|
<div class="line"><a id="l05627" name="l05627"></a><span class="lineno"> 5627</span> demon_-><a class="code hl_function" href="classoperations__research_1_1_demon.html#a0c1ff1e86b1eb08d0f87eab2943dac2a">inhibit</a>(solver());</div>
|
|
<div class="line"><a id="l05628" name="l05628"></a><span class="lineno"> 5628</span> }</div>
|
|
<div class="line"><a id="l05629" name="l05629"></a><span class="lineno"> 5629</span>}</div>
|
|
<div class="line"><a id="l05630" name="l05630"></a><span class="lineno"> 5630</span> </div>
|
|
<div class="line"><a id="l05631" name="l05631"></a><span class="lineno"> 5631</span>std::string LightRangeLessOrEqual::DebugString()<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l05632" name="l05632"></a><span class="lineno"> 5632</span> <span class="keywordflow">return</span> left_->DebugString() + <span class="stringliteral">" < "</span> + right_->DebugString();</div>
|
|
<div class="line"><a id="l05633" name="l05633"></a><span class="lineno"> 5633</span>}</div>
|
|
<div class="line"><a id="l05634" name="l05634"></a><span class="lineno"> 5634</span> </div>
|
|
<div class="line"><a id="l05635" name="l05635"></a><span class="lineno"> 5635</span>} <span class="comment">// namespace</span></div>
|
|
<div class="line"><a id="l05636" name="l05636"></a><span class="lineno"> 5636</span> </div>
|
|
<div class="line"><a id="l05637" name="l05637"></a><span class="lineno"> 5637</span><span class="keywordtype">void</span> RoutingDimension::InitializeCumuls() {</div>
|
|
<div class="line"><a id="l05638" name="l05638"></a><span class="lineno"> 5638</span> Solver* <span class="keyword">const</span> solver = model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>();</div>
|
|
<div class="line"><a id="l05639" name="l05639"></a><span class="lineno"> 5639</span> <span class="keyword">const</span> <span class="keywordtype">int</span> size = model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a572bd92c25ebc67c72137fd59e53f6d6">Size</a>() + model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>();</div>
|
|
<div class="line"><a id="l05640" name="l05640"></a><span class="lineno"> 5640</span> <span class="keyword">const</span> <span class="keyword">auto</span> capacity_range = std::minmax_element(vehicle_capacities_.begin(),</div>
|
|
<div class="line"><a id="l05641" name="l05641"></a><span class="lineno"> 5641</span> vehicle_capacities_.end());</div>
|
|
<div class="line"><a id="l05642" name="l05642"></a><span class="lineno"> 5642</span> <span class="keyword">const</span> int64_t min_capacity = *capacity_range.first;</div>
|
|
<div class="line"><a id="l05643" name="l05643"></a><span class="lineno"> 5643</span> <a class="code hl_define" href="base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9">CHECK_GE</a>(min_capacity, 0);</div>
|
|
<div class="line"><a id="l05644" name="l05644"></a><span class="lineno"> 5644</span> <span class="keyword">const</span> int64_t max_capacity = *capacity_range.second;</div>
|
|
<div class="line"><a id="l05645" name="l05645"></a><span class="lineno"> 5645</span> solver->MakeIntVarArray(size, 0, max_capacity, name_, &cumuls_);</div>
|
|
<div class="line"><a id="l05646" name="l05646"></a><span class="lineno"> 5646</span> <span class="comment">// Refine the min/max for vehicle start/ends based on vehicle capacities.</span></div>
|
|
<div class="line"><a id="l05647" name="l05647"></a><span class="lineno"> 5647</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> v = 0; v < model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); v++) {</div>
|
|
<div class="line"><a id="l05648" name="l05648"></a><span class="lineno"> 5648</span> <span class="keyword">const</span> int64_t vehicle_capacity = vehicle_capacities_[v];</div>
|
|
<div class="line"><a id="l05649" name="l05649"></a><span class="lineno"> 5649</span> cumuls_[model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(v)]->SetMax(vehicle_capacity);</div>
|
|
<div class="line"><a id="l05650" name="l05650"></a><span class="lineno"> 5650</span> cumuls_[model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afb80fd36c1fb57d2db049403483e2074">End</a>(v)]->SetMax(vehicle_capacity);</div>
|
|
<div class="line"><a id="l05651" name="l05651"></a><span class="lineno"> 5651</span> }</div>
|
|
<div class="line"><a id="l05652" name="l05652"></a><span class="lineno"> 5652</span> </div>
|
|
<div class="line"><a id="l05653" name="l05653"></a><span class="lineno"> 5653</span> forbidden_intervals_.resize(size);</div>
|
|
<div class="line"><a id="l05654" name="l05654"></a><span class="lineno"> 5654</span> capacity_vars_.clear();</div>
|
|
<div class="line"><a id="l05655" name="l05655"></a><span class="lineno"> 5655</span> <span class="keywordflow">if</span> (min_capacity != max_capacity) {</div>
|
|
<div class="line"><a id="l05656" name="l05656"></a><span class="lineno"> 5656</span> solver->MakeIntVarArray(size, 0, <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(),</div>
|
|
<div class="line"><a id="l05657" name="l05657"></a><span class="lineno"> 5657</span> &capacity_vars_);</div>
|
|
<div class="line"><a id="l05658" name="l05658"></a><span class="lineno"> 5658</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < size; ++i) {</div>
|
|
<div class="line"><a id="l05659" name="l05659"></a><span class="lineno"> 5659</span> IntVar* <span class="keyword">const</span> capacity_var = capacity_vars_[i];</div>
|
|
<div class="line"><a id="l05660" name="l05660"></a><span class="lineno"> 5660</span> <span class="keywordflow">if</span> (i < model_->Size()) {</div>
|
|
<div class="line"><a id="l05661" name="l05661"></a><span class="lineno"> 5661</span> IntVar* <span class="keyword">const</span> capacity_active = solver->MakeBoolVar();</div>
|
|
<div class="line"><a id="l05662" name="l05662"></a><span class="lineno"> 5662</span> solver->AddConstraint(</div>
|
|
<div class="line"><a id="l05663" name="l05663"></a><span class="lineno"> 5663</span> solver->MakeLessOrEqual(model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab1d54f34a26afd08eeef25e8725dd7c2">ActiveVar</a>(i), capacity_active));</div>
|
|
<div class="line"><a id="l05664" name="l05664"></a><span class="lineno"> 5664</span> solver->AddConstraint(solver->MakeIsLessOrEqualCt(</div>
|
|
<div class="line"><a id="l05665" name="l05665"></a><span class="lineno"> 5665</span> cumuls_[i], capacity_var, capacity_active));</div>
|
|
<div class="line"><a id="l05666" name="l05666"></a><span class="lineno"> 5666</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l05667" name="l05667"></a><span class="lineno"> 5667</span> solver->AddConstraint(</div>
|
|
<div class="line"><a id="l05668" name="l05668"></a><span class="lineno"> 5668</span> solver->MakeLessOrEqual(cumuls_[i], capacity_var));</div>
|
|
<div class="line"><a id="l05669" name="l05669"></a><span class="lineno"> 5669</span> }</div>
|
|
<div class="line"><a id="l05670" name="l05670"></a><span class="lineno"> 5670</span> }</div>
|
|
<div class="line"><a id="l05671" name="l05671"></a><span class="lineno"> 5671</span> }</div>
|
|
<div class="line"><a id="l05672" name="l05672"></a><span class="lineno"> 5672</span>}</div>
|
|
<div class="line"><a id="l05673" name="l05673"></a><span class="lineno"> 5673</span> </div>
|
|
<div class="line"><a id="l05674" name="l05674"></a><span class="lineno"> 5674</span><span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a id="l05675" name="l05675"></a><span class="lineno"> 5675</span><span class="keyword">template</span> <<span class="keywordtype">int</span>64_t value></div>
|
|
<div class="line"><a id="l05676" name="l05676"></a><span class="lineno"> 5676</span>int64_t IthElementOrValue(<span class="keyword">const</span> std::vector<int64_t>& v, int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>) {</div>
|
|
<div class="line"><a id="l05677" name="l05677"></a><span class="lineno"> 5677</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> >= 0 ? v[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>] : <a class="code hl_variable" href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a>;</div>
|
|
<div class="line"><a id="l05678" name="l05678"></a><span class="lineno"> 5678</span>}</div>
|
|
<div class="line"><a id="l05679" name="l05679"></a><span class="lineno"> 5679</span> </div>
|
|
<div class="line"><a id="l05680" name="l05680"></a><span class="lineno"> 5680</span><span class="keywordtype">void</span> ComputeTransitClasses(<span class="keyword">const</span> std::vector<int>& evaluator_indices,</div>
|
|
<div class="line"><a id="l05681" name="l05681"></a><span class="lineno"> 5681</span> std::vector<int>* class_evaluators,</div>
|
|
<div class="line"><a id="l05682" name="l05682"></a><span class="lineno"> 5682</span> std::vector<int64_t>* vehicle_to_class) {</div>
|
|
<div class="line"><a id="l05683" name="l05683"></a><span class="lineno"> 5683</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(class_evaluators != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l05684" name="l05684"></a><span class="lineno"> 5684</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(vehicle_to_class != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l05685" name="l05685"></a><span class="lineno"> 5685</span> class_evaluators->clear();</div>
|
|
<div class="line"><a id="l05686" name="l05686"></a><span class="lineno"> 5686</span> vehicle_to_class->resize(evaluator_indices.size(), -1);</div>
|
|
<div class="line"><a id="l05687" name="l05687"></a><span class="lineno"> 5687</span> absl::flat_hash_map<int, int64_t> evaluator_to_class;</div>
|
|
<div class="line"><a id="l05688" name="l05688"></a><span class="lineno"> 5688</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < evaluator_indices.size(); ++i) {</div>
|
|
<div class="line"><a id="l05689" name="l05689"></a><span class="lineno"> 5689</span> <span class="keyword">const</span> <span class="keywordtype">int</span> evaluator_index = evaluator_indices[i];</div>
|
|
<div class="line"><a id="l05690" name="l05690"></a><span class="lineno"> 5690</span> <span class="keywordtype">int</span> evaluator_class = -1;</div>
|
|
<div class="line"><a id="l05691" name="l05691"></a><span class="lineno"> 5691</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="namespacegtl.html#a6a4238d2e35cf819a8e83d60d331ea64">gtl::FindCopy</a>(evaluator_to_class, evaluator_index, &evaluator_class)) {</div>
|
|
<div class="line"><a id="l05692" name="l05692"></a><span class="lineno"> 5692</span> evaluator_class = class_evaluators->size();</div>
|
|
<div class="line"><a id="l05693" name="l05693"></a><span class="lineno"> 5693</span> evaluator_to_class[evaluator_index] = evaluator_class;</div>
|
|
<div class="line"><a id="l05694" name="l05694"></a><span class="lineno"> 5694</span> class_evaluators->push_back(evaluator_index);</div>
|
|
<div class="line"><a id="l05695" name="l05695"></a><span class="lineno"> 5695</span> }</div>
|
|
<div class="line"><a id="l05696" name="l05696"></a><span class="lineno"> 5696</span> (*vehicle_to_class)[i] = evaluator_class;</div>
|
|
<div class="line"><a id="l05697" name="l05697"></a><span class="lineno"> 5697</span> }</div>
|
|
<div class="line"><a id="l05698" name="l05698"></a><span class="lineno"> 5698</span>}</div>
|
|
<div class="line"><a id="l05699" name="l05699"></a><span class="lineno"> 5699</span>} <span class="comment">// namespace</span></div>
|
|
<div class="line"><a id="l05700" name="l05700"></a><span class="lineno"> 5700</span> </div>
|
|
<div class="line"><a id="l05701" name="l05701"></a><span class="lineno"> 5701</span><span class="keywordtype">void</span> RoutingDimension::InitializeTransitVariables(int64_t slack_max) {</div>
|
|
<div class="line"><a id="l05702" name="l05702"></a><span class="lineno"> 5702</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(!class_evaluators_.empty());</div>
|
|
<div class="line"><a id="l05703" name="l05703"></a><span class="lineno"> 5703</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(base_dimension_ == <span class="keyword">nullptr</span> ||</div>
|
|
<div class="line"><a id="l05704" name="l05704"></a><span class="lineno"> 5704</span> !state_dependent_class_evaluators_.empty());</div>
|
|
<div class="line"><a id="l05705" name="l05705"></a><span class="lineno"> 5705</span> </div>
|
|
<div class="line"><a id="l05706" name="l05706"></a><span class="lineno"> 5706</span> Solver* <span class="keyword">const</span> solver = model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>();</div>
|
|
<div class="line"><a id="l05707" name="l05707"></a><span class="lineno"> 5707</span> <span class="keyword">const</span> <span class="keywordtype">int</span> size = model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a572bd92c25ebc67c72137fd59e53f6d6">Size</a>();</div>
|
|
<div class="line"><a id="l05708" name="l05708"></a><span class="lineno"> 5708</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_solver.html#ae37d3a68746841403f335654370e8560">Solver::IndexEvaluator1</a> dependent_vehicle_class_function =</div>
|
|
<div class="line"><a id="l05709" name="l05709"></a><span class="lineno"> 5709</span> [<span class="keyword">this</span>](<span class="keywordtype">int</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>) {</div>
|
|
<div class="line"><a id="l05710" name="l05710"></a><span class="lineno"> 5710</span> <span class="keywordflow">return</span> (0 <= <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> && <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < state_dependent_vehicle_to_class_.size())</div>
|
|
<div class="line"><a id="l05711" name="l05711"></a><span class="lineno"> 5711</span> ? state_dependent_vehicle_to_class_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>]</div>
|
|
<div class="line"><a id="l05712" name="l05712"></a><span class="lineno"> 5712</span> : state_dependent_class_evaluators_.size();</div>
|
|
<div class="line"><a id="l05713" name="l05713"></a><span class="lineno"> 5713</span> };</div>
|
|
<div class="line"><a id="l05714" name="l05714"></a><span class="lineno"> 5714</span> <span class="keyword">const</span> std::string slack_name = name_ + <span class="stringliteral">" slack"</span>;</div>
|
|
<div class="line"><a id="l05715" name="l05715"></a><span class="lineno"> 5715</span> <span class="keyword">const</span> std::string transit_name = name_ + <span class="stringliteral">" fixed transit"</span>;</div>
|
|
<div class="line"><a id="l05716" name="l05716"></a><span class="lineno"> 5716</span> </div>
|
|
<div class="line"><a id="l05717" name="l05717"></a><span class="lineno"> 5717</span> <span class="keywordflow">for</span> (int64_t i = 0; i < size; ++i) {</div>
|
|
<div class="line"><a id="l05718" name="l05718"></a><span class="lineno"> 5718</span> fixed_transits_[i] = solver->MakeIntVar(<a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits<int64_t>::min</a>(),</div>
|
|
<div class="line"><a id="l05719" name="l05719"></a><span class="lineno"> 5719</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>(),</div>
|
|
<div class="line"><a id="l05720" name="l05720"></a><span class="lineno"> 5720</span> absl::StrCat(transit_name, i));</div>
|
|
<div class="line"><a id="l05721" name="l05721"></a><span class="lineno"> 5721</span> <span class="comment">// Setting dependent_transits_[i].</span></div>
|
|
<div class="line"><a id="l05722" name="l05722"></a><span class="lineno"> 5722</span> <span class="keywordflow">if</span> (base_dimension_ != <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l05723" name="l05723"></a><span class="lineno"> 5723</span> <span class="keywordflow">if</span> (state_dependent_class_evaluators_.size() == 1) {</div>
|
|
<div class="line"><a id="l05724" name="l05724"></a><span class="lineno"> 5724</span> std::vector<IntVar*> transition_variables(cumuls_.size(), <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l05725" name="l05725"></a><span class="lineno"> 5725</span> <span class="keywordflow">for</span> (int64_t j = 0; j < cumuls_.size(); ++j) {</div>
|
|
<div class="line"><a id="l05726" name="l05726"></a><span class="lineno"> 5726</span> transition_variables[j] =</div>
|
|
<div class="line"><a id="l05727" name="l05727"></a><span class="lineno"> 5727</span> MakeRangeMakeElementExpr(</div>
|
|
<div class="line"><a id="l05728" name="l05728"></a><span class="lineno"> 5728</span> model_</div>
|
|
<div class="line"><a id="l05729" name="l05729"></a><span class="lineno"> 5729</span> ->StateDependentTransitCallback(</div>
|
|
<div class="line"><a id="l05730" name="l05730"></a><span class="lineno"> 5730</span> state_dependent_class_evaluators_[0])(i, j)</div>
|
|
<div class="line"><a id="l05731" name="l05731"></a><span class="lineno"> 5731</span> .transit,</div>
|
|
<div class="line"><a id="l05732" name="l05732"></a><span class="lineno"> 5732</span> base_dimension_-><a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a3a71e48b4ed287752b9d9d9f7086ec7d">CumulVar</a>(i), solver)</div>
|
|
<div class="line"><a id="l05733" name="l05733"></a><span class="lineno"> 5733</span> ->Var();</div>
|
|
<div class="line"><a id="l05734" name="l05734"></a><span class="lineno"> 5734</span> }</div>
|
|
<div class="line"><a id="l05735" name="l05735"></a><span class="lineno"> 5735</span> dependent_transits_[i] =</div>
|
|
<div class="line"><a id="l05736" name="l05736"></a><span class="lineno"> 5736</span> solver->MakeElement(transition_variables, model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(i))</div>
|
|
<div class="line"><a id="l05737" name="l05737"></a><span class="lineno"> 5737</span> ->Var();</div>
|
|
<div class="line"><a id="l05738" name="l05738"></a><span class="lineno"> 5738</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l05739" name="l05739"></a><span class="lineno"> 5739</span> IntVar* <span class="keyword">const</span> vehicle_class_var =</div>
|
|
<div class="line"><a id="l05740" name="l05740"></a><span class="lineno"> 5740</span> solver</div>
|
|
<div class="line"><a id="l05741" name="l05741"></a><span class="lineno"> 5741</span> ->MakeElement(dependent_vehicle_class_function,</div>
|
|
<div class="line"><a id="l05742" name="l05742"></a><span class="lineno"> 5742</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">VehicleVar</a>(i))</div>
|
|
<div class="line"><a id="l05743" name="l05743"></a><span class="lineno"> 5743</span> ->Var();</div>
|
|
<div class="line"><a id="l05744" name="l05744"></a><span class="lineno"> 5744</span> std::vector<IntVar*> transit_for_vehicle;</div>
|
|
<div class="line"><a id="l05745" name="l05745"></a><span class="lineno"> 5745</span> transit_for_vehicle.reserve(state_dependent_class_evaluators_.size() +</div>
|
|
<div class="line"><a id="l05746" name="l05746"></a><span class="lineno"> 5746</span> 1);</div>
|
|
<div class="line"><a id="l05747" name="l05747"></a><span class="lineno"> 5747</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> evaluator : state_dependent_class_evaluators_) {</div>
|
|
<div class="line"><a id="l05748" name="l05748"></a><span class="lineno"> 5748</span> std::vector<IntVar*> transition_variables(cumuls_.size(), <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l05749" name="l05749"></a><span class="lineno"> 5749</span> <span class="keywordflow">for</span> (int64_t j = 0; j < cumuls_.size(); ++j) {</div>
|
|
<div class="line"><a id="l05750" name="l05750"></a><span class="lineno"> 5750</span> transition_variables[j] =</div>
|
|
<div class="line"><a id="l05751" name="l05751"></a><span class="lineno"> 5751</span> MakeRangeMakeElementExpr(</div>
|
|
<div class="line"><a id="l05752" name="l05752"></a><span class="lineno"> 5752</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a903045a090a5c25dfd55fafeec7678ca">StateDependentTransitCallback</a>(evaluator)(i, j)</div>
|
|
<div class="line"><a id="l05753" name="l05753"></a><span class="lineno"> 5753</span> .transit,</div>
|
|
<div class="line"><a id="l05754" name="l05754"></a><span class="lineno"> 5754</span> base_dimension_-><a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a3a71e48b4ed287752b9d9d9f7086ec7d">CumulVar</a>(i), solver)</div>
|
|
<div class="line"><a id="l05755" name="l05755"></a><span class="lineno"> 5755</span> ->Var();</div>
|
|
<div class="line"><a id="l05756" name="l05756"></a><span class="lineno"> 5756</span> }</div>
|
|
<div class="line"><a id="l05757" name="l05757"></a><span class="lineno"> 5757</span> transit_for_vehicle.push_back(</div>
|
|
<div class="line"><a id="l05758" name="l05758"></a><span class="lineno"> 5758</span> solver->MakeElement(transition_variables, model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(i))</div>
|
|
<div class="line"><a id="l05759" name="l05759"></a><span class="lineno"> 5759</span> ->Var());</div>
|
|
<div class="line"><a id="l05760" name="l05760"></a><span class="lineno"> 5760</span> }</div>
|
|
<div class="line"><a id="l05761" name="l05761"></a><span class="lineno"> 5761</span> transit_for_vehicle.push_back(solver->MakeIntConst(0));</div>
|
|
<div class="line"><a id="l05762" name="l05762"></a><span class="lineno"> 5762</span> dependent_transits_[i] =</div>
|
|
<div class="line"><a id="l05763" name="l05763"></a><span class="lineno"> 5763</span> solver->MakeElement(transit_for_vehicle, vehicle_class_var)->Var();</div>
|
|
<div class="line"><a id="l05764" name="l05764"></a><span class="lineno"> 5764</span> }</div>
|
|
<div class="line"><a id="l05765" name="l05765"></a><span class="lineno"> 5765</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l05766" name="l05766"></a><span class="lineno"> 5766</span> dependent_transits_[i] = solver->MakeIntConst(0);</div>
|
|
<div class="line"><a id="l05767" name="l05767"></a><span class="lineno"> 5767</span> }</div>
|
|
<div class="line"><a id="l05768" name="l05768"></a><span class="lineno"> 5768</span> </div>
|
|
<div class="line"><a id="l05769" name="l05769"></a><span class="lineno"> 5769</span> <span class="comment">// Summing fixed transits, dependent transits and the slack.</span></div>
|
|
<div class="line"><a id="l05770" name="l05770"></a><span class="lineno"> 5770</span> IntExpr* transit_expr = fixed_transits_[i];</div>
|
|
<div class="line"><a id="l05771" name="l05771"></a><span class="lineno"> 5771</span> <span class="keywordflow">if</span> (dependent_transits_[i]->Min() != 0 ||</div>
|
|
<div class="line"><a id="l05772" name="l05772"></a><span class="lineno"> 5772</span> dependent_transits_[i]->Max() != 0) {</div>
|
|
<div class="line"><a id="l05773" name="l05773"></a><span class="lineno"> 5773</span> transit_expr = solver->MakeSum(transit_expr, dependent_transits_[i]);</div>
|
|
<div class="line"><a id="l05774" name="l05774"></a><span class="lineno"> 5774</span> }</div>
|
|
<div class="line"><a id="l05775" name="l05775"></a><span class="lineno"> 5775</span> </div>
|
|
<div class="line"><a id="l05776" name="l05776"></a><span class="lineno"> 5776</span> <span class="keywordflow">if</span> (slack_max == 0) {</div>
|
|
<div class="line"><a id="l05777" name="l05777"></a><span class="lineno"> 5777</span> slacks_[i] = solver->MakeIntConst(0);</div>
|
|
<div class="line"><a id="l05778" name="l05778"></a><span class="lineno"> 5778</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l05779" name="l05779"></a><span class="lineno"> 5779</span> slacks_[i] =</div>
|
|
<div class="line"><a id="l05780" name="l05780"></a><span class="lineno"> 5780</span> solver->MakeIntVar(0, slack_max, absl::StrCat(slack_name, i));</div>
|
|
<div class="line"><a id="l05781" name="l05781"></a><span class="lineno"> 5781</span> transit_expr = solver->MakeSum(slacks_[i], transit_expr);</div>
|
|
<div class="line"><a id="l05782" name="l05782"></a><span class="lineno"> 5782</span> }</div>
|
|
<div class="line"><a id="l05783" name="l05783"></a><span class="lineno"> 5783</span> transits_[i] = transit_expr->Var();</div>
|
|
<div class="line"><a id="l05784" name="l05784"></a><span class="lineno"> 5784</span> }</div>
|
|
<div class="line"><a id="l05785" name="l05785"></a><span class="lineno"> 5785</span>}</div>
|
|
<div class="line"><a id="l05786" name="l05786"></a><span class="lineno"> 5786</span> </div>
|
|
<div class="line"><a id="l05787" name="l05787"></a><span class="lineno"> 5787</span><span class="keywordtype">void</span> RoutingDimension::InitializeTransits(</div>
|
|
<div class="line"><a id="l05788" name="l05788"></a><span class="lineno"> 5788</span> <span class="keyword">const</span> std::vector<int>& transit_evaluators,</div>
|
|
<div class="line"><a id="l05789" name="l05789"></a><span class="lineno"> 5789</span> <span class="keyword">const</span> std::vector<int>& state_dependent_transit_evaluators,</div>
|
|
<div class="line"><a id="l05790" name="l05790"></a><span class="lineno"> 5790</span> int64_t slack_max) {</div>
|
|
<div class="line"><a id="l05791" name="l05791"></a><span class="lineno"> 5791</span> <a class="code hl_define" href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a>(model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(), transit_evaluators.size());</div>
|
|
<div class="line"><a id="l05792" name="l05792"></a><span class="lineno"> 5792</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(base_dimension_ == <span class="keyword">nullptr</span> ||</div>
|
|
<div class="line"><a id="l05793" name="l05793"></a><span class="lineno"> 5793</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>() == state_dependent_transit_evaluators.size());</div>
|
|
<div class="line"><a id="l05794" name="l05794"></a><span class="lineno"> 5794</span> <span class="keyword">const</span> <span class="keywordtype">int</span> size = model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a572bd92c25ebc67c72137fd59e53f6d6">Size</a>();</div>
|
|
<div class="line"><a id="l05795" name="l05795"></a><span class="lineno"> 5795</span> transits_.resize(size, <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l05796" name="l05796"></a><span class="lineno"> 5796</span> fixed_transits_.resize(size, <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l05797" name="l05797"></a><span class="lineno"> 5797</span> slacks_.resize(size, <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l05798" name="l05798"></a><span class="lineno"> 5798</span> dependent_transits_.resize(size, <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l05799" name="l05799"></a><span class="lineno"> 5799</span> ComputeTransitClasses(transit_evaluators, &class_evaluators_,</div>
|
|
<div class="line"><a id="l05800" name="l05800"></a><span class="lineno"> 5800</span> &vehicle_to_class_);</div>
|
|
<div class="line"><a id="l05801" name="l05801"></a><span class="lineno"> 5801</span> <span class="keywordflow">if</span> (base_dimension_ != <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l05802" name="l05802"></a><span class="lineno"> 5802</span> ComputeTransitClasses(state_dependent_transit_evaluators,</div>
|
|
<div class="line"><a id="l05803" name="l05803"></a><span class="lineno"> 5803</span> &state_dependent_class_evaluators_,</div>
|
|
<div class="line"><a id="l05804" name="l05804"></a><span class="lineno"> 5804</span> &state_dependent_vehicle_to_class_);</div>
|
|
<div class="line"><a id="l05805" name="l05805"></a><span class="lineno"> 5805</span> }</div>
|
|
<div class="line"><a id="l05806" name="l05806"></a><span class="lineno"> 5806</span> </div>
|
|
<div class="line"><a id="l05807" name="l05807"></a><span class="lineno"> 5807</span> InitializeTransitVariables(slack_max);</div>
|
|
<div class="line"><a id="l05808" name="l05808"></a><span class="lineno"> 5808</span>}</div>
|
|
<div class="line"><a id="l05809" name="l05809"></a><span class="lineno"> 5809</span> </div>
|
|
<div class="line"><a id="l05810" name="l05810"></a><span class="lineno"><a class="line" href="namespaceoperations__research.html#aae315ffb47820060e3fa070260434118"> 5810</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="namespaceoperations__research.html#aae315ffb47820060e3fa070260434118">FillPathEvaluation</a>(<span class="keyword">const</span> std::vector<int64_t>& path,</div>
|
|
<div class="line"><a id="l05811" name="l05811"></a><span class="lineno"> 5811</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_model.html#a5fa8aee5b0c67072dbbb03f1899ec60a">RoutingModel::TransitCallback2</a>& evaluator,</div>
|
|
<div class="line"><a id="l05812" name="l05812"></a><span class="lineno"> 5812</span> std::vector<int64_t>* values) {</div>
|
|
<div class="line"><a id="l05813" name="l05813"></a><span class="lineno"> 5813</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_nodes = path.size();</div>
|
|
<div class="line"><a id="l05814" name="l05814"></a><span class="lineno"> 5814</span> values->resize(num_nodes - 1);</div>
|
|
<div class="line"><a id="l05815" name="l05815"></a><span class="lineno"> 5815</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < num_nodes - 1; ++i) {</div>
|
|
<div class="line"><a id="l05816" name="l05816"></a><span class="lineno"> 5816</span> (*values)[i] = evaluator(path[i], path[i + 1]);</div>
|
|
<div class="line"><a id="l05817" name="l05817"></a><span class="lineno"> 5817</span> }</div>
|
|
<div class="line"><a id="l05818" name="l05818"></a><span class="lineno"> 5818</span>}</div>
|
|
<div class="line"><a id="l05819" name="l05819"></a><span class="lineno"> 5819</span> </div>
|
|
<div class="line"><a id="l05820" name="l05820"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_type_regulations_checker.html#a7745da6edcf25f61956a75b5bb3a7080"> 5820</a></span><a class="code hl_function" href="classoperations__research_1_1_type_regulations_checker.html#a7745da6edcf25f61956a75b5bb3a7080">TypeRegulationsChecker::TypeRegulationsChecker</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_model.html">RoutingModel</a>& <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>)</div>
|
|
<div class="line"><a id="l05821" name="l05821"></a><span class="lineno"> 5821</span> : model_(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>), occurrences_of_type_(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>.GetNumberOfVisitTypes()) {}</div>
|
|
<div class="line"><a id="l05822" name="l05822"></a><span class="lineno"> 5822</span> </div>
|
|
<div class="line"><a id="l05823" name="l05823"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_type_regulations_checker.html#a74fa9fd5626d4013ab5e2bc408c27f0e"> 5823</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_type_regulations_checker.html#a74fa9fd5626d4013ab5e2bc408c27f0e">TypeRegulationsChecker::CheckVehicle</a>(</div>
|
|
<div class="line"><a id="l05824" name="l05824"></a><span class="lineno"> 5824</span> <span class="keywordtype">int</span> vehicle, <span class="keyword">const</span> std::function<int64_t(int64_t)>& next_accessor) {</div>
|
|
<div class="line"><a id="l05825" name="l05825"></a><span class="lineno"> 5825</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classoperations__research_1_1_type_regulations_checker.html#a1698ad93b76ebfc58a0e1a2771e4b75c">HasRegulationsToCheck</a>()) {</div>
|
|
<div class="line"><a id="l05826" name="l05826"></a><span class="lineno"> 5826</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l05827" name="l05827"></a><span class="lineno"> 5827</span> }</div>
|
|
<div class="line"><a id="l05828" name="l05828"></a><span class="lineno"> 5828</span> </div>
|
|
<div class="line"><a id="l05829" name="l05829"></a><span class="lineno"> 5829</span> <a class="code hl_function" href="classoperations__research_1_1_type_regulations_checker.html#aab77529dea185cbc2341ac96b6be72ee">InitializeCheck</a>(vehicle, next_accessor);</div>
|
|
<div class="line"><a id="l05830" name="l05830"></a><span class="lineno"> 5830</span> </div>
|
|
<div class="line"><a id="l05831" name="l05831"></a><span class="lineno"> 5831</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> pos = 0; pos < current_route_visits_.size(); pos++) {</div>
|
|
<div class="line"><a id="l05832" name="l05832"></a><span class="lineno"> 5832</span> <span class="keyword">const</span> int64_t current_visit = current_route_visits_[pos];</div>
|
|
<div class="line"><a id="l05833" name="l05833"></a><span class="lineno"> 5833</span> <span class="keyword">const</span> <span class="keywordtype">int</span> type = <a class="code hl_variable" href="classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5">model_</a>.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5ae82715107922af5fbc18f854d58026">GetVisitType</a>(current_visit);</div>
|
|
<div class="line"><a id="l05834" name="l05834"></a><span class="lineno"> 5834</span> <span class="keywordflow">if</span> (type < 0) {</div>
|
|
<div class="line"><a id="l05835" name="l05835"></a><span class="lineno"> 5835</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l05836" name="l05836"></a><span class="lineno"> 5836</span> }</div>
|
|
<div class="line"><a id="l05837" name="l05837"></a><span class="lineno"> 5837</span> <span class="keyword">const</span> <a class="code hl_enumeration" href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059">VisitTypePolicy</a> policy = <a class="code hl_variable" href="classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5">model_</a>.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aeb6c785d9ebc792b3c6eda788a6dfdf0">GetVisitTypePolicy</a>(current_visit);</div>
|
|
<div class="line"><a id="l05838" name="l05838"></a><span class="lineno"> 5838</span> </div>
|
|
<div class="line"><a id="l05839" name="l05839"></a><span class="lineno"> 5839</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(type, occurrences_of_type_.size());</div>
|
|
<div class="line"><a id="l05840" name="l05840"></a><span class="lineno"> 5840</span> <span class="keywordtype">int</span>& num_type_added = occurrences_of_type_[type].num_type_added_to_vehicle;</div>
|
|
<div class="line"><a id="l05841" name="l05841"></a><span class="lineno"> 5841</span> <span class="keywordtype">int</span>& num_type_removed =</div>
|
|
<div class="line"><a id="l05842" name="l05842"></a><span class="lineno"> 5842</span> occurrences_of_type_[type].num_type_removed_from_vehicle;</div>
|
|
<div class="line"><a id="l05843" name="l05843"></a><span class="lineno"> 5843</span> <a class="code hl_define" href="base_2logging_8h.html#a4395e95bab44e222cb2e77251017a0e2">DCHECK_LE</a>(num_type_removed, num_type_added);</div>
|
|
<div class="line"><a id="l05844" name="l05844"></a><span class="lineno"> 5844</span> <span class="keywordflow">if</span> (policy == <a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a5b57570c52e974c761a9b08c1fc7e8ab">RoutingModel::ADDED_TYPE_REMOVED_FROM_VEHICLE</a> &&</div>
|
|
<div class="line"><a id="l05845" name="l05845"></a><span class="lineno"> 5845</span> num_type_removed == num_type_added) {</div>
|
|
<div class="line"><a id="l05846" name="l05846"></a><span class="lineno"> 5846</span> <span class="comment">// The type is not actually being removed as all added types have already</span></div>
|
|
<div class="line"><a id="l05847" name="l05847"></a><span class="lineno"> 5847</span> <span class="comment">// been removed.</span></div>
|
|
<div class="line"><a id="l05848" name="l05848"></a><span class="lineno"> 5848</span> <span class="keywordflow">continue</span>;</div>
|
|
<div class="line"><a id="l05849" name="l05849"></a><span class="lineno"> 5849</span> }</div>
|
|
<div class="line"><a id="l05850" name="l05850"></a><span class="lineno"> 5850</span> </div>
|
|
<div class="line"><a id="l05851" name="l05851"></a><span class="lineno"> 5851</span> <span class="keywordflow">if</span> (!<a class="code hl_function" href="classoperations__research_1_1_type_regulations_checker.html#a4d6ef97994588af94176c027b321bcb6">CheckTypeRegulations</a>(type, policy, pos)) {</div>
|
|
<div class="line"><a id="l05852" name="l05852"></a><span class="lineno"> 5852</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l05853" name="l05853"></a><span class="lineno"> 5853</span> }</div>
|
|
<div class="line"><a id="l05854" name="l05854"></a><span class="lineno"> 5854</span> <span class="comment">// Update count of type based on the visit policy.</span></div>
|
|
<div class="line"><a id="l05855" name="l05855"></a><span class="lineno"> 5855</span> <span class="keywordflow">if</span> (policy == VisitTypePolicy::TYPE_ADDED_TO_VEHICLE ||</div>
|
|
<div class="line"><a id="l05856" name="l05856"></a><span class="lineno"> 5856</span> policy == VisitTypePolicy::TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED) {</div>
|
|
<div class="line"><a id="l05857" name="l05857"></a><span class="lineno"> 5857</span> num_type_added++;</div>
|
|
<div class="line"><a id="l05858" name="l05858"></a><span class="lineno"> 5858</span> }</div>
|
|
<div class="line"><a id="l05859" name="l05859"></a><span class="lineno"> 5859</span> <span class="keywordflow">if</span> (policy == VisitTypePolicy::TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED ||</div>
|
|
<div class="line"><a id="l05860" name="l05860"></a><span class="lineno"> 5860</span> policy == VisitTypePolicy::ADDED_TYPE_REMOVED_FROM_VEHICLE) {</div>
|
|
<div class="line"><a id="l05861" name="l05861"></a><span class="lineno"> 5861</span> num_type_removed++;</div>
|
|
<div class="line"><a id="l05862" name="l05862"></a><span class="lineno"> 5862</span> }</div>
|
|
<div class="line"><a id="l05863" name="l05863"></a><span class="lineno"> 5863</span> }</div>
|
|
<div class="line"><a id="l05864" name="l05864"></a><span class="lineno"> 5864</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_type_regulations_checker.html#a7a699c6ed63d424d0c3c322eb7161ace">FinalizeCheck</a>();</div>
|
|
<div class="line"><a id="l05865" name="l05865"></a><span class="lineno"> 5865</span>}</div>
|
|
<div class="line"><a id="l05866" name="l05866"></a><span class="lineno"> 5866</span> </div>
|
|
<div class="line"><a id="l05867" name="l05867"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_type_regulations_checker.html#aab77529dea185cbc2341ac96b6be72ee"> 5867</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_type_regulations_checker.html#aab77529dea185cbc2341ac96b6be72ee">TypeRegulationsChecker::InitializeCheck</a>(</div>
|
|
<div class="line"><a id="l05868" name="l05868"></a><span class="lineno"> 5868</span> <span class="keywordtype">int</span> vehicle, <span class="keyword">const</span> std::function<int64_t(int64_t)>& next_accessor) {</div>
|
|
<div class="line"><a id="l05869" name="l05869"></a><span class="lineno"> 5869</span> <span class="comment">// Accumulates the count of types before the current node.</span></div>
|
|
<div class="line"><a id="l05870" name="l05870"></a><span class="lineno"> 5870</span> <span class="comment">// {0, 0, -1} does not compile on or-tools.</span></div>
|
|
<div class="line"><a id="l05871" name="l05871"></a><span class="lineno"> 5871</span> std::fill(occurrences_of_type_.begin(), occurrences_of_type_.end(),</div>
|
|
<div class="line"><a id="l05872" name="l05872"></a><span class="lineno"> 5872</span> <a class="code hl_struct" href="structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html">TypeRegulationsChecker::TypePolicyOccurrence</a>());</div>
|
|
<div class="line"><a id="l05873" name="l05873"></a><span class="lineno"> 5873</span> </div>
|
|
<div class="line"><a id="l05874" name="l05874"></a><span class="lineno"> 5874</span> <span class="comment">// TODO(user): Optimize the filter to avoid scanning the route an extra</span></div>
|
|
<div class="line"><a id="l05875" name="l05875"></a><span class="lineno"> 5875</span> <span class="comment">// time when there are no TYPE_ON_VEHICLE_UP_TO_VISIT policies on the route,</span></div>
|
|
<div class="line"><a id="l05876" name="l05876"></a><span class="lineno"> 5876</span> <span class="comment">// by passing a boolean to CheckVehicle() passed to InitializeCheck().</span></div>
|
|
<div class="line"><a id="l05877" name="l05877"></a><span class="lineno"> 5877</span> current_route_visits_.clear();</div>
|
|
<div class="line"><a id="l05878" name="l05878"></a><span class="lineno"> 5878</span> <span class="keywordflow">for</span> (int64_t current = <a class="code hl_variable" href="classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5">model_</a>.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(vehicle); !<a class="code hl_variable" href="classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5">model_</a>.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">IsEnd</a>(current);</div>
|
|
<div class="line"><a id="l05879" name="l05879"></a><span class="lineno"> 5879</span> current = next_accessor(current)) {</div>
|
|
<div class="line"><a id="l05880" name="l05880"></a><span class="lineno"> 5880</span> <span class="keyword">const</span> <span class="keywordtype">int</span> type = <a class="code hl_variable" href="classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5">model_</a>.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5ae82715107922af5fbc18f854d58026">GetVisitType</a>(current);</div>
|
|
<div class="line"><a id="l05881" name="l05881"></a><span class="lineno"> 5881</span> <span class="keywordflow">if</span> (type >= 0 && <a class="code hl_variable" href="classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5">model_</a>.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aeb6c785d9ebc792b3c6eda788a6dfdf0">GetVisitTypePolicy</a>(current) ==</div>
|
|
<div class="line"><a id="l05882" name="l05882"></a><span class="lineno"> 5882</span> VisitTypePolicy::TYPE_ON_VEHICLE_UP_TO_VISIT) {</div>
|
|
<div class="line"><a id="l05883" name="l05883"></a><span class="lineno"> 5883</span> occurrences_of_type_[type].position_of_last_type_on_vehicle_up_to_visit =</div>
|
|
<div class="line"><a id="l05884" name="l05884"></a><span class="lineno"> 5884</span> current_route_visits_.size();</div>
|
|
<div class="line"><a id="l05885" name="l05885"></a><span class="lineno"> 5885</span> }</div>
|
|
<div class="line"><a id="l05886" name="l05886"></a><span class="lineno"> 5886</span> current_route_visits_.push_back(current);</div>
|
|
<div class="line"><a id="l05887" name="l05887"></a><span class="lineno"> 5887</span> }</div>
|
|
<div class="line"><a id="l05888" name="l05888"></a><span class="lineno"> 5888</span> </div>
|
|
<div class="line"><a id="l05889" name="l05889"></a><span class="lineno"> 5889</span> <a class="code hl_function" href="classoperations__research_1_1_type_regulations_checker.html#a72ee439843f75a7dc189962f5561ad97">OnInitializeCheck</a>();</div>
|
|
<div class="line"><a id="l05890" name="l05890"></a><span class="lineno"> 5890</span>}</div>
|
|
<div class="line"><a id="l05891" name="l05891"></a><span class="lineno"> 5891</span> </div>
|
|
<div class="line"><a id="l05892" name="l05892"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_type_regulations_checker.html#afcb22d4d3273e1f4153f851e1bddf417"> 5892</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_type_regulations_checker.html#afcb22d4d3273e1f4153f851e1bddf417">TypeRegulationsChecker::TypeOccursOnRoute</a>(<span class="keywordtype">int</span> type)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l05893" name="l05893"></a><span class="lineno"> 5893</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html">TypePolicyOccurrence</a>& occurrences = occurrences_of_type_[type];</div>
|
|
<div class="line"><a id="l05894" name="l05894"></a><span class="lineno"> 5894</span> <span class="keywordflow">return</span> occurrences.<a class="code hl_variable" href="structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html#aa0bf1d67fe0a2224b3ce02286a032c3e">num_type_added_to_vehicle</a> > 0 ||</div>
|
|
<div class="line"><a id="l05895" name="l05895"></a><span class="lineno"> 5895</span> occurrences.<a class="code hl_variable" href="structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html#a7acae15ab204f3f24e65ad1d10729bb9">position_of_last_type_on_vehicle_up_to_visit</a> >= 0;</div>
|
|
<div class="line"><a id="l05896" name="l05896"></a><span class="lineno"> 5896</span>}</div>
|
|
<div class="line"><a id="l05897" name="l05897"></a><span class="lineno"> 5897</span> </div>
|
|
<div class="line"><a id="l05898" name="l05898"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_type_regulations_checker.html#ae8ea938d5980cf2079ded7ea1dcd38e7"> 5898</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_type_regulations_checker.html#ae8ea938d5980cf2079ded7ea1dcd38e7">TypeRegulationsChecker::TypeCurrentlyOnRoute</a>(<span class="keywordtype">int</span> type, <span class="keywordtype">int</span> pos)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l05899" name="l05899"></a><span class="lineno"> 5899</span> <span class="keyword">const</span> <a class="code hl_struct" href="structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html">TypePolicyOccurrence</a>& occurrences = occurrences_of_type_[type];</div>
|
|
<div class="line"><a id="l05900" name="l05900"></a><span class="lineno"> 5900</span> <span class="keywordflow">return</span> occurrences.<a class="code hl_variable" href="structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html#abb92435061d2042b268fb2041c8e2754">num_type_removed_from_vehicle</a> <</div>
|
|
<div class="line"><a id="l05901" name="l05901"></a><span class="lineno"> 5901</span> occurrences.<a class="code hl_variable" href="structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html#aa0bf1d67fe0a2224b3ce02286a032c3e">num_type_added_to_vehicle</a> ||</div>
|
|
<div class="line"><a id="l05902" name="l05902"></a><span class="lineno"> 5902</span> occurrences.<a class="code hl_variable" href="structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html#a7acae15ab204f3f24e65ad1d10729bb9">position_of_last_type_on_vehicle_up_to_visit</a> >= pos;</div>
|
|
<div class="line"><a id="l05903" name="l05903"></a><span class="lineno"> 5903</span>}</div>
|
|
<div class="line"><a id="l05904" name="l05904"></a><span class="lineno"> 5904</span> </div>
|
|
<div class="line"><a id="l05905" name="l05905"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_type_incompatibility_checker.html#a0e62f00f807fac1ac7e9d14e00fb8394"> 5905</a></span><a class="code hl_function" href="classoperations__research_1_1_type_incompatibility_checker.html#a0e62f00f807fac1ac7e9d14e00fb8394">TypeIncompatibilityChecker::TypeIncompatibilityChecker</a>(</div>
|
|
<div class="line"><a id="l05906" name="l05906"></a><span class="lineno"> 5906</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_model.html">RoutingModel</a>& <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, <span class="keywordtype">bool</span> check_hard_incompatibilities)</div>
|
|
<div class="line"><a id="l05907" name="l05907"></a><span class="lineno"> 5907</span> : <a class="code hl_class" href="classoperations__research_1_1_type_regulations_checker.html">TypeRegulationsChecker</a>(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>),</div>
|
|
<div class="line"><a id="l05908" name="l05908"></a><span class="lineno"> 5908</span> check_hard_incompatibilities_(check_hard_incompatibilities) {}</div>
|
|
<div class="line"><a id="l05909" name="l05909"></a><span class="lineno"> 5909</span> </div>
|
|
<div class="line"><a id="l05910" name="l05910"></a><span class="lineno"> 5910</span><span class="keywordtype">bool</span> TypeIncompatibilityChecker::HasRegulationsToCheck()<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l05911" name="l05911"></a><span class="lineno"> 5911</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5">model_</a>.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ad19492313b68e5a963af3793aaec8d90">HasTemporalTypeIncompatibilities</a>() ||</div>
|
|
<div class="line"><a id="l05912" name="l05912"></a><span class="lineno"> 5912</span> (check_hard_incompatibilities_ &&</div>
|
|
<div class="line"><a id="l05913" name="l05913"></a><span class="lineno"> 5913</span> <a class="code hl_variable" href="classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5">model_</a>.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a9c58894df747f5498c335a3a8c5c0c88">HasHardTypeIncompatibilities</a>());</div>
|
|
<div class="line"><a id="l05914" name="l05914"></a><span class="lineno"> 5914</span>}</div>
|
|
<div class="line"><a id="l05915" name="l05915"></a><span class="lineno"> 5915</span> </div>
|
|
<div class="line"><a id="l05916" name="l05916"></a><span class="lineno"> 5916</span><span class="comment">// TODO(user): Remove the check_hard_incompatibilities_ boolean and always</span></div>
|
|
<div class="line"><a id="l05917" name="l05917"></a><span class="lineno"> 5917</span><span class="comment">// check both incompatibilities to simplify the code?</span></div>
|
|
<div class="line"><a id="l05918" name="l05918"></a><span class="lineno"> 5918</span><span class="comment">// TODO(user): Improve algorithm by only checking a given type if necessary?</span></div>
|
|
<div class="line"><a id="l05919" name="l05919"></a><span class="lineno"> 5919</span><span class="comment">// - For temporal incompatibilities, only check if NonDeliveredType(count) == 1.</span></div>
|
|
<div class="line"><a id="l05920" name="l05920"></a><span class="lineno"> 5920</span><span class="comment">// - For hard incompatibilities, only if NonDeliveryType(type) == 1.</span></div>
|
|
<div class="line"><a id="l05921" name="l05921"></a><span class="lineno"> 5921</span><span class="keywordtype">bool</span> TypeIncompatibilityChecker::CheckTypeRegulations(<span class="keywordtype">int</span> type,</div>
|
|
<div class="line"><a id="l05922" name="l05922"></a><span class="lineno"> 5922</span> VisitTypePolicy policy,</div>
|
|
<div class="line"><a id="l05923" name="l05923"></a><span class="lineno"> 5923</span> <span class="keywordtype">int</span> pos) {</div>
|
|
<div class="line"><a id="l05924" name="l05924"></a><span class="lineno"> 5924</span> <span class="keywordflow">if</span> (policy == VisitTypePolicy::ADDED_TYPE_REMOVED_FROM_VEHICLE) {</div>
|
|
<div class="line"><a id="l05925" name="l05925"></a><span class="lineno"> 5925</span> <span class="comment">// NOTE: We don't need to check incompatibilities when the type is being</span></div>
|
|
<div class="line"><a id="l05926" name="l05926"></a><span class="lineno"> 5926</span> <span class="comment">// removed from the route.</span></div>
|
|
<div class="line"><a id="l05927" name="l05927"></a><span class="lineno"> 5927</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l05928" name="l05928"></a><span class="lineno"> 5928</span> }</div>
|
|
<div class="line"><a id="l05929" name="l05929"></a><span class="lineno"> 5929</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> incompatible_type :</div>
|
|
<div class="line"><a id="l05930" name="l05930"></a><span class="lineno"> 5930</span> <a class="code hl_variable" href="classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5">model_</a>.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a20e9006ff9b8dc8ce89a8239a092b0c7">GetTemporalTypeIncompatibilitiesOfType</a>(type)) {</div>
|
|
<div class="line"><a id="l05931" name="l05931"></a><span class="lineno"> 5931</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_type_regulations_checker.html#ae8ea938d5980cf2079ded7ea1dcd38e7">TypeCurrentlyOnRoute</a>(incompatible_type, pos)) {</div>
|
|
<div class="line"><a id="l05932" name="l05932"></a><span class="lineno"> 5932</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l05933" name="l05933"></a><span class="lineno"> 5933</span> }</div>
|
|
<div class="line"><a id="l05934" name="l05934"></a><span class="lineno"> 5934</span> }</div>
|
|
<div class="line"><a id="l05935" name="l05935"></a><span class="lineno"> 5935</span> <span class="keywordflow">if</span> (check_hard_incompatibilities_) {</div>
|
|
<div class="line"><a id="l05936" name="l05936"></a><span class="lineno"> 5936</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> incompatible_type :</div>
|
|
<div class="line"><a id="l05937" name="l05937"></a><span class="lineno"> 5937</span> <a class="code hl_variable" href="classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5">model_</a>.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ac26167700ef3e2bf5e595e2150d1f895">GetHardTypeIncompatibilitiesOfType</a>(type)) {</div>
|
|
<div class="line"><a id="l05938" name="l05938"></a><span class="lineno"> 5938</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_type_regulations_checker.html#afcb22d4d3273e1f4153f851e1bddf417">TypeOccursOnRoute</a>(incompatible_type)) {</div>
|
|
<div class="line"><a id="l05939" name="l05939"></a><span class="lineno"> 5939</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l05940" name="l05940"></a><span class="lineno"> 5940</span> }</div>
|
|
<div class="line"><a id="l05941" name="l05941"></a><span class="lineno"> 5941</span> }</div>
|
|
<div class="line"><a id="l05942" name="l05942"></a><span class="lineno"> 5942</span> }</div>
|
|
<div class="line"><a id="l05943" name="l05943"></a><span class="lineno"> 5943</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l05944" name="l05944"></a><span class="lineno"> 5944</span>}</div>
|
|
<div class="line"><a id="l05945" name="l05945"></a><span class="lineno"> 5945</span> </div>
|
|
<div class="line"><a id="l05946" name="l05946"></a><span class="lineno"> 5946</span><span class="keywordtype">bool</span> TypeRequirementChecker::HasRegulationsToCheck()<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l05947" name="l05947"></a><span class="lineno"> 5947</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5">model_</a>.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e3f4c6871f7b2c67fd5b1ad6c94d891">HasTemporalTypeRequirements</a>() ||</div>
|
|
<div class="line"><a id="l05948" name="l05948"></a><span class="lineno"> 5948</span> <a class="code hl_variable" href="classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5">model_</a>.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#abc101a64a3c876dcdf1b7176d59bd2c9">HasSameVehicleTypeRequirements</a>();</div>
|
|
<div class="line"><a id="l05949" name="l05949"></a><span class="lineno"> 5949</span>}</div>
|
|
<div class="line"><a id="l05950" name="l05950"></a><span class="lineno"> 5950</span> </div>
|
|
<div class="line"><a id="l05951" name="l05951"></a><span class="lineno"> 5951</span><span class="keywordtype">bool</span> TypeRequirementChecker::CheckRequiredTypesCurrentlyOnRoute(</div>
|
|
<div class="line"><a id="l05952" name="l05952"></a><span class="lineno"> 5952</span> <span class="keyword">const</span> std::vector<absl::flat_hash_set<int>>& required_type_alternatives,</div>
|
|
<div class="line"><a id="l05953" name="l05953"></a><span class="lineno"> 5953</span> <span class="keywordtype">int</span> pos) {</div>
|
|
<div class="line"><a id="l05954" name="l05954"></a><span class="lineno"> 5954</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> absl::flat_hash_set<int>& requirement_alternatives :</div>
|
|
<div class="line"><a id="l05955" name="l05955"></a><span class="lineno"> 5955</span> required_type_alternatives) {</div>
|
|
<div class="line"><a id="l05956" name="l05956"></a><span class="lineno"> 5956</span> <span class="keywordtype">bool</span> has_one_of_alternatives = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l05957" name="l05957"></a><span class="lineno"> 5957</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> type_alternative : requirement_alternatives) {</div>
|
|
<div class="line"><a id="l05958" name="l05958"></a><span class="lineno"> 5958</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_type_regulations_checker.html#ae8ea938d5980cf2079ded7ea1dcd38e7">TypeCurrentlyOnRoute</a>(type_alternative, pos)) {</div>
|
|
<div class="line"><a id="l05959" name="l05959"></a><span class="lineno"> 5959</span> has_one_of_alternatives = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l05960" name="l05960"></a><span class="lineno"> 5960</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l05961" name="l05961"></a><span class="lineno"> 5961</span> }</div>
|
|
<div class="line"><a id="l05962" name="l05962"></a><span class="lineno"> 5962</span> }</div>
|
|
<div class="line"><a id="l05963" name="l05963"></a><span class="lineno"> 5963</span> <span class="keywordflow">if</span> (!has_one_of_alternatives) {</div>
|
|
<div class="line"><a id="l05964" name="l05964"></a><span class="lineno"> 5964</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l05965" name="l05965"></a><span class="lineno"> 5965</span> }</div>
|
|
<div class="line"><a id="l05966" name="l05966"></a><span class="lineno"> 5966</span> }</div>
|
|
<div class="line"><a id="l05967" name="l05967"></a><span class="lineno"> 5967</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l05968" name="l05968"></a><span class="lineno"> 5968</span>}</div>
|
|
<div class="line"><a id="l05969" name="l05969"></a><span class="lineno"> 5969</span> </div>
|
|
<div class="line"><a id="l05970" name="l05970"></a><span class="lineno"> 5970</span><span class="keywordtype">bool</span> TypeRequirementChecker::CheckTypeRegulations(<span class="keywordtype">int</span> type,</div>
|
|
<div class="line"><a id="l05971" name="l05971"></a><span class="lineno"> 5971</span> VisitTypePolicy policy,</div>
|
|
<div class="line"><a id="l05972" name="l05972"></a><span class="lineno"> 5972</span> <span class="keywordtype">int</span> pos) {</div>
|
|
<div class="line"><a id="l05973" name="l05973"></a><span class="lineno"> 5973</span> <span class="keywordflow">if</span> (policy == <a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a0c6d4521dc67c6bc22dc917caef2286a">RoutingModel::TYPE_ADDED_TO_VEHICLE</a> ||</div>
|
|
<div class="line"><a id="l05974" name="l05974"></a><span class="lineno"> 5974</span> policy == <a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059ad86e8082b5636a532fe181b288a4dea7">RoutingModel::TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED</a>) {</div>
|
|
<div class="line"><a id="l05975" name="l05975"></a><span class="lineno"> 5975</span> <span class="keywordflow">if</span> (!CheckRequiredTypesCurrentlyOnRoute(</div>
|
|
<div class="line"><a id="l05976" name="l05976"></a><span class="lineno"> 5976</span> <a class="code hl_variable" href="classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5">model_</a>.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a780dc49f977070d8f061d82550b8ca82">GetRequiredTypeAlternativesWhenAddingType</a>(type), pos)) {</div>
|
|
<div class="line"><a id="l05977" name="l05977"></a><span class="lineno"> 5977</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l05978" name="l05978"></a><span class="lineno"> 5978</span> }</div>
|
|
<div class="line"><a id="l05979" name="l05979"></a><span class="lineno"> 5979</span> }</div>
|
|
<div class="line"><a id="l05980" name="l05980"></a><span class="lineno"> 5980</span> <span class="keywordflow">if</span> (policy != <a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a0c6d4521dc67c6bc22dc917caef2286a">RoutingModel::TYPE_ADDED_TO_VEHICLE</a>) {</div>
|
|
<div class="line"><a id="l05981" name="l05981"></a><span class="lineno"> 5981</span> <span class="keywordflow">if</span> (!CheckRequiredTypesCurrentlyOnRoute(</div>
|
|
<div class="line"><a id="l05982" name="l05982"></a><span class="lineno"> 5982</span> <a class="code hl_variable" href="classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5">model_</a>.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a2c5397c69eec560d911892a7c1642bdd">GetRequiredTypeAlternativesWhenRemovingType</a>(type), pos)) {</div>
|
|
<div class="line"><a id="l05983" name="l05983"></a><span class="lineno"> 5983</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l05984" name="l05984"></a><span class="lineno"> 5984</span> }</div>
|
|
<div class="line"><a id="l05985" name="l05985"></a><span class="lineno"> 5985</span> }</div>
|
|
<div class="line"><a id="l05986" name="l05986"></a><span class="lineno"> 5986</span> <span class="keywordflow">if</span> (policy != <a class="code hl_enumvalue" href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a5b57570c52e974c761a9b08c1fc7e8ab">RoutingModel::ADDED_TYPE_REMOVED_FROM_VEHICLE</a> &&</div>
|
|
<div class="line"><a id="l05987" name="l05987"></a><span class="lineno"> 5987</span> !<a class="code hl_variable" href="classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5">model_</a>.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a56d36a8ace500aa67983ea7cbf4e97e7">GetSameVehicleRequiredTypeAlternativesOfType</a>(type).empty()) {</div>
|
|
<div class="line"><a id="l05988" name="l05988"></a><span class="lineno"> 5988</span> types_with_same_vehicle_requirements_on_route_.insert(type);</div>
|
|
<div class="line"><a id="l05989" name="l05989"></a><span class="lineno"> 5989</span> }</div>
|
|
<div class="line"><a id="l05990" name="l05990"></a><span class="lineno"> 5990</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l05991" name="l05991"></a><span class="lineno"> 5991</span>}</div>
|
|
<div class="line"><a id="l05992" name="l05992"></a><span class="lineno"> 5992</span> </div>
|
|
<div class="line"><a id="l05993" name="l05993"></a><span class="lineno"> 5993</span><span class="keywordtype">bool</span> TypeRequirementChecker::FinalizeCheck()<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l05994" name="l05994"></a><span class="lineno"> 5994</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> type : types_with_same_vehicle_requirements_on_route_) {</div>
|
|
<div class="line"><a id="l05995" name="l05995"></a><span class="lineno"> 5995</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> absl::flat_hash_set<int>& requirement_alternatives :</div>
|
|
<div class="line"><a id="l05996" name="l05996"></a><span class="lineno"> 5996</span> <a class="code hl_variable" href="classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5">model_</a>.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a56d36a8ace500aa67983ea7cbf4e97e7">GetSameVehicleRequiredTypeAlternativesOfType</a>(type)) {</div>
|
|
<div class="line"><a id="l05997" name="l05997"></a><span class="lineno"> 5997</span> <span class="keywordtype">bool</span> has_one_of_alternatives = <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l05998" name="l05998"></a><span class="lineno"> 5998</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">int</span> type_alternative : requirement_alternatives) {</div>
|
|
<div class="line"><a id="l05999" name="l05999"></a><span class="lineno"> 5999</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_type_regulations_checker.html#afcb22d4d3273e1f4153f851e1bddf417">TypeOccursOnRoute</a>(type_alternative)) {</div>
|
|
<div class="line"><a id="l06000" name="l06000"></a><span class="lineno"> 6000</span> has_one_of_alternatives = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l06001" name="l06001"></a><span class="lineno"> 6001</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l06002" name="l06002"></a><span class="lineno"> 6002</span> }</div>
|
|
<div class="line"><a id="l06003" name="l06003"></a><span class="lineno"> 6003</span> }</div>
|
|
<div class="line"><a id="l06004" name="l06004"></a><span class="lineno"> 6004</span> <span class="keywordflow">if</span> (!has_one_of_alternatives) {</div>
|
|
<div class="line"><a id="l06005" name="l06005"></a><span class="lineno"> 6005</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
|
|
<div class="line"><a id="l06006" name="l06006"></a><span class="lineno"> 6006</span> }</div>
|
|
<div class="line"><a id="l06007" name="l06007"></a><span class="lineno"> 6007</span> }</div>
|
|
<div class="line"><a id="l06008" name="l06008"></a><span class="lineno"> 6008</span> }</div>
|
|
<div class="line"><a id="l06009" name="l06009"></a><span class="lineno"> 6009</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l06010" name="l06010"></a><span class="lineno"> 6010</span>}</div>
|
|
<div class="line"><a id="l06011" name="l06011"></a><span class="lineno"> 6011</span> </div>
|
|
<div class="line"><a id="l06012" name="l06012"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_type_regulations_constraint.html#ac45256999b51546027c5f81897ee4b46"> 6012</a></span><a class="code hl_function" href="classoperations__research_1_1_type_regulations_constraint.html#ac45256999b51546027c5f81897ee4b46">TypeRegulationsConstraint::TypeRegulationsConstraint</a>(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_model.html">RoutingModel</a>& <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>)</div>
|
|
<div class="line"><a id="l06013" name="l06013"></a><span class="lineno"> 6013</span> : <a class="code hl_class" href="classoperations__research_1_1_constraint.html">Constraint</a>(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>.solver()),</div>
|
|
<div class="line"><a id="l06014" name="l06014"></a><span class="lineno"> 6014</span> model_(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>),</div>
|
|
<div class="line"><a id="l06015" name="l06015"></a><span class="lineno"> 6015</span> incompatibility_checker_(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>, <span class="comment">/*check_hard_incompatibilities*/</span> true),</div>
|
|
<div class="line"><a id="l06016" name="l06016"></a><span class="lineno"> 6016</span> requirement_checker_(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>),</div>
|
|
<div class="line"><a id="l06017" name="l06017"></a><span class="lineno"> 6017</span> vehicle_demons_(<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>.vehicles()) {}</div>
|
|
<div class="line"><a id="l06018" name="l06018"></a><span class="lineno"> 6018</span> </div>
|
|
<div class="line"><a id="l06019" name="l06019"></a><span class="lineno"> 6019</span><span class="keywordtype">void</span> TypeRegulationsConstraint::PropagateNodeRegulations(<span class="keywordtype">int</span> node) {</div>
|
|
<div class="line"><a id="l06020" name="l06020"></a><span class="lineno"> 6020</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(node, model_.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a572bd92c25ebc67c72137fd59e53f6d6">Size</a>());</div>
|
|
<div class="line"><a id="l06021" name="l06021"></a><span class="lineno"> 6021</span> <span class="keywordflow">if</span> (!model_.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">VehicleVar</a>(node)-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#a1d04569b37cb7fe6ed0956ab71e08bc9">Bound</a>() || !model_.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(node)-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#a1d04569b37cb7fe6ed0956ab71e08bc9">Bound</a>()) {</div>
|
|
<div class="line"><a id="l06022" name="l06022"></a><span class="lineno"> 6022</span> <span class="comment">// Vehicle var or Next var not bound.</span></div>
|
|
<div class="line"><a id="l06023" name="l06023"></a><span class="lineno"> 6023</span> <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l06024" name="l06024"></a><span class="lineno"> 6024</span> }</div>
|
|
<div class="line"><a id="l06025" name="l06025"></a><span class="lineno"> 6025</span> <span class="keyword">const</span> <span class="keywordtype">int</span> vehicle = model_.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">VehicleVar</a>(node)-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#a62b340f6d1dde6a36560bd88a382ada7">Min</a>();</div>
|
|
<div class="line"><a id="l06026" name="l06026"></a><span class="lineno"> 6026</span> <span class="keywordflow">if</span> (vehicle < 0) <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l06027" name="l06027"></a><span class="lineno"> 6027</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(vehicle_demons_[vehicle] != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l06028" name="l06028"></a><span class="lineno"> 6028</span> <a class="code hl_function" href="classoperations__research_1_1_propagation_base_object.html#a173cbf153462b14f9b57362d2c45638a">EnqueueDelayedDemon</a>(vehicle_demons_[vehicle]);</div>
|
|
<div class="line"><a id="l06029" name="l06029"></a><span class="lineno"> 6029</span>}</div>
|
|
<div class="line"><a id="l06030" name="l06030"></a><span class="lineno"> 6030</span> </div>
|
|
<div class="line"><a id="l06031" name="l06031"></a><span class="lineno"> 6031</span><span class="keywordtype">void</span> TypeRegulationsConstraint::CheckRegulationsOnVehicle(<span class="keywordtype">int</span> vehicle) {</div>
|
|
<div class="line"><a id="l06032" name="l06032"></a><span class="lineno"> 6032</span> <span class="keyword">const</span> <span class="keyword">auto</span> next_accessor = [<span class="keyword">this</span>, vehicle](int64_t node) {</div>
|
|
<div class="line"><a id="l06033" name="l06033"></a><span class="lineno"> 6033</span> <span class="keywordflow">if</span> (model_.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(node)-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#a1d04569b37cb7fe6ed0956ab71e08bc9">Bound</a>()) {</div>
|
|
<div class="line"><a id="l06034" name="l06034"></a><span class="lineno"> 6034</span> <span class="keywordflow">return</span> model_.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(node)-><a class="code hl_function" href="classoperations__research_1_1_int_var.html#acc2ece7bb8bf97bb35cdf9650fe6c55b">Value</a>();</div>
|
|
<div class="line"><a id="l06035" name="l06035"></a><span class="lineno"> 6035</span> }</div>
|
|
<div class="line"><a id="l06036" name="l06036"></a><span class="lineno"> 6036</span> <span class="comment">// Node not bound, skip to the end of the vehicle.</span></div>
|
|
<div class="line"><a id="l06037" name="l06037"></a><span class="lineno"> 6037</span> <span class="keywordflow">return</span> model_.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afb80fd36c1fb57d2db049403483e2074">End</a>(vehicle);</div>
|
|
<div class="line"><a id="l06038" name="l06038"></a><span class="lineno"> 6038</span> };</div>
|
|
<div class="line"><a id="l06039" name="l06039"></a><span class="lineno"> 6039</span> <span class="keywordflow">if</span> (!incompatibility_checker_.<a class="code hl_function" href="classoperations__research_1_1_type_regulations_checker.html#a74fa9fd5626d4013ab5e2bc408c27f0e">CheckVehicle</a>(vehicle, next_accessor) ||</div>
|
|
<div class="line"><a id="l06040" name="l06040"></a><span class="lineno"> 6040</span> !requirement_checker_.<a class="code hl_function" href="classoperations__research_1_1_type_regulations_checker.html#a74fa9fd5626d4013ab5e2bc408c27f0e">CheckVehicle</a>(vehicle, next_accessor)) {</div>
|
|
<div class="line"><a id="l06041" name="l06041"></a><span class="lineno"> 6041</span> model_.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>()-><a class="code hl_function" href="classoperations__research_1_1_solver.html#aeb92d4addb41255c9732cacfcb54f795">Fail</a>();</div>
|
|
<div class="line"><a id="l06042" name="l06042"></a><span class="lineno"> 6042</span> }</div>
|
|
<div class="line"><a id="l06043" name="l06043"></a><span class="lineno"> 6043</span>}</div>
|
|
<div class="line"><a id="l06044" name="l06044"></a><span class="lineno"> 6044</span> </div>
|
|
<div class="line"><a id="l06045" name="l06045"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_type_regulations_constraint.html#a19d94d32f3bde30deeebb883c6f71f84"> 6045</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_type_regulations_constraint.html#a19d94d32f3bde30deeebb883c6f71f84">TypeRegulationsConstraint::Post</a>() {</div>
|
|
<div class="line"><a id="l06046" name="l06046"></a><span class="lineno"> 6046</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < model_.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); vehicle++) {</div>
|
|
<div class="line"><a id="l06047" name="l06047"></a><span class="lineno"> 6047</span> vehicle_demons_[vehicle] = <a class="code hl_function" href="namespaceoperations__research.html#ac316c82f31293db18e25c809592908dd">MakeDelayedConstraintDemon1</a>(</div>
|
|
<div class="line"><a id="l06048" name="l06048"></a><span class="lineno"> 6048</span> <a class="code hl_function" href="classoperations__research_1_1_propagation_base_object.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>(), <span class="keyword">this</span>, &TypeRegulationsConstraint::CheckRegulationsOnVehicle,</div>
|
|
<div class="line"><a id="l06049" name="l06049"></a><span class="lineno"> 6049</span> <span class="stringliteral">"CheckRegulationsOnVehicle"</span>, vehicle);</div>
|
|
<div class="line"><a id="l06050" name="l06050"></a><span class="lineno"> 6050</span> }</div>
|
|
<div class="line"><a id="l06051" name="l06051"></a><span class="lineno"> 6051</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> node = 0; node < model_.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a572bd92c25ebc67c72137fd59e53f6d6">Size</a>(); node++) {</div>
|
|
<div class="line"><a id="l06052" name="l06052"></a><span class="lineno"> 6052</span> <a class="code hl_class" href="classoperations__research_1_1_demon.html">Demon</a>* node_demon = <a class="code hl_function" href="namespaceoperations__research.html#ae0190f4a9c848c207d0bff97f625fcd1">MakeConstraintDemon1</a>(</div>
|
|
<div class="line"><a id="l06053" name="l06053"></a><span class="lineno"> 6053</span> <a class="code hl_function" href="classoperations__research_1_1_propagation_base_object.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>(), <span class="keyword">this</span>, &TypeRegulationsConstraint::PropagateNodeRegulations,</div>
|
|
<div class="line"><a id="l06054" name="l06054"></a><span class="lineno"> 6054</span> <span class="stringliteral">"PropagateNodeRegulations"</span>, node);</div>
|
|
<div class="line"><a id="l06055" name="l06055"></a><span class="lineno"> 6055</span> model_.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(node)-><a class="code hl_function" href="classoperations__research_1_1_int_var.html#a6e33a313eaf507bae0eb7068455a5bdc">WhenBound</a>(node_demon);</div>
|
|
<div class="line"><a id="l06056" name="l06056"></a><span class="lineno"> 6056</span> model_.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">VehicleVar</a>(node)-><a class="code hl_function" href="classoperations__research_1_1_int_var.html#a6e33a313eaf507bae0eb7068455a5bdc">WhenBound</a>(node_demon);</div>
|
|
<div class="line"><a id="l06057" name="l06057"></a><span class="lineno"> 6057</span> }</div>
|
|
<div class="line"><a id="l06058" name="l06058"></a><span class="lineno"> 6058</span>}</div>
|
|
<div class="line"><a id="l06059" name="l06059"></a><span class="lineno"> 6059</span> </div>
|
|
<div class="line"><a id="l06060" name="l06060"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_type_regulations_constraint.html#a36d844f2722273b190ed9a069dd25938"> 6060</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_type_regulations_constraint.html#a36d844f2722273b190ed9a069dd25938">TypeRegulationsConstraint::InitialPropagate</a>() {</div>
|
|
<div class="line"><a id="l06061" name="l06061"></a><span class="lineno"> 6061</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> vehicle = 0; vehicle < model_.<a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); vehicle++) {</div>
|
|
<div class="line"><a id="l06062" name="l06062"></a><span class="lineno"> 6062</span> CheckRegulationsOnVehicle(vehicle);</div>
|
|
<div class="line"><a id="l06063" name="l06063"></a><span class="lineno"> 6063</span> }</div>
|
|
<div class="line"><a id="l06064" name="l06064"></a><span class="lineno"> 6064</span>}</div>
|
|
<div class="line"><a id="l06065" name="l06065"></a><span class="lineno"> 6065</span> </div>
|
|
<div class="line"><a id="l06066" name="l06066"></a><span class="lineno"> 6066</span><span class="keywordtype">void</span> RoutingDimension::CloseModel(<span class="keywordtype">bool</span> use_light_propagation) {</div>
|
|
<div class="line"><a id="l06067" name="l06067"></a><span class="lineno"> 6067</span> <a class="code hl_class" href="classoperations__research_1_1_solver.html">Solver</a>* <span class="keyword">const</span> solver = model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>();</div>
|
|
<div class="line"><a id="l06068" name="l06068"></a><span class="lineno"> 6068</span> <span class="keyword">const</span> <span class="keyword">auto</span> capacity_lambda = [<span class="keyword">this</span>](int64_t vehicle) {</div>
|
|
<div class="line"><a id="l06069" name="l06069"></a><span class="lineno"> 6069</span> <span class="keywordflow">return</span> vehicle >= 0 ? vehicle_capacities_[vehicle]</div>
|
|
<div class="line"><a id="l06070" name="l06070"></a><span class="lineno"> 6070</span> : <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>();</div>
|
|
<div class="line"><a id="l06071" name="l06071"></a><span class="lineno"> 6071</span> };</div>
|
|
<div class="line"><a id="l06072" name="l06072"></a><span class="lineno"> 6072</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < capacity_vars_.size(); ++i) {</div>
|
|
<div class="line"><a id="l06073" name="l06073"></a><span class="lineno"> 6073</span> IntVar* <span class="keyword">const</span> vehicle_var = model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">VehicleVar</a>(i);</div>
|
|
<div class="line"><a id="l06074" name="l06074"></a><span class="lineno"> 6074</span> IntVar* <span class="keyword">const</span> capacity_var = capacity_vars_[i];</div>
|
|
<div class="line"><a id="l06075" name="l06075"></a><span class="lineno"> 6075</span> <span class="keywordflow">if</span> (use_light_propagation) {</div>
|
|
<div class="line"><a id="l06076" name="l06076"></a><span class="lineno"> 6076</span> solver-><a class="code hl_function" href="classoperations__research_1_1_solver.html#a5931080c9bfda8dedfef0e3adf313ab3">AddConstraint</a>(MakeLightElement(</div>
|
|
<div class="line"><a id="l06077" name="l06077"></a><span class="lineno"> 6077</span> solver, capacity_var, vehicle_var, capacity_lambda,</div>
|
|
<div class="line"><a id="l06078" name="l06078"></a><span class="lineno"> 6078</span> [<span class="keyword">this</span>]() { <span class="keywordflow">return</span> model_->enable_deep_serialization_; }));</div>
|
|
<div class="line"><a id="l06079" name="l06079"></a><span class="lineno"> 6079</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l06080" name="l06080"></a><span class="lineno"> 6080</span> solver-><a class="code hl_function" href="classoperations__research_1_1_solver.html#a5931080c9bfda8dedfef0e3adf313ab3">AddConstraint</a>(solver-><a class="code hl_function" href="classoperations__research_1_1_solver.html#a2085a8965de86fa4cf3aa76331331372">MakeEquality</a>(</div>
|
|
<div class="line"><a id="l06081" name="l06081"></a><span class="lineno"> 6081</span> capacity_var,</div>
|
|
<div class="line"><a id="l06082" name="l06082"></a><span class="lineno"> 6082</span> solver-><a class="code hl_function" href="classoperations__research_1_1_solver.html#a88b9877d88ea2cf4d4b4b5bfc2916110">MakeElement</a>(capacity_lambda, vehicle_var)-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#a8a1d9ddd5f5fc8f2a02b8a8700d3e3b1">Var</a>()));</div>
|
|
<div class="line"><a id="l06083" name="l06083"></a><span class="lineno"> 6083</span> }</div>
|
|
<div class="line"><a id="l06084" name="l06084"></a><span class="lineno"> 6084</span> }</div>
|
|
<div class="line"><a id="l06085" name="l06085"></a><span class="lineno"> 6085</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < fixed_transits_.size(); ++i) {</div>
|
|
<div class="line"><a id="l06086" name="l06086"></a><span class="lineno"> 6086</span> IntVar* <span class="keyword">const</span> next_var = model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(i);</div>
|
|
<div class="line"><a id="l06087" name="l06087"></a><span class="lineno"> 6087</span> IntVar* <span class="keyword">const</span> fixed_transit = fixed_transits_[i];</div>
|
|
<div class="line"><a id="l06088" name="l06088"></a><span class="lineno"> 6088</span> <span class="keyword">const</span> <span class="keyword">auto</span> transit_vehicle_evaluator = [<span class="keyword">this</span>, i](int64_t to,</div>
|
|
<div class="line"><a id="l06089" name="l06089"></a><span class="lineno"> 6089</span> int64_t eval_index) {</div>
|
|
<div class="line"><a id="l06090" name="l06090"></a><span class="lineno"> 6090</span> <span class="keywordflow">return</span> eval_index >= 0 ? <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a5c170c586b06b6435f4e85cfc9db27e5">transit_evaluator</a>(eval_index)(i, to) : 0;</div>
|
|
<div class="line"><a id="l06091" name="l06091"></a><span class="lineno"> 6091</span> };</div>
|
|
<div class="line"><a id="l06092" name="l06092"></a><span class="lineno"> 6092</span> <span class="keywordflow">if</span> (use_light_propagation) {</div>
|
|
<div class="line"><a id="l06093" name="l06093"></a><span class="lineno"> 6093</span> <span class="keywordflow">if</span> (class_evaluators_.size() == 1) {</div>
|
|
<div class="line"><a id="l06094" name="l06094"></a><span class="lineno"> 6094</span> <span class="keyword">const</span> <span class="keywordtype">int</span> class_evaluator_index = class_evaluators_[0];</div>
|
|
<div class="line"><a id="l06095" name="l06095"></a><span class="lineno"> 6095</span> <span class="keyword">const</span> <span class="keyword">auto</span>& unary_callback =</div>
|
|
<div class="line"><a id="l06096" name="l06096"></a><span class="lineno"> 6096</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a7bcff3e4ab28854695610b340d5d11c3">UnaryTransitCallbackOrNull</a>(class_evaluator_index);</div>
|
|
<div class="line"><a id="l06097" name="l06097"></a><span class="lineno"> 6097</span> <span class="keywordflow">if</span> (unary_callback == <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l06098" name="l06098"></a><span class="lineno"> 6098</span> solver-><a class="code hl_function" href="classoperations__research_1_1_solver.html#a5931080c9bfda8dedfef0e3adf313ab3">AddConstraint</a>(MakeLightElement(</div>
|
|
<div class="line"><a id="l06099" name="l06099"></a><span class="lineno"> 6099</span> solver, fixed_transit, next_var,</div>
|
|
<div class="line"><a id="l06100" name="l06100"></a><span class="lineno"> 6100</span> [<span class="keyword">this</span>, i](int64_t to) {</div>
|
|
<div class="line"><a id="l06101" name="l06101"></a><span class="lineno"> 6101</span> <span class="keywordflow">return</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0ceffe3b4741e0075a7be69d5d539ec4">TransitCallback</a>(class_evaluators_[0])(i, to);</div>
|
|
<div class="line"><a id="l06102" name="l06102"></a><span class="lineno"> 6102</span> },</div>
|
|
<div class="line"><a id="l06103" name="l06103"></a><span class="lineno"> 6103</span> [<span class="keyword">this</span>]() { <span class="keywordflow">return</span> model_->enable_deep_serialization_; }));</div>
|
|
<div class="line"><a id="l06104" name="l06104"></a><span class="lineno"> 6104</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l06105" name="l06105"></a><span class="lineno"> 6105</span> fixed_transit->SetValue(unary_callback(i));</div>
|
|
<div class="line"><a id="l06106" name="l06106"></a><span class="lineno"> 6106</span> }</div>
|
|
<div class="line"><a id="l06107" name="l06107"></a><span class="lineno"> 6107</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l06108" name="l06108"></a><span class="lineno"> 6108</span> solver-><a class="code hl_function" href="classoperations__research_1_1_solver.html#a5931080c9bfda8dedfef0e3adf313ab3">AddConstraint</a>(MakeLightElement2(</div>
|
|
<div class="line"><a id="l06109" name="l06109"></a><span class="lineno"> 6109</span> solver, fixed_transit, next_var, model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">VehicleVar</a>(i),</div>
|
|
<div class="line"><a id="l06110" name="l06110"></a><span class="lineno"> 6110</span> transit_vehicle_evaluator,</div>
|
|
<div class="line"><a id="l06111" name="l06111"></a><span class="lineno"> 6111</span> [<span class="keyword">this</span>]() { <span class="keywordflow">return</span> model_->enable_deep_serialization_; }));</div>
|
|
<div class="line"><a id="l06112" name="l06112"></a><span class="lineno"> 6112</span> }</div>
|
|
<div class="line"><a id="l06113" name="l06113"></a><span class="lineno"> 6113</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l06114" name="l06114"></a><span class="lineno"> 6114</span> <span class="keywordflow">if</span> (class_evaluators_.size() == 1) {</div>
|
|
<div class="line"><a id="l06115" name="l06115"></a><span class="lineno"> 6115</span> <span class="keyword">const</span> <span class="keywordtype">int</span> class_evaluator_index = class_evaluators_[0];</div>
|
|
<div class="line"><a id="l06116" name="l06116"></a><span class="lineno"> 6116</span> <span class="keyword">const</span> <span class="keyword">auto</span>& unary_callback =</div>
|
|
<div class="line"><a id="l06117" name="l06117"></a><span class="lineno"> 6117</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a7bcff3e4ab28854695610b340d5d11c3">UnaryTransitCallbackOrNull</a>(class_evaluator_index);</div>
|
|
<div class="line"><a id="l06118" name="l06118"></a><span class="lineno"> 6118</span> <span class="keywordflow">if</span> (unary_callback == <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l06119" name="l06119"></a><span class="lineno"> 6119</span> solver-><a class="code hl_function" href="classoperations__research_1_1_solver.html#a5931080c9bfda8dedfef0e3adf313ab3">AddConstraint</a>(solver-><a class="code hl_function" href="classoperations__research_1_1_solver.html#a2085a8965de86fa4cf3aa76331331372">MakeEquality</a>(</div>
|
|
<div class="line"><a id="l06120" name="l06120"></a><span class="lineno"> 6120</span> fixed_transit, solver</div>
|
|
<div class="line"><a id="l06121" name="l06121"></a><span class="lineno"> 6121</span> -><a class="code hl_function" href="classoperations__research_1_1_solver.html#a88b9877d88ea2cf4d4b4b5bfc2916110">MakeElement</a>(</div>
|
|
<div class="line"><a id="l06122" name="l06122"></a><span class="lineno"> 6122</span> [<span class="keyword">this</span>, i](int64_t to) {</div>
|
|
<div class="line"><a id="l06123" name="l06123"></a><span class="lineno"> 6123</span> <span class="keywordflow">return</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0ceffe3b4741e0075a7be69d5d539ec4">TransitCallback</a>(</div>
|
|
<div class="line"><a id="l06124" name="l06124"></a><span class="lineno"> 6124</span> class_evaluators_[0])(i, to);</div>
|
|
<div class="line"><a id="l06125" name="l06125"></a><span class="lineno"> 6125</span> },</div>
|
|
<div class="line"><a id="l06126" name="l06126"></a><span class="lineno"> 6126</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">NextVar</a>(i))</div>
|
|
<div class="line"><a id="l06127" name="l06127"></a><span class="lineno"> 6127</span> ->Var()));</div>
|
|
<div class="line"><a id="l06128" name="l06128"></a><span class="lineno"> 6128</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l06129" name="l06129"></a><span class="lineno"> 6129</span> fixed_transit->SetValue(unary_callback(i));</div>
|
|
<div class="line"><a id="l06130" name="l06130"></a><span class="lineno"> 6130</span> }</div>
|
|
<div class="line"><a id="l06131" name="l06131"></a><span class="lineno"> 6131</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l06132" name="l06132"></a><span class="lineno"> 6132</span> solver-><a class="code hl_function" href="classoperations__research_1_1_solver.html#a5931080c9bfda8dedfef0e3adf313ab3">AddConstraint</a>(solver-><a class="code hl_function" href="classoperations__research_1_1_solver.html#a2085a8965de86fa4cf3aa76331331372">MakeEquality</a>(</div>
|
|
<div class="line"><a id="l06133" name="l06133"></a><span class="lineno"> 6133</span> fixed_transit, solver</div>
|
|
<div class="line"><a id="l06134" name="l06134"></a><span class="lineno"> 6134</span> -><a class="code hl_function" href="classoperations__research_1_1_solver.html#a88b9877d88ea2cf4d4b4b5bfc2916110">MakeElement</a>(transit_vehicle_evaluator,</div>
|
|
<div class="line"><a id="l06135" name="l06135"></a><span class="lineno"> 6135</span> next_var, model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">VehicleVar</a>(i))</div>
|
|
<div class="line"><a id="l06136" name="l06136"></a><span class="lineno"> 6136</span> ->Var()));</div>
|
|
<div class="line"><a id="l06137" name="l06137"></a><span class="lineno"> 6137</span> }</div>
|
|
<div class="line"><a id="l06138" name="l06138"></a><span class="lineno"> 6138</span> }</div>
|
|
<div class="line"><a id="l06139" name="l06139"></a><span class="lineno"> 6139</span> }</div>
|
|
<div class="line"><a id="l06140" name="l06140"></a><span class="lineno"> 6140</span> <span class="keywordflow">if</span> (<a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a6debc638c02bfb2b4afe0afccdd98ca5">HasBreakConstraints</a>()) {</div>
|
|
<div class="line"><a id="l06141" name="l06141"></a><span class="lineno"> 6141</span> GlobalVehicleBreaksConstraint* constraint =</div>
|
|
<div class="line"><a id="l06142" name="l06142"></a><span class="lineno"> 6142</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a90dcdb4d66f8781421f5913150a85a06">model</a>()-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>()-><a class="code hl_function" href="classoperations__research_1_1_solver.html#af5a1f8b1ea0ab0796c8667b9e2ef0ce7">RevAlloc</a>(<span class="keyword">new</span> GlobalVehicleBreaksConstraint(<span class="keyword">this</span>));</div>
|
|
<div class="line"><a id="l06143" name="l06143"></a><span class="lineno"> 6143</span> solver-><a class="code hl_function" href="classoperations__research_1_1_solver.html#a5931080c9bfda8dedfef0e3adf313ab3">AddConstraint</a>(constraint);</div>
|
|
<div class="line"><a id="l06144" name="l06144"></a><span class="lineno"> 6144</span> }</div>
|
|
<div class="line"><a id="l06145" name="l06145"></a><span class="lineno"> 6145</span>}</div>
|
|
<div class="line"><a id="l06146" name="l06146"></a><span class="lineno"> 6146</span> </div>
|
|
<div class="line"><a id="l06147" name="l06147"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#aacebe98359d92dbc79626807ad78971c"> 6147</a></span>int64_t <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#aacebe98359d92dbc79626807ad78971c">RoutingDimension::GetTransitValue</a>(int64_t from_index, int64_t to_index,</div>
|
|
<div class="line"><a id="l06148" name="l06148"></a><span class="lineno"> 6148</span> int64_t vehicle)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06149" name="l06149"></a><span class="lineno"> 6149</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a5c170c586b06b6435f4e85cfc9db27e5">transit_evaluator</a>(vehicle) != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l06150" name="l06150"></a><span class="lineno"> 6150</span> <span class="keywordflow">return</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a5c170c586b06b6435f4e85cfc9db27e5">transit_evaluator</a>(vehicle)(from_index, to_index);</div>
|
|
<div class="line"><a id="l06151" name="l06151"></a><span class="lineno"> 6151</span>}</div>
|
|
<div class="line"><a id="l06152" name="l06152"></a><span class="lineno"> 6152</span> </div>
|
|
<div class="line"><a id="l06153" name="l06153"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#a70dcc75273b8ffe7bf1df455e227d939"> 6153</a></span><a class="code hl_class" href="classoperations__research_1_1_sorted_disjoint_interval_list.html">SortedDisjointIntervalList</a> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a70dcc75273b8ffe7bf1df455e227d939">RoutingDimension::GetAllowedIntervalsInRange</a>(</div>
|
|
<div class="line"><a id="l06154" name="l06154"></a><span class="lineno"> 6154</span> int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>, int64_t min_value, int64_t max_value)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06155" name="l06155"></a><span class="lineno"> 6155</span> <a class="code hl_class" href="classoperations__research_1_1_sorted_disjoint_interval_list.html">SortedDisjointIntervalList</a> allowed;</div>
|
|
<div class="line"><a id="l06156" name="l06156"></a><span class="lineno"> 6156</span> <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_sorted_disjoint_interval_list.html">SortedDisjointIntervalList</a>& forbidden = forbidden_intervals_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>];</div>
|
|
<div class="line"><a id="l06157" name="l06157"></a><span class="lineno"> 6157</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* <span class="keyword">const</span> cumul_var = cumuls_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>];</div>
|
|
<div class="line"><a id="l06158" name="l06158"></a><span class="lineno"> 6158</span> <span class="keyword">const</span> int64_t <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">min</a> = <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::max</a>(min_value, cumul_var-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#a62b340f6d1dde6a36560bd88a382ada7">Min</a>());</div>
|
|
<div class="line"><a id="l06159" name="l06159"></a><span class="lineno"> 6159</span> <span class="keyword">const</span> int64_t <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">max</a> = <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::min</a>(max_value, cumul_var-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#ac84c250d67f30c89e845cd460eeaaad8">Max</a>());</div>
|
|
<div class="line"><a id="l06160" name="l06160"></a><span class="lineno"> 6160</span> int64_t next_start = <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">min</a>;</div>
|
|
<div class="line"><a id="l06161" name="l06161"></a><span class="lineno"> 6161</span> <span class="keywordflow">for</span> (<a class="code hl_typedef" href="classoperations__research_1_1_sorted_disjoint_interval_list.html#a887fa442455fd18cac74b3039e442aeb">SortedDisjointIntervalList::Iterator</a> <a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a> =</div>
|
|
<div class="line"><a id="l06162" name="l06162"></a><span class="lineno"> 6162</span> forbidden.<a class="code hl_function" href="classoperations__research_1_1_sorted_disjoint_interval_list.html#a815bbd9d71f04362c32528f444b2e5f4">FirstIntervalGreaterOrEqual</a>(<a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">min</a>);</div>
|
|
<div class="line"><a id="l06163" name="l06163"></a><span class="lineno"> 6163</span> <a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a> != forbidden.<a class="code hl_function" href="classoperations__research_1_1_sorted_disjoint_interval_list.html#a69b6e2a03c835ca5d658a1f16acbaa9c">end</a>(); ++<a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>) {</div>
|
|
<div class="line"><a id="l06164" name="l06164"></a><span class="lineno"> 6164</span> <span class="keywordflow">if</span> (next_start > <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">max</a>) <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l06165" name="l06165"></a><span class="lineno"> 6165</span> <span class="keywordflow">if</span> (next_start < interval->start) {</div>
|
|
<div class="line"><a id="l06166" name="l06166"></a><span class="lineno"> 6166</span> allowed.<a class="code hl_function" href="classoperations__research_1_1_sorted_disjoint_interval_list.html#a40d32f4fefffabddc000b85ca140be07">InsertInterval</a>(next_start, <a class="code hl_function" href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">CapSub</a>(<a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>->start, 1));</div>
|
|
<div class="line"><a id="l06167" name="l06167"></a><span class="lineno"> 6167</span> }</div>
|
|
<div class="line"><a id="l06168" name="l06168"></a><span class="lineno"> 6168</span> next_start = <a class="code hl_function" href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">CapAdd</a>(<a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>->end, 1);</div>
|
|
<div class="line"><a id="l06169" name="l06169"></a><span class="lineno"> 6169</span> }</div>
|
|
<div class="line"><a id="l06170" name="l06170"></a><span class="lineno"> 6170</span> <span class="keywordflow">if</span> (next_start <= <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">max</a>) {</div>
|
|
<div class="line"><a id="l06171" name="l06171"></a><span class="lineno"> 6171</span> allowed.<a class="code hl_function" href="classoperations__research_1_1_sorted_disjoint_interval_list.html#a40d32f4fefffabddc000b85ca140be07">InsertInterval</a>(next_start, <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">max</a>);</div>
|
|
<div class="line"><a id="l06172" name="l06172"></a><span class="lineno"> 6172</span> }</div>
|
|
<div class="line"><a id="l06173" name="l06173"></a><span class="lineno"> 6173</span> <span class="keywordflow">return</span> allowed;</div>
|
|
<div class="line"><a id="l06174" name="l06174"></a><span class="lineno"> 6174</span>}</div>
|
|
<div class="line"><a id="l06175" name="l06175"></a><span class="lineno"> 6175</span> </div>
|
|
<div class="line"><a id="l06176" name="l06176"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#aec65c2e89b95b1509b76fbff076666ad"> 6176</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#aec65c2e89b95b1509b76fbff076666ad">RoutingDimension::SetSpanUpperBoundForVehicle</a>(int64_t <a class="code hl_variable" href="gscip__solver_8cc.html#a1ba5ca0f61f2fa13bd23bf0f89004f35">upper_bound</a>,</div>
|
|
<div class="line"><a id="l06177" name="l06177"></a><span class="lineno"> 6177</span> <span class="keywordtype">int</span> vehicle) {</div>
|
|
<div class="line"><a id="l06178" name="l06178"></a><span class="lineno"> 6178</span> <a class="code hl_define" href="base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9">CHECK_GE</a>(vehicle, 0);</div>
|
|
<div class="line"><a id="l06179" name="l06179"></a><span class="lineno"> 6179</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(vehicle, vehicle_span_upper_bounds_.size());</div>
|
|
<div class="line"><a id="l06180" name="l06180"></a><span class="lineno"> 6180</span> <a class="code hl_define" href="base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9">CHECK_GE</a>(<a class="code hl_variable" href="gscip__solver_8cc.html#a1ba5ca0f61f2fa13bd23bf0f89004f35">upper_bound</a>, 0);</div>
|
|
<div class="line"><a id="l06181" name="l06181"></a><span class="lineno"> 6181</span> vehicle_span_upper_bounds_[vehicle] = <a class="code hl_variable" href="gscip__solver_8cc.html#a1ba5ca0f61f2fa13bd23bf0f89004f35">upper_bound</a>;</div>
|
|
<div class="line"><a id="l06182" name="l06182"></a><span class="lineno"> 6182</span>}</div>
|
|
<div class="line"><a id="l06183" name="l06183"></a><span class="lineno"> 6183</span> </div>
|
|
<div class="line"><a id="l06184" name="l06184"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#afb58020be40d47c942a4f3f0b7661068"> 6184</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#afb58020be40d47c942a4f3f0b7661068">RoutingDimension::SetSpanCostCoefficientForVehicle</a>(int64_t <a class="code hl_variable" href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a>,</div>
|
|
<div class="line"><a id="l06185" name="l06185"></a><span class="lineno"> 6185</span> <span class="keywordtype">int</span> vehicle) {</div>
|
|
<div class="line"><a id="l06186" name="l06186"></a><span class="lineno"> 6186</span> <a class="code hl_define" href="base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9">CHECK_GE</a>(vehicle, 0);</div>
|
|
<div class="line"><a id="l06187" name="l06187"></a><span class="lineno"> 6187</span> <a class="code hl_define" href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a>(vehicle, vehicle_span_cost_coefficients_.size());</div>
|
|
<div class="line"><a id="l06188" name="l06188"></a><span class="lineno"> 6188</span> <a class="code hl_define" href="base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9">CHECK_GE</a>(<a class="code hl_variable" href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a>, 0);</div>
|
|
<div class="line"><a id="l06189" name="l06189"></a><span class="lineno"> 6189</span> vehicle_span_cost_coefficients_[vehicle] = <a class="code hl_variable" href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a>;</div>
|
|
<div class="line"><a id="l06190" name="l06190"></a><span class="lineno"> 6190</span>}</div>
|
|
<div class="line"><a id="l06191" name="l06191"></a><span class="lineno"> 6191</span> </div>
|
|
<div class="line"><a id="l06192" name="l06192"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#a149832f24795a7b2c0b61da79d9ec3ba"> 6192</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a149832f24795a7b2c0b61da79d9ec3ba">RoutingDimension::SetSpanCostCoefficientForAllVehicles</a>(</div>
|
|
<div class="line"><a id="l06193" name="l06193"></a><span class="lineno"> 6193</span> int64_t <a class="code hl_variable" href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a>) {</div>
|
|
<div class="line"><a id="l06194" name="l06194"></a><span class="lineno"> 6194</span> <a class="code hl_define" href="base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9">CHECK_GE</a>(<a class="code hl_variable" href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a>, 0);</div>
|
|
<div class="line"><a id="l06195" name="l06195"></a><span class="lineno"> 6195</span> vehicle_span_cost_coefficients_.assign(model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(), <a class="code hl_variable" href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a>);</div>
|
|
<div class="line"><a id="l06196" name="l06196"></a><span class="lineno"> 6196</span>}</div>
|
|
<div class="line"><a id="l06197" name="l06197"></a><span class="lineno"> 6197</span> </div>
|
|
<div class="line"><a id="l06198" name="l06198"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#af3506c5dbc4ca4f281ed0589164f3de0"> 6198</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#af3506c5dbc4ca4f281ed0589164f3de0">RoutingDimension::SetGlobalSpanCostCoefficient</a>(int64_t <a class="code hl_variable" href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a>) {</div>
|
|
<div class="line"><a id="l06199" name="l06199"></a><span class="lineno"> 6199</span> <a class="code hl_define" href="base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9">CHECK_GE</a>(<a class="code hl_variable" href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a>, 0);</div>
|
|
<div class="line"><a id="l06200" name="l06200"></a><span class="lineno"> 6200</span> global_span_cost_coefficient_ = <a class="code hl_variable" href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a>;</div>
|
|
<div class="line"><a id="l06201" name="l06201"></a><span class="lineno"> 6201</span>}</div>
|
|
<div class="line"><a id="l06202" name="l06202"></a><span class="lineno"> 6202</span> </div>
|
|
<div class="line"><a id="l06203" name="l06203"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#a170770b614a847e56afe80355b53a363"> 6203</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a170770b614a847e56afe80355b53a363">RoutingDimension::SetCumulVarPiecewiseLinearCost</a>(</div>
|
|
<div class="line"><a id="l06204" name="l06204"></a><span class="lineno"> 6204</span> int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>, <span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_piecewise_linear_function.html">PiecewiseLinearFunction</a>& <a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a>) {</div>
|
|
<div class="line"><a id="l06205" name="l06205"></a><span class="lineno"> 6205</span> <span class="keywordflow">if</span> (!<a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a>.IsNonDecreasing()) {</div>
|
|
<div class="line"><a id="l06206" name="l06206"></a><span class="lineno"> 6206</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7">WARNING</a>) << <span class="stringliteral">"Only non-decreasing cost functions are supported."</span>;</div>
|
|
<div class="line"><a id="l06207" name="l06207"></a><span class="lineno"> 6207</span> <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l06208" name="l06208"></a><span class="lineno"> 6208</span> }</div>
|
|
<div class="line"><a id="l06209" name="l06209"></a><span class="lineno"> 6209</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a>.Value(0) < 0) {</div>
|
|
<div class="line"><a id="l06210" name="l06210"></a><span class="lineno"> 6210</span> <a class="code hl_define" href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a>(<a class="code hl_variable" href="log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7">WARNING</a>) << <span class="stringliteral">"Only positive cost functions are supported."</span>;</div>
|
|
<div class="line"><a id="l06211" name="l06211"></a><span class="lineno"> 6211</span> <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l06212" name="l06212"></a><span class="lineno"> 6212</span> }</div>
|
|
<div class="line"><a id="l06213" name="l06213"></a><span class="lineno"> 6213</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> >= cumul_var_piecewise_linear_cost_.size()) {</div>
|
|
<div class="line"><a id="l06214" name="l06214"></a><span class="lineno"> 6214</span> cumul_var_piecewise_linear_cost_.resize(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> + 1);</div>
|
|
<div class="line"><a id="l06215" name="l06215"></a><span class="lineno"> 6215</span> }</div>
|
|
<div class="line"><a id="l06216" name="l06216"></a><span class="lineno"> 6216</span> PiecewiseLinearCost& piecewise_linear_cost =</div>
|
|
<div class="line"><a id="l06217" name="l06217"></a><span class="lineno"> 6217</span> cumul_var_piecewise_linear_cost_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>];</div>
|
|
<div class="line"><a id="l06218" name="l06218"></a><span class="lineno"> 6218</span> piecewise_linear_cost.var = cumuls_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>];</div>
|
|
<div class="line"><a id="l06219" name="l06219"></a><span class="lineno"> 6219</span> piecewise_linear_cost.cost = absl::make_unique<PiecewiseLinearFunction>(<a class="code hl_variable" href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a>);</div>
|
|
<div class="line"><a id="l06220" name="l06220"></a><span class="lineno"> 6220</span>}</div>
|
|
<div class="line"><a id="l06221" name="l06221"></a><span class="lineno"> 6221</span> </div>
|
|
<div class="line"><a id="l06222" name="l06222"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#a320c6e0379386d701cc6b84a25c7f020"> 6222</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a320c6e0379386d701cc6b84a25c7f020">RoutingDimension::HasCumulVarPiecewiseLinearCost</a>(int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06223" name="l06223"></a><span class="lineno"> 6223</span> <span class="keywordflow">return</span> (<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < cumul_var_piecewise_linear_cost_.size() &&</div>
|
|
<div class="line"><a id="l06224" name="l06224"></a><span class="lineno"> 6224</span> cumul_var_piecewise_linear_cost_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].var != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l06225" name="l06225"></a><span class="lineno"> 6225</span>}</div>
|
|
<div class="line"><a id="l06226" name="l06226"></a><span class="lineno"> 6226</span> </div>
|
|
<div class="line"><a id="l06227" name="l06227"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#aa597b91522af2c0f7f36f566e22f6d4a"> 6227</a></span><span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_piecewise_linear_function.html">PiecewiseLinearFunction</a>* <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#aa597b91522af2c0f7f36f566e22f6d4a">RoutingDimension::GetCumulVarPiecewiseLinearCost</a>(</div>
|
|
<div class="line"><a id="l06228" name="l06228"></a><span class="lineno"> 6228</span> int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06229" name="l06229"></a><span class="lineno"> 6229</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < cumul_var_piecewise_linear_cost_.size() &&</div>
|
|
<div class="line"><a id="l06230" name="l06230"></a><span class="lineno"> 6230</span> cumul_var_piecewise_linear_cost_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].var != <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l06231" name="l06231"></a><span class="lineno"> 6231</span> <span class="keywordflow">return</span> cumul_var_piecewise_linear_cost_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].cost.get();</div>
|
|
<div class="line"><a id="l06232" name="l06232"></a><span class="lineno"> 6232</span> }</div>
|
|
<div class="line"><a id="l06233" name="l06233"></a><span class="lineno"> 6233</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
|
|
<div class="line"><a id="l06234" name="l06234"></a><span class="lineno"> 6234</span>}</div>
|
|
<div class="line"><a id="l06235" name="l06235"></a><span class="lineno"> 6235</span> </div>
|
|
<div class="line"><a id="l06236" name="l06236"></a><span class="lineno"> 6236</span><span class="keyword">namespace </span>{</div>
|
|
<div class="line"><a id="l06237" name="l06237"></a><span class="lineno"> 6237</span><a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* BuildVarFromExprAndIndexActiveState(<span class="keyword">const</span> <a class="code hl_class" href="classoperations__research_1_1_routing_model.html">RoutingModel</a>* <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>,</div>
|
|
<div class="line"><a id="l06238" name="l06238"></a><span class="lineno"> 6238</span> <a class="code hl_class" href="classoperations__research_1_1_int_expr.html">IntExpr</a>* expr, <span class="keywordtype">int</span> <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>) {</div>
|
|
<div class="line"><a id="l06239" name="l06239"></a><span class="lineno"> 6239</span> <a class="code hl_class" href="classoperations__research_1_1_solver.html">Solver</a>* <span class="keyword">const</span> solver = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->solver();</div>
|
|
<div class="line"><a id="l06240" name="l06240"></a><span class="lineno"> 6240</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->IsStart(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>) || <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->IsEnd(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)) {</div>
|
|
<div class="line"><a id="l06241" name="l06241"></a><span class="lineno"> 6241</span> <span class="keyword">const</span> <span class="keywordtype">int</span> vehicle = <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->VehicleIndex(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>);</div>
|
|
<div class="line"><a id="l06242" name="l06242"></a><span class="lineno"> 6242</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(vehicle, 0);</div>
|
|
<div class="line"><a id="l06243" name="l06243"></a><span class="lineno"> 6243</span> <span class="keywordflow">return</span> solver-><a class="code hl_function" href="classoperations__research_1_1_solver.html#ae88d696e499f29968ad16dcf587fff50">MakeProd</a>(expr, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->VehicleCostsConsideredVar(vehicle))</div>
|
|
<div class="line"><a id="l06244" name="l06244"></a><span class="lineno"> 6244</span> -><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#a8a1d9ddd5f5fc8f2a02b8a8700d3e3b1">Var</a>();</div>
|
|
<div class="line"><a id="l06245" name="l06245"></a><span class="lineno"> 6245</span> }</div>
|
|
<div class="line"><a id="l06246" name="l06246"></a><span class="lineno"> 6246</span> <span class="keywordflow">return</span> solver-><a class="code hl_function" href="classoperations__research_1_1_solver.html#ae88d696e499f29968ad16dcf587fff50">MakeProd</a>(expr, <a class="code hl_variable" href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a>->ActiveVar(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>))-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#a8a1d9ddd5f5fc8f2a02b8a8700d3e3b1">Var</a>();</div>
|
|
<div class="line"><a id="l06247" name="l06247"></a><span class="lineno"> 6247</span>}</div>
|
|
<div class="line"><a id="l06248" name="l06248"></a><span class="lineno"> 6248</span>} <span class="comment">// namespace</span></div>
|
|
<div class="line"><a id="l06249" name="l06249"></a><span class="lineno"> 6249</span> </div>
|
|
<div class="line"><a id="l06250" name="l06250"></a><span class="lineno"> 6250</span><span class="keywordtype">void</span> RoutingDimension::SetupCumulVarPiecewiseLinearCosts(</div>
|
|
<div class="line"><a id="l06251" name="l06251"></a><span class="lineno"> 6251</span> std::vector<IntVar*>* cost_elements)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06252" name="l06252"></a><span class="lineno"> 6252</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(cost_elements != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l06253" name="l06253"></a><span class="lineno"> 6253</span> Solver* <span class="keyword">const</span> solver = model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>();</div>
|
|
<div class="line"><a id="l06254" name="l06254"></a><span class="lineno"> 6254</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < cumul_var_piecewise_linear_cost_.size(); ++i) {</div>
|
|
<div class="line"><a id="l06255" name="l06255"></a><span class="lineno"> 6255</span> <span class="keyword">const</span> PiecewiseLinearCost& piecewise_linear_cost =</div>
|
|
<div class="line"><a id="l06256" name="l06256"></a><span class="lineno"> 6256</span> cumul_var_piecewise_linear_cost_[i];</div>
|
|
<div class="line"><a id="l06257" name="l06257"></a><span class="lineno"> 6257</span> <span class="keywordflow">if</span> (piecewise_linear_cost.var != <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l06258" name="l06258"></a><span class="lineno"> 6258</span> IntExpr* <span class="keyword">const</span> expr = solver->MakePiecewiseLinearExpr(</div>
|
|
<div class="line"><a id="l06259" name="l06259"></a><span class="lineno"> 6259</span> piecewise_linear_cost.var, *piecewise_linear_cost.cost);</div>
|
|
<div class="line"><a id="l06260" name="l06260"></a><span class="lineno"> 6260</span> IntVar* cost_var = BuildVarFromExprAndIndexActiveState(model_, expr, i);</div>
|
|
<div class="line"><a id="l06261" name="l06261"></a><span class="lineno"> 6261</span> cost_elements->push_back(cost_var);</div>
|
|
<div class="line"><a id="l06262" name="l06262"></a><span class="lineno"> 6262</span> <span class="comment">// TODO(user): Check if it wouldn't be better to minimize</span></div>
|
|
<div class="line"><a id="l06263" name="l06263"></a><span class="lineno"> 6263</span> <span class="comment">// piecewise_linear_cost.var here.</span></div>
|
|
<div class="line"><a id="l06264" name="l06264"></a><span class="lineno"> 6264</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab81fff41f3dde630902e1c4e2f534732">AddWeightedVariableMinimizedByFinalizer</a>(cost_var, 0);</div>
|
|
<div class="line"><a id="l06265" name="l06265"></a><span class="lineno"> 6265</span> }</div>
|
|
<div class="line"><a id="l06266" name="l06266"></a><span class="lineno"> 6266</span> }</div>
|
|
<div class="line"><a id="l06267" name="l06267"></a><span class="lineno"> 6267</span>}</div>
|
|
<div class="line"><a id="l06268" name="l06268"></a><span class="lineno"> 6268</span> </div>
|
|
<div class="line"><a id="l06269" name="l06269"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#ad62d2fe202a7e38982ee1dea486f7a9f"> 6269</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#ad62d2fe202a7e38982ee1dea486f7a9f">RoutingDimension::SetCumulVarSoftUpperBound</a>(int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>,</div>
|
|
<div class="line"><a id="l06270" name="l06270"></a><span class="lineno"> 6270</span> int64_t <a class="code hl_variable" href="gscip__solver_8cc.html#a1ba5ca0f61f2fa13bd23bf0f89004f35">upper_bound</a>,</div>
|
|
<div class="line"><a id="l06271" name="l06271"></a><span class="lineno"> 6271</span> int64_t <a class="code hl_variable" href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a>) {</div>
|
|
<div class="line"><a id="l06272" name="l06272"></a><span class="lineno"> 6272</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> >= cumul_var_soft_upper_bound_.size()) {</div>
|
|
<div class="line"><a id="l06273" name="l06273"></a><span class="lineno"> 6273</span> cumul_var_soft_upper_bound_.resize(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> + 1, {<span class="keyword">nullptr</span>, 0, 0});</div>
|
|
<div class="line"><a id="l06274" name="l06274"></a><span class="lineno"> 6274</span> }</div>
|
|
<div class="line"><a id="l06275" name="l06275"></a><span class="lineno"> 6275</span> cumul_var_soft_upper_bound_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>] = {cumuls_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>], <a class="code hl_variable" href="gscip__solver_8cc.html#a1ba5ca0f61f2fa13bd23bf0f89004f35">upper_bound</a>,</div>
|
|
<div class="line"><a id="l06276" name="l06276"></a><span class="lineno"> 6276</span> <a class="code hl_variable" href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a>};</div>
|
|
<div class="line"><a id="l06277" name="l06277"></a><span class="lineno"> 6277</span>}</div>
|
|
<div class="line"><a id="l06278" name="l06278"></a><span class="lineno"> 6278</span> </div>
|
|
<div class="line"><a id="l06279" name="l06279"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#a8eafd6802aace5a8b509d920de5e37c5"> 6279</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a8eafd6802aace5a8b509d920de5e37c5">RoutingDimension::HasCumulVarSoftUpperBound</a>(int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06280" name="l06280"></a><span class="lineno"> 6280</span> <span class="keywordflow">return</span> (<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < cumul_var_soft_upper_bound_.size() &&</div>
|
|
<div class="line"><a id="l06281" name="l06281"></a><span class="lineno"> 6281</span> cumul_var_soft_upper_bound_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].var != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l06282" name="l06282"></a><span class="lineno"> 6282</span>}</div>
|
|
<div class="line"><a id="l06283" name="l06283"></a><span class="lineno"> 6283</span> </div>
|
|
<div class="line"><a id="l06284" name="l06284"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#ae80c65007e8e9be55995bb2aa4493898"> 6284</a></span>int64_t <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#ae80c65007e8e9be55995bb2aa4493898">RoutingDimension::GetCumulVarSoftUpperBound</a>(int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06285" name="l06285"></a><span class="lineno"> 6285</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < cumul_var_soft_upper_bound_.size() &&</div>
|
|
<div class="line"><a id="l06286" name="l06286"></a><span class="lineno"> 6286</span> cumul_var_soft_upper_bound_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].var != <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l06287" name="l06287"></a><span class="lineno"> 6287</span> <span class="keywordflow">return</span> cumul_var_soft_upper_bound_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].bound;</div>
|
|
<div class="line"><a id="l06288" name="l06288"></a><span class="lineno"> 6288</span> }</div>
|
|
<div class="line"><a id="l06289" name="l06289"></a><span class="lineno"> 6289</span> <span class="keywordflow">return</span> cumuls_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>]->Max();</div>
|
|
<div class="line"><a id="l06290" name="l06290"></a><span class="lineno"> 6290</span>}</div>
|
|
<div class="line"><a id="l06291" name="l06291"></a><span class="lineno"> 6291</span> </div>
|
|
<div class="line"><a id="l06292" name="l06292"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#a32c310c90b2870f76dfe58ef41127d83"> 6292</a></span>int64_t <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a32c310c90b2870f76dfe58ef41127d83">RoutingDimension::GetCumulVarSoftUpperBoundCoefficient</a>(</div>
|
|
<div class="line"><a id="l06293" name="l06293"></a><span class="lineno"> 6293</span> int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06294" name="l06294"></a><span class="lineno"> 6294</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < cumul_var_soft_upper_bound_.size() &&</div>
|
|
<div class="line"><a id="l06295" name="l06295"></a><span class="lineno"> 6295</span> cumul_var_soft_upper_bound_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].var != <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l06296" name="l06296"></a><span class="lineno"> 6296</span> <span class="keywordflow">return</span> cumul_var_soft_upper_bound_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].coefficient;</div>
|
|
<div class="line"><a id="l06297" name="l06297"></a><span class="lineno"> 6297</span> }</div>
|
|
<div class="line"><a id="l06298" name="l06298"></a><span class="lineno"> 6298</span> <span class="keywordflow">return</span> 0;</div>
|
|
<div class="line"><a id="l06299" name="l06299"></a><span class="lineno"> 6299</span>}</div>
|
|
<div class="line"><a id="l06300" name="l06300"></a><span class="lineno"> 6300</span> </div>
|
|
<div class="line"><a id="l06301" name="l06301"></a><span class="lineno"> 6301</span><span class="keywordtype">void</span> RoutingDimension::SetupCumulVarSoftUpperBoundCosts(</div>
|
|
<div class="line"><a id="l06302" name="l06302"></a><span class="lineno"> 6302</span> std::vector<IntVar*>* cost_elements)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06303" name="l06303"></a><span class="lineno"> 6303</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(cost_elements != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l06304" name="l06304"></a><span class="lineno"> 6304</span> <a class="code hl_class" href="classoperations__research_1_1_solver.html">Solver</a>* <span class="keyword">const</span> solver = model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>();</div>
|
|
<div class="line"><a id="l06305" name="l06305"></a><span class="lineno"> 6305</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < cumul_var_soft_upper_bound_.size(); ++i) {</div>
|
|
<div class="line"><a id="l06306" name="l06306"></a><span class="lineno"> 6306</span> <span class="keyword">const</span> SoftBound& soft_bound = cumul_var_soft_upper_bound_[i];</div>
|
|
<div class="line"><a id="l06307" name="l06307"></a><span class="lineno"> 6307</span> <span class="keywordflow">if</span> (soft_bound.var != <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l06308" name="l06308"></a><span class="lineno"> 6308</span> <a class="code hl_class" href="classoperations__research_1_1_int_expr.html">IntExpr</a>* <span class="keyword">const</span> expr = solver-><a class="code hl_function" href="classoperations__research_1_1_solver.html#a1c80076360afc597a0a4d815b1252cf6">MakeSemiContinuousExpr</a>(</div>
|
|
<div class="line"><a id="l06309" name="l06309"></a><span class="lineno"> 6309</span> solver-><a class="code hl_function" href="classoperations__research_1_1_solver.html#ac957f0efc6de9135512f60f80ba36083">MakeSum</a>(soft_bound.var, -soft_bound.bound), 0,</div>
|
|
<div class="line"><a id="l06310" name="l06310"></a><span class="lineno"> 6310</span> soft_bound.coefficient);</div>
|
|
<div class="line"><a id="l06311" name="l06311"></a><span class="lineno"> 6311</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* cost_var = BuildVarFromExprAndIndexActiveState(model_, expr, i);</div>
|
|
<div class="line"><a id="l06312" name="l06312"></a><span class="lineno"> 6312</span> cost_elements->push_back(cost_var);</div>
|
|
<div class="line"><a id="l06313" name="l06313"></a><span class="lineno"> 6313</span> <span class="comment">// NOTE: We minimize the cost here instead of minimizing the cumul</span></div>
|
|
<div class="line"><a id="l06314" name="l06314"></a><span class="lineno"> 6314</span> <span class="comment">// variable, to avoid setting the cumul to earlier than necessary.</span></div>
|
|
<div class="line"><a id="l06315" name="l06315"></a><span class="lineno"> 6315</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab81fff41f3dde630902e1c4e2f534732">AddWeightedVariableMinimizedByFinalizer</a>(cost_var,</div>
|
|
<div class="line"><a id="l06316" name="l06316"></a><span class="lineno"> 6316</span> soft_bound.coefficient);</div>
|
|
<div class="line"><a id="l06317" name="l06317"></a><span class="lineno"> 6317</span> }</div>
|
|
<div class="line"><a id="l06318" name="l06318"></a><span class="lineno"> 6318</span> }</div>
|
|
<div class="line"><a id="l06319" name="l06319"></a><span class="lineno"> 6319</span>}</div>
|
|
<div class="line"><a id="l06320" name="l06320"></a><span class="lineno"> 6320</span> </div>
|
|
<div class="line"><a id="l06321" name="l06321"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#afc83fbeb8594e87774089b99b0add61f"> 6321</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#afc83fbeb8594e87774089b99b0add61f">RoutingDimension::SetCumulVarSoftLowerBound</a>(int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>,</div>
|
|
<div class="line"><a id="l06322" name="l06322"></a><span class="lineno"> 6322</span> int64_t <a class="code hl_variable" href="gscip__solver_8cc.html#a1e2f9a2352c1d9a6cada9544898fceec">lower_bound</a>,</div>
|
|
<div class="line"><a id="l06323" name="l06323"></a><span class="lineno"> 6323</span> int64_t <a class="code hl_variable" href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a>) {</div>
|
|
<div class="line"><a id="l06324" name="l06324"></a><span class="lineno"> 6324</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> >= cumul_var_soft_lower_bound_.size()) {</div>
|
|
<div class="line"><a id="l06325" name="l06325"></a><span class="lineno"> 6325</span> cumul_var_soft_lower_bound_.resize(<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> + 1, {<span class="keyword">nullptr</span>, 0, 0});</div>
|
|
<div class="line"><a id="l06326" name="l06326"></a><span class="lineno"> 6326</span> }</div>
|
|
<div class="line"><a id="l06327" name="l06327"></a><span class="lineno"> 6327</span> cumul_var_soft_lower_bound_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>] = {cumuls_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>], <a class="code hl_variable" href="gscip__solver_8cc.html#a1e2f9a2352c1d9a6cada9544898fceec">lower_bound</a>,</div>
|
|
<div class="line"><a id="l06328" name="l06328"></a><span class="lineno"> 6328</span> <a class="code hl_variable" href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a>};</div>
|
|
<div class="line"><a id="l06329" name="l06329"></a><span class="lineno"> 6329</span>}</div>
|
|
<div class="line"><a id="l06330" name="l06330"></a><span class="lineno"> 6330</span> </div>
|
|
<div class="line"><a id="l06331" name="l06331"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#a3ffb5532e1a2da908b35ce947f30a0a3"> 6331</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a3ffb5532e1a2da908b35ce947f30a0a3">RoutingDimension::HasCumulVarSoftLowerBound</a>(int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06332" name="l06332"></a><span class="lineno"> 6332</span> <span class="keywordflow">return</span> (<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < cumul_var_soft_lower_bound_.size() &&</div>
|
|
<div class="line"><a id="l06333" name="l06333"></a><span class="lineno"> 6333</span> cumul_var_soft_lower_bound_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].var != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l06334" name="l06334"></a><span class="lineno"> 6334</span>}</div>
|
|
<div class="line"><a id="l06335" name="l06335"></a><span class="lineno"> 6335</span> </div>
|
|
<div class="line"><a id="l06336" name="l06336"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#afe26c6f9f4c70620ce91fbff37f4834d"> 6336</a></span>int64_t <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#afe26c6f9f4c70620ce91fbff37f4834d">RoutingDimension::GetCumulVarSoftLowerBound</a>(int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06337" name="l06337"></a><span class="lineno"> 6337</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < cumul_var_soft_lower_bound_.size() &&</div>
|
|
<div class="line"><a id="l06338" name="l06338"></a><span class="lineno"> 6338</span> cumul_var_soft_lower_bound_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].var != <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l06339" name="l06339"></a><span class="lineno"> 6339</span> <span class="keywordflow">return</span> cumul_var_soft_lower_bound_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].bound;</div>
|
|
<div class="line"><a id="l06340" name="l06340"></a><span class="lineno"> 6340</span> }</div>
|
|
<div class="line"><a id="l06341" name="l06341"></a><span class="lineno"> 6341</span> <span class="keywordflow">return</span> cumuls_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>]->Min();</div>
|
|
<div class="line"><a id="l06342" name="l06342"></a><span class="lineno"> 6342</span>}</div>
|
|
<div class="line"><a id="l06343" name="l06343"></a><span class="lineno"> 6343</span> </div>
|
|
<div class="line"><a id="l06344" name="l06344"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#af63828b2874b76ba4af52bfbbed5f156"> 6344</a></span>int64_t <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#af63828b2874b76ba4af52bfbbed5f156">RoutingDimension::GetCumulVarSoftLowerBoundCoefficient</a>(</div>
|
|
<div class="line"><a id="l06345" name="l06345"></a><span class="lineno"> 6345</span> int64_t <a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06346" name="l06346"></a><span class="lineno"> 6346</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a> < cumul_var_soft_lower_bound_.size() &&</div>
|
|
<div class="line"><a id="l06347" name="l06347"></a><span class="lineno"> 6347</span> cumul_var_soft_lower_bound_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].var != <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l06348" name="l06348"></a><span class="lineno"> 6348</span> <span class="keywordflow">return</span> cumul_var_soft_lower_bound_[<a class="code hl_variable" href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a>].coefficient;</div>
|
|
<div class="line"><a id="l06349" name="l06349"></a><span class="lineno"> 6349</span> }</div>
|
|
<div class="line"><a id="l06350" name="l06350"></a><span class="lineno"> 6350</span> <span class="keywordflow">return</span> 0;</div>
|
|
<div class="line"><a id="l06351" name="l06351"></a><span class="lineno"> 6351</span>}</div>
|
|
<div class="line"><a id="l06352" name="l06352"></a><span class="lineno"> 6352</span> </div>
|
|
<div class="line"><a id="l06353" name="l06353"></a><span class="lineno"> 6353</span><span class="keywordtype">void</span> RoutingDimension::SetupCumulVarSoftLowerBoundCosts(</div>
|
|
<div class="line"><a id="l06354" name="l06354"></a><span class="lineno"> 6354</span> std::vector<IntVar*>* cost_elements)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06355" name="l06355"></a><span class="lineno"> 6355</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(cost_elements != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l06356" name="l06356"></a><span class="lineno"> 6356</span> <a class="code hl_class" href="classoperations__research_1_1_solver.html">Solver</a>* <span class="keyword">const</span> solver = model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>();</div>
|
|
<div class="line"><a id="l06357" name="l06357"></a><span class="lineno"> 6357</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < cumul_var_soft_lower_bound_.size(); ++i) {</div>
|
|
<div class="line"><a id="l06358" name="l06358"></a><span class="lineno"> 6358</span> <span class="keyword">const</span> SoftBound& soft_bound = cumul_var_soft_lower_bound_[i];</div>
|
|
<div class="line"><a id="l06359" name="l06359"></a><span class="lineno"> 6359</span> <span class="keywordflow">if</span> (soft_bound.var != <span class="keyword">nullptr</span>) {</div>
|
|
<div class="line"><a id="l06360" name="l06360"></a><span class="lineno"> 6360</span> <a class="code hl_class" href="classoperations__research_1_1_int_expr.html">IntExpr</a>* <span class="keyword">const</span> expr = solver-><a class="code hl_function" href="classoperations__research_1_1_solver.html#a1c80076360afc597a0a4d815b1252cf6">MakeSemiContinuousExpr</a>(</div>
|
|
<div class="line"><a id="l06361" name="l06361"></a><span class="lineno"> 6361</span> solver-><a class="code hl_function" href="classoperations__research_1_1_solver.html#a988e122844528e222326bd327a5d60fd">MakeDifference</a>(soft_bound.bound, soft_bound.var), 0,</div>
|
|
<div class="line"><a id="l06362" name="l06362"></a><span class="lineno"> 6362</span> soft_bound.coefficient);</div>
|
|
<div class="line"><a id="l06363" name="l06363"></a><span class="lineno"> 6363</span> <a class="code hl_class" href="classoperations__research_1_1_int_var.html">IntVar</a>* cost_var = BuildVarFromExprAndIndexActiveState(model_, expr, i);</div>
|
|
<div class="line"><a id="l06364" name="l06364"></a><span class="lineno"> 6364</span> cost_elements->push_back(cost_var);</div>
|
|
<div class="line"><a id="l06365" name="l06365"></a><span class="lineno"> 6365</span> <span class="comment">// NOTE: We minimize the cost here instead of maximizing the cumul</span></div>
|
|
<div class="line"><a id="l06366" name="l06366"></a><span class="lineno"> 6366</span> <span class="comment">// variable, to avoid setting the cumul to later than necessary.</span></div>
|
|
<div class="line"><a id="l06367" name="l06367"></a><span class="lineno"> 6367</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab81fff41f3dde630902e1c4e2f534732">AddWeightedVariableMinimizedByFinalizer</a>(cost_var,</div>
|
|
<div class="line"><a id="l06368" name="l06368"></a><span class="lineno"> 6368</span> soft_bound.coefficient);</div>
|
|
<div class="line"><a id="l06369" name="l06369"></a><span class="lineno"> 6369</span> }</div>
|
|
<div class="line"><a id="l06370" name="l06370"></a><span class="lineno"> 6370</span> }</div>
|
|
<div class="line"><a id="l06371" name="l06371"></a><span class="lineno"> 6371</span>}</div>
|
|
<div class="line"><a id="l06372" name="l06372"></a><span class="lineno"> 6372</span> </div>
|
|
<div class="line"><a id="l06373" name="l06373"></a><span class="lineno"> 6373</span><span class="keywordtype">void</span> RoutingDimension::SetupGlobalSpanCost(</div>
|
|
<div class="line"><a id="l06374" name="l06374"></a><span class="lineno"> 6374</span> std::vector<IntVar*>* cost_elements)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06375" name="l06375"></a><span class="lineno"> 6375</span> <a class="code hl_define" href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a>(cost_elements != <span class="keyword">nullptr</span>);</div>
|
|
<div class="line"><a id="l06376" name="l06376"></a><span class="lineno"> 6376</span> Solver* <span class="keyword">const</span> solver = model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a0b526d33739114e9255ffbe8343efe1a">solver</a>();</div>
|
|
<div class="line"><a id="l06377" name="l06377"></a><span class="lineno"> 6377</span> <span class="keywordflow">if</span> (global_span_cost_coefficient_ != 0) {</div>
|
|
<div class="line"><a id="l06378" name="l06378"></a><span class="lineno"> 6378</span> std::vector<IntVar*> end_cumuls;</div>
|
|
<div class="line"><a id="l06379" name="l06379"></a><span class="lineno"> 6379</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++i) {</div>
|
|
<div class="line"><a id="l06380" name="l06380"></a><span class="lineno"> 6380</span> end_cumuls.push_back(solver</div>
|
|
<div class="line"><a id="l06381" name="l06381"></a><span class="lineno"> 6381</span> ->MakeProd(model_->vehicle_costs_considered_[i],</div>
|
|
<div class="line"><a id="l06382" name="l06382"></a><span class="lineno"> 6382</span> cumuls_[model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afb80fd36c1fb57d2db049403483e2074">End</a>(i)])</div>
|
|
<div class="line"><a id="l06383" name="l06383"></a><span class="lineno"> 6383</span> ->Var());</div>
|
|
<div class="line"><a id="l06384" name="l06384"></a><span class="lineno"> 6384</span> }</div>
|
|
<div class="line"><a id="l06385" name="l06385"></a><span class="lineno"> 6385</span> IntVar* <span class="keyword">const</span> max_end_cumul = solver-><a class="code hl_function" href="classoperations__research_1_1_solver.html#a934e08f84e590e48ab860fcd97ca7130">MakeMax</a>(end_cumuls)-><a class="code hl_function" href="classoperations__research_1_1_int_expr.html#a8a1d9ddd5f5fc8f2a02b8a8700d3e3b1">Var</a>();</div>
|
|
<div class="line"><a id="l06386" name="l06386"></a><span class="lineno"> 6386</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab81fff41f3dde630902e1c4e2f534732">AddWeightedVariableMinimizedByFinalizer</a>(</div>
|
|
<div class="line"><a id="l06387" name="l06387"></a><span class="lineno"> 6387</span> max_end_cumul, global_span_cost_coefficient_);</div>
|
|
<div class="line"><a id="l06388" name="l06388"></a><span class="lineno"> 6388</span> std::vector<IntVar*> start_cumuls;</div>
|
|
<div class="line"><a id="l06389" name="l06389"></a><span class="lineno"> 6389</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++i) {</div>
|
|
<div class="line"><a id="l06390" name="l06390"></a><span class="lineno"> 6390</span> IntVar* global_span_cost_start_cumul =</div>
|
|
<div class="line"><a id="l06391" name="l06391"></a><span class="lineno"> 6391</span> solver->MakeIntVar(0, <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>());</div>
|
|
<div class="line"><a id="l06392" name="l06392"></a><span class="lineno"> 6392</span> solver->AddConstraint(solver->MakeIfThenElseCt(</div>
|
|
<div class="line"><a id="l06393" name="l06393"></a><span class="lineno"> 6393</span> model_->vehicle_costs_considered_[i], cumuls_[model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(i)],</div>
|
|
<div class="line"><a id="l06394" name="l06394"></a><span class="lineno"> 6394</span> max_end_cumul, global_span_cost_start_cumul));</div>
|
|
<div class="line"><a id="l06395" name="l06395"></a><span class="lineno"> 6395</span> start_cumuls.push_back(global_span_cost_start_cumul);</div>
|
|
<div class="line"><a id="l06396" name="l06396"></a><span class="lineno"> 6396</span> }</div>
|
|
<div class="line"><a id="l06397" name="l06397"></a><span class="lineno"> 6397</span> IntVar* <span class="keyword">const</span> min_start_cumul = solver->MakeMin(start_cumuls)->Var();</div>
|
|
<div class="line"><a id="l06398" name="l06398"></a><span class="lineno"> 6398</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab81fff41f3dde630902e1c4e2f534732">AddWeightedVariableMinimizedByFinalizer</a>(</div>
|
|
<div class="line"><a id="l06399" name="l06399"></a><span class="lineno"> 6399</span> min_start_cumul, global_span_cost_coefficient_);</div>
|
|
<div class="line"><a id="l06400" name="l06400"></a><span class="lineno"> 6400</span> <span class="comment">// If there is a single vehicle, model the cost as the sum of its transits</span></div>
|
|
<div class="line"><a id="l06401" name="l06401"></a><span class="lineno"> 6401</span> <span class="comment">// to avoid slow (infinite) propagation loops.</span></div>
|
|
<div class="line"><a id="l06402" name="l06402"></a><span class="lineno"> 6402</span> <span class="comment">// TODO(user): Avoid slow propagation in the path constraints.</span></div>
|
|
<div class="line"><a id="l06403" name="l06403"></a><span class="lineno"> 6403</span> <span class="keywordflow">if</span> (model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>() == 1) {</div>
|
|
<div class="line"><a id="l06404" name="l06404"></a><span class="lineno"> 6404</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> var_index = 0; var_index < model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a572bd92c25ebc67c72137fd59e53f6d6">Size</a>(); ++var_index) {</div>
|
|
<div class="line"><a id="l06405" name="l06405"></a><span class="lineno"> 6405</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab81fff41f3dde630902e1c4e2f534732">AddWeightedVariableMinimizedByFinalizer</a>(</div>
|
|
<div class="line"><a id="l06406" name="l06406"></a><span class="lineno"> 6406</span> slacks_[var_index], global_span_cost_coefficient_);</div>
|
|
<div class="line"><a id="l06407" name="l06407"></a><span class="lineno"> 6407</span> cost_elements->push_back(</div>
|
|
<div class="line"><a id="l06408" name="l06408"></a><span class="lineno"> 6408</span> solver</div>
|
|
<div class="line"><a id="l06409" name="l06409"></a><span class="lineno"> 6409</span> ->MakeProd(</div>
|
|
<div class="line"><a id="l06410" name="l06410"></a><span class="lineno"> 6410</span> model_->vehicle_costs_considered_[0],</div>
|
|
<div class="line"><a id="l06411" name="l06411"></a><span class="lineno"> 6411</span> solver->MakeProd(</div>
|
|
<div class="line"><a id="l06412" name="l06412"></a><span class="lineno"> 6412</span> solver->MakeProd(</div>
|
|
<div class="line"><a id="l06413" name="l06413"></a><span class="lineno"> 6413</span> solver->MakeSum(transits_[var_index],</div>
|
|
<div class="line"><a id="l06414" name="l06414"></a><span class="lineno"> 6414</span> dependent_transits_[var_index]),</div>
|
|
<div class="line"><a id="l06415" name="l06415"></a><span class="lineno"> 6415</span> global_span_cost_coefficient_),</div>
|
|
<div class="line"><a id="l06416" name="l06416"></a><span class="lineno"> 6416</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab1d54f34a26afd08eeef25e8725dd7c2">ActiveVar</a>(var_index)))</div>
|
|
<div class="line"><a id="l06417" name="l06417"></a><span class="lineno"> 6417</span> ->Var());</div>
|
|
<div class="line"><a id="l06418" name="l06418"></a><span class="lineno"> 6418</span> }</div>
|
|
<div class="line"><a id="l06419" name="l06419"></a><span class="lineno"> 6419</span> } <span class="keywordflow">else</span> {</div>
|
|
<div class="line"><a id="l06420" name="l06420"></a><span class="lineno"> 6420</span> IntVar* <span class="keyword">const</span> end_range =</div>
|
|
<div class="line"><a id="l06421" name="l06421"></a><span class="lineno"> 6421</span> solver->MakeDifference(max_end_cumul, min_start_cumul)->Var();</div>
|
|
<div class="line"><a id="l06422" name="l06422"></a><span class="lineno"> 6422</span> end_range->SetMin(0);</div>
|
|
<div class="line"><a id="l06423" name="l06423"></a><span class="lineno"> 6423</span> cost_elements->push_back(</div>
|
|
<div class="line"><a id="l06424" name="l06424"></a><span class="lineno"> 6424</span> solver->MakeProd(end_range, global_span_cost_coefficient_)->Var());</div>
|
|
<div class="line"><a id="l06425" name="l06425"></a><span class="lineno"> 6425</span> }</div>
|
|
<div class="line"><a id="l06426" name="l06426"></a><span class="lineno"> 6426</span> }</div>
|
|
<div class="line"><a id="l06427" name="l06427"></a><span class="lineno"> 6427</span>}</div>
|
|
<div class="line"><a id="l06428" name="l06428"></a><span class="lineno"> 6428</span> </div>
|
|
<div class="line"><a id="l06429" name="l06429"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#ac85353f4ba32aecc3dac32ba1a552bda"> 6429</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#ae34995163df20f89961e907ac3b25532">RoutingDimension::SetBreakIntervalsOfVehicle</a>(</div>
|
|
<div class="line"><a id="l06430" name="l06430"></a><span class="lineno"> 6430</span> std::vector<IntervalVar*> breaks, <span class="keywordtype">int</span> vehicle,</div>
|
|
<div class="line"><a id="l06431" name="l06431"></a><span class="lineno"> 6431</span> std::vector<int64_t> node_visit_transits) {</div>
|
|
<div class="line"><a id="l06432" name="l06432"></a><span class="lineno"> 6432</span> <span class="keywordflow">if</span> (breaks.empty()) <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l06433" name="l06433"></a><span class="lineno"> 6433</span> <span class="keyword">const</span> <span class="keywordtype">int</span> visit_evaluator = <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a90dcdb4d66f8781421f5913150a85a06">model</a>()-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8c58bbbfc090a581f02d76fabf465b3e">RegisterTransitCallback</a>(</div>
|
|
<div class="line"><a id="l06434" name="l06434"></a><span class="lineno"> 6434</span> [node_visit_transits](int64_t from, int64_t to) {</div>
|
|
<div class="line"><a id="l06435" name="l06435"></a><span class="lineno"> 6435</span> <span class="keywordflow">return</span> node_visit_transits[from];</div>
|
|
<div class="line"><a id="l06436" name="l06436"></a><span class="lineno"> 6436</span> });</div>
|
|
<div class="line"><a id="l06437" name="l06437"></a><span class="lineno"> 6437</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#ae34995163df20f89961e907ac3b25532">SetBreakIntervalsOfVehicle</a>(std::move(breaks), vehicle, visit_evaluator, -1);</div>
|
|
<div class="line"><a id="l06438" name="l06438"></a><span class="lineno"> 6438</span>}</div>
|
|
<div class="line"><a id="l06439" name="l06439"></a><span class="lineno"> 6439</span> </div>
|
|
<div class="line"><a id="l06440" name="l06440"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#aa7712e580d7e88364f8db5a7c19ca87c"> 6440</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#ae34995163df20f89961e907ac3b25532">RoutingDimension::SetBreakIntervalsOfVehicle</a>(</div>
|
|
<div class="line"><a id="l06441" name="l06441"></a><span class="lineno"> 6441</span> std::vector<IntervalVar*> breaks, <span class="keywordtype">int</span> vehicle,</div>
|
|
<div class="line"><a id="l06442" name="l06442"></a><span class="lineno"> 6442</span> std::vector<int64_t> node_visit_transits,</div>
|
|
<div class="line"><a id="l06443" name="l06443"></a><span class="lineno"> 6443</span> std::function<int64_t(int64_t, int64_t)> delays) {</div>
|
|
<div class="line"><a id="l06444" name="l06444"></a><span class="lineno"> 6444</span> <span class="keywordflow">if</span> (breaks.empty()) <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l06445" name="l06445"></a><span class="lineno"> 6445</span> <span class="keyword">const</span> <span class="keywordtype">int</span> visit_evaluator = <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a90dcdb4d66f8781421f5913150a85a06">model</a>()-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8c58bbbfc090a581f02d76fabf465b3e">RegisterTransitCallback</a>(</div>
|
|
<div class="line"><a id="l06446" name="l06446"></a><span class="lineno"> 6446</span> [node_visit_transits](int64_t from, int64_t to) {</div>
|
|
<div class="line"><a id="l06447" name="l06447"></a><span class="lineno"> 6447</span> <span class="keywordflow">return</span> node_visit_transits[from];</div>
|
|
<div class="line"><a id="l06448" name="l06448"></a><span class="lineno"> 6448</span> });</div>
|
|
<div class="line"><a id="l06449" name="l06449"></a><span class="lineno"> 6449</span> <span class="keyword">const</span> <span class="keywordtype">int</span> delay_evaluator =</div>
|
|
<div class="line"><a id="l06450" name="l06450"></a><span class="lineno"> 6450</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a90dcdb4d66f8781421f5913150a85a06">model</a>()-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8c58bbbfc090a581f02d76fabf465b3e">RegisterTransitCallback</a>(std::move(delays));</div>
|
|
<div class="line"><a id="l06451" name="l06451"></a><span class="lineno"> 6451</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#ae34995163df20f89961e907ac3b25532">SetBreakIntervalsOfVehicle</a>(std::move(breaks), vehicle, visit_evaluator,</div>
|
|
<div class="line"><a id="l06452" name="l06452"></a><span class="lineno"> 6452</span> delay_evaluator);</div>
|
|
<div class="line"><a id="l06453" name="l06453"></a><span class="lineno"> 6453</span>}</div>
|
|
<div class="line"><a id="l06454" name="l06454"></a><span class="lineno"> 6454</span> </div>
|
|
<div class="line"><a id="l06455" name="l06455"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#ae34995163df20f89961e907ac3b25532"> 6455</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#ae34995163df20f89961e907ac3b25532">RoutingDimension::SetBreakIntervalsOfVehicle</a>(</div>
|
|
<div class="line"><a id="l06456" name="l06456"></a><span class="lineno"> 6456</span> std::vector<IntervalVar*> breaks, <span class="keywordtype">int</span> vehicle, <span class="keywordtype">int</span> pre_travel_evaluator,</div>
|
|
<div class="line"><a id="l06457" name="l06457"></a><span class="lineno"> 6457</span> <span class="keywordtype">int</span> post_travel_evaluator) {</div>
|
|
<div class="line"><a id="l06458" name="l06458"></a><span class="lineno"> 6458</span> <a class="code hl_define" href="base_2logging_8h.html#a4395e95bab44e222cb2e77251017a0e2">DCHECK_LE</a>(0, vehicle);</div>
|
|
<div class="line"><a id="l06459" name="l06459"></a><span class="lineno"> 6459</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(vehicle, model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>());</div>
|
|
<div class="line"><a id="l06460" name="l06460"></a><span class="lineno"> 6460</span> <span class="keywordflow">if</span> (breaks.empty()) <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l06461" name="l06461"></a><span class="lineno"> 6461</span> <span class="keywordflow">if</span> (!break_constraints_are_initialized_) <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a76645042dd00fd9a97a9c4a395927947">InitializeBreaks</a>();</div>
|
|
<div class="line"><a id="l06462" name="l06462"></a><span class="lineno"> 6462</span> vehicle_break_intervals_[vehicle] = std::move(breaks);</div>
|
|
<div class="line"><a id="l06463" name="l06463"></a><span class="lineno"> 6463</span> vehicle_pre_travel_evaluators_[vehicle] = pre_travel_evaluator;</div>
|
|
<div class="line"><a id="l06464" name="l06464"></a><span class="lineno"> 6464</span> vehicle_post_travel_evaluators_[vehicle] = post_travel_evaluator;</div>
|
|
<div class="line"><a id="l06465" name="l06465"></a><span class="lineno"> 6465</span> <span class="comment">// Breaks intervals must be fixed by search.</span></div>
|
|
<div class="line"><a id="l06466" name="l06466"></a><span class="lineno"> 6466</span> <span class="keywordflow">for</span> (<a class="code hl_class" href="classoperations__research_1_1_interval_var.html">IntervalVar</a>* <span class="keyword">const</span> <a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a> : vehicle_break_intervals_[vehicle]) {</div>
|
|
<div class="line"><a id="l06467" name="l06467"></a><span class="lineno"> 6467</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#ab878a81ace850e3ecd26e95966409f61">AddIntervalToAssignment</a>(<a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>);</div>
|
|
<div class="line"><a id="l06468" name="l06468"></a><span class="lineno"> 6468</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>->MayBePerformed() && !<a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>->MustBePerformed()) {</div>
|
|
<div class="line"><a id="l06469" name="l06469"></a><span class="lineno"> 6469</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8fc98154baec00fd3be88c9d6a0234dc">AddVariableTargetToFinalizer</a>(<a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>->PerformedExpr()->Var(), 0);</div>
|
|
<div class="line"><a id="l06470" name="l06470"></a><span class="lineno"> 6470</span> }</div>
|
|
<div class="line"><a id="l06471" name="l06471"></a><span class="lineno"> 6471</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8fc98154baec00fd3be88c9d6a0234dc">AddVariableTargetToFinalizer</a>(<a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>->SafeStartExpr(0)->Var(),</div>
|
|
<div class="line"><a id="l06472" name="l06472"></a><span class="lineno"> 6472</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits<int64_t>::min</a>());</div>
|
|
<div class="line"><a id="l06473" name="l06473"></a><span class="lineno"> 6473</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8fc98154baec00fd3be88c9d6a0234dc">AddVariableTargetToFinalizer</a>(<a class="code hl_variable" href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a>->SafeDurationExpr(0)->Var(),</div>
|
|
<div class="line"><a id="l06474" name="l06474"></a><span class="lineno"> 6474</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits<int64_t>::min</a>());</div>
|
|
<div class="line"><a id="l06475" name="l06475"></a><span class="lineno"> 6475</span> }</div>
|
|
<div class="line"><a id="l06476" name="l06476"></a><span class="lineno"> 6476</span> <span class="comment">// When a vehicle has breaks, if its start and end are fixed,</span></div>
|
|
<div class="line"><a id="l06477" name="l06477"></a><span class="lineno"> 6477</span> <span class="comment">// then propagation keeps the cumuls min and max on its path feasible.</span></div>
|
|
<div class="line"><a id="l06478" name="l06478"></a><span class="lineno"> 6478</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8fc98154baec00fd3be88c9d6a0234dc">AddVariableTargetToFinalizer</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a3a71e48b4ed287752b9d9d9f7086ec7d">CumulVar</a>(model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afb80fd36c1fb57d2db049403483e2074">End</a>(vehicle)),</div>
|
|
<div class="line"><a id="l06479" name="l06479"></a><span class="lineno"> 6479</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits<int64_t>::min</a>());</div>
|
|
<div class="line"><a id="l06480" name="l06480"></a><span class="lineno"> 6480</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8fc98154baec00fd3be88c9d6a0234dc">AddVariableTargetToFinalizer</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a3a71e48b4ed287752b9d9d9f7086ec7d">CumulVar</a>(model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(vehicle)),</div>
|
|
<div class="line"><a id="l06481" name="l06481"></a><span class="lineno"> 6481</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>());</div>
|
|
<div class="line"><a id="l06482" name="l06482"></a><span class="lineno"> 6482</span>}</div>
|
|
<div class="line"><a id="l06483" name="l06483"></a><span class="lineno"> 6483</span> </div>
|
|
<div class="line"><a id="l06484" name="l06484"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#a76645042dd00fd9a97a9c4a395927947"> 6484</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a76645042dd00fd9a97a9c4a395927947">RoutingDimension::InitializeBreaks</a>() {</div>
|
|
<div class="line"><a id="l06485" name="l06485"></a><span class="lineno"> 6485</span> <a class="code hl_define" href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a>(!break_constraints_are_initialized_);</div>
|
|
<div class="line"><a id="l06486" name="l06486"></a><span class="lineno"> 6486</span> <span class="keyword">const</span> <span class="keywordtype">int</span> num_vehicles = model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>();</div>
|
|
<div class="line"><a id="l06487" name="l06487"></a><span class="lineno"> 6487</span> vehicle_break_intervals_.resize(num_vehicles);</div>
|
|
<div class="line"><a id="l06488" name="l06488"></a><span class="lineno"> 6488</span> vehicle_pre_travel_evaluators_.resize(num_vehicles, -1);</div>
|
|
<div class="line"><a id="l06489" name="l06489"></a><span class="lineno"> 6489</span> vehicle_post_travel_evaluators_.resize(num_vehicles, -1);</div>
|
|
<div class="line"><a id="l06490" name="l06490"></a><span class="lineno"> 6490</span> vehicle_break_distance_duration_.resize(num_vehicles);</div>
|
|
<div class="line"><a id="l06491" name="l06491"></a><span class="lineno"> 6491</span> break_constraints_are_initialized_ = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l06492" name="l06492"></a><span class="lineno"> 6492</span>}</div>
|
|
<div class="line"><a id="l06493" name="l06493"></a><span class="lineno"> 6493</span> </div>
|
|
<div class="line"><a id="l06494" name="l06494"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#a6debc638c02bfb2b4afe0afccdd98ca5"> 6494</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a6debc638c02bfb2b4afe0afccdd98ca5">RoutingDimension::HasBreakConstraints</a>()<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06495" name="l06495"></a><span class="lineno"> 6495</span> <span class="keywordflow">return</span> break_constraints_are_initialized_;</div>
|
|
<div class="line"><a id="l06496" name="l06496"></a><span class="lineno"> 6496</span>}</div>
|
|
<div class="line"><a id="l06497" name="l06497"></a><span class="lineno"> 6497</span> </div>
|
|
<div class="line"><a id="l06498" name="l06498"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#a91b8a6eb7cf5ab0ebc74ddced140d700"> 6498</a></span><span class="keyword">const</span> std::vector<IntervalVar*>& <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a91b8a6eb7cf5ab0ebc74ddced140d700">RoutingDimension::GetBreakIntervalsOfVehicle</a>(</div>
|
|
<div class="line"><a id="l06499" name="l06499"></a><span class="lineno"> 6499</span> <span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06500" name="l06500"></a><span class="lineno"> 6500</span> <a class="code hl_define" href="base_2logging_8h.html#a4395e95bab44e222cb2e77251017a0e2">DCHECK_LE</a>(0, vehicle);</div>
|
|
<div class="line"><a id="l06501" name="l06501"></a><span class="lineno"> 6501</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(vehicle, vehicle_break_intervals_.size());</div>
|
|
<div class="line"><a id="l06502" name="l06502"></a><span class="lineno"> 6502</span> <span class="keywordflow">return</span> vehicle_break_intervals_[vehicle];</div>
|
|
<div class="line"><a id="l06503" name="l06503"></a><span class="lineno"> 6503</span>}</div>
|
|
<div class="line"><a id="l06504" name="l06504"></a><span class="lineno"> 6504</span> </div>
|
|
<div class="line"><a id="l06505" name="l06505"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#a8e93e99ce491f2779c0d2e5e7de5a98a"> 6505</a></span><span class="keywordtype">int</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a8e93e99ce491f2779c0d2e5e7de5a98a">RoutingDimension::GetPreTravelEvaluatorOfVehicle</a>(<span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06506" name="l06506"></a><span class="lineno"> 6506</span> <a class="code hl_define" href="base_2logging_8h.html#a4395e95bab44e222cb2e77251017a0e2">DCHECK_LE</a>(0, vehicle);</div>
|
|
<div class="line"><a id="l06507" name="l06507"></a><span class="lineno"> 6507</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(vehicle, vehicle_pre_travel_evaluators_.size());</div>
|
|
<div class="line"><a id="l06508" name="l06508"></a><span class="lineno"> 6508</span> <span class="keywordflow">return</span> vehicle_pre_travel_evaluators_[vehicle];</div>
|
|
<div class="line"><a id="l06509" name="l06509"></a><span class="lineno"> 6509</span>}</div>
|
|
<div class="line"><a id="l06510" name="l06510"></a><span class="lineno"> 6510</span> </div>
|
|
<div class="line"><a id="l06511" name="l06511"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#afb4c32e76561cad95bd8be2777d8f1ac"> 6511</a></span><span class="keywordtype">int</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#afb4c32e76561cad95bd8be2777d8f1ac">RoutingDimension::GetPostTravelEvaluatorOfVehicle</a>(<span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06512" name="l06512"></a><span class="lineno"> 6512</span> <a class="code hl_define" href="base_2logging_8h.html#a4395e95bab44e222cb2e77251017a0e2">DCHECK_LE</a>(0, vehicle);</div>
|
|
<div class="line"><a id="l06513" name="l06513"></a><span class="lineno"> 6513</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(vehicle, vehicle_post_travel_evaluators_.size());</div>
|
|
<div class="line"><a id="l06514" name="l06514"></a><span class="lineno"> 6514</span> <span class="keywordflow">return</span> vehicle_post_travel_evaluators_[vehicle];</div>
|
|
<div class="line"><a id="l06515" name="l06515"></a><span class="lineno"> 6515</span>}</div>
|
|
<div class="line"><a id="l06516" name="l06516"></a><span class="lineno"> 6516</span> </div>
|
|
<div class="line"><a id="l06517" name="l06517"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#a53a1734d4818932a457346136f5f2bdc"> 6517</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a53a1734d4818932a457346136f5f2bdc">RoutingDimension::SetBreakDistanceDurationOfVehicle</a>(int64_t <a class="code hl_variable" href="routing__search_8cc.html#a79b8e036dca6911e3295a47d99f21f43">distance</a>,</div>
|
|
<div class="line"><a id="l06518" name="l06518"></a><span class="lineno"> 6518</span> int64_t duration,</div>
|
|
<div class="line"><a id="l06519" name="l06519"></a><span class="lineno"> 6519</span> <span class="keywordtype">int</span> vehicle) {</div>
|
|
<div class="line"><a id="l06520" name="l06520"></a><span class="lineno"> 6520</span> <a class="code hl_define" href="base_2logging_8h.html#a4395e95bab44e222cb2e77251017a0e2">DCHECK_LE</a>(0, vehicle);</div>
|
|
<div class="line"><a id="l06521" name="l06521"></a><span class="lineno"> 6521</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(vehicle, model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>());</div>
|
|
<div class="line"><a id="l06522" name="l06522"></a><span class="lineno"> 6522</span> <span class="keywordflow">if</span> (!break_constraints_are_initialized_) <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a76645042dd00fd9a97a9c4a395927947">InitializeBreaks</a>();</div>
|
|
<div class="line"><a id="l06523" name="l06523"></a><span class="lineno"> 6523</span> vehicle_break_distance_duration_[vehicle].emplace_back(<a class="code hl_variable" href="routing__search_8cc.html#a79b8e036dca6911e3295a47d99f21f43">distance</a>, duration);</div>
|
|
<div class="line"><a id="l06524" name="l06524"></a><span class="lineno"> 6524</span> <span class="comment">// When a vehicle has breaks, if its start and end are fixed,</span></div>
|
|
<div class="line"><a id="l06525" name="l06525"></a><span class="lineno"> 6525</span> <span class="comment">// then propagation keeps the cumuls min and max on its path feasible.</span></div>
|
|
<div class="line"><a id="l06526" name="l06526"></a><span class="lineno"> 6526</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8fc98154baec00fd3be88c9d6a0234dc">AddVariableTargetToFinalizer</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a3a71e48b4ed287752b9d9d9f7086ec7d">CumulVar</a>(model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afb80fd36c1fb57d2db049403483e2074">End</a>(vehicle)),</div>
|
|
<div class="line"><a id="l06527" name="l06527"></a><span class="lineno"> 6527</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits<int64_t>::min</a>());</div>
|
|
<div class="line"><a id="l06528" name="l06528"></a><span class="lineno"> 6528</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8fc98154baec00fd3be88c9d6a0234dc">AddVariableTargetToFinalizer</a>(<a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a3a71e48b4ed287752b9d9d9f7086ec7d">CumulVar</a>(model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(vehicle)),</div>
|
|
<div class="line"><a id="l06529" name="l06529"></a><span class="lineno"> 6529</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>());</div>
|
|
<div class="line"><a id="l06530" name="l06530"></a><span class="lineno"> 6530</span>}</div>
|
|
<div class="line"><a id="l06531" name="l06531"></a><span class="lineno"> 6531</span> </div>
|
|
<div class="line"><a id="l06532" name="l06532"></a><span class="lineno"> 6532</span><span class="keyword">const</span> std::vector<std::pair<int64_t, int64_t>>&</div>
|
|
<div class="line"><a id="l06533" name="l06533"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#aeb48e0a259af538f591d9f843c113d00"> 6533</a></span><a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#aeb48e0a259af538f591d9f843c113d00">RoutingDimension::GetBreakDistanceDurationOfVehicle</a>(<span class="keywordtype">int</span> vehicle)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06534" name="l06534"></a><span class="lineno"> 6534</span> <a class="code hl_define" href="base_2logging_8h.html#a4395e95bab44e222cb2e77251017a0e2">DCHECK_LE</a>(0, vehicle);</div>
|
|
<div class="line"><a id="l06535" name="l06535"></a><span class="lineno"> 6535</span> <a class="code hl_define" href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a>(vehicle, vehicle_break_distance_duration_.size());</div>
|
|
<div class="line"><a id="l06536" name="l06536"></a><span class="lineno"> 6536</span> <span class="keywordflow">return</span> vehicle_break_distance_duration_[vehicle];</div>
|
|
<div class="line"><a id="l06537" name="l06537"></a><span class="lineno"> 6537</span>}</div>
|
|
<div class="line"><a id="l06538" name="l06538"></a><span class="lineno"> 6538</span> </div>
|
|
<div class="line"><a id="l06539" name="l06539"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#aa21323f8eeaa9c502d6cfb92109a73d4"> 6539</a></span><span class="keywordtype">void</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#aa21323f8eeaa9c502d6cfb92109a73d4">RoutingDimension::SetPickupToDeliveryLimitFunctionForPair</a>(</div>
|
|
<div class="line"><a id="l06540" name="l06540"></a><span class="lineno"> 6540</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_dimension.html#a7d1899ebcd524b8902d6777a1644fdc9">PickupToDeliveryLimitFunction</a> limit_function, <span class="keywordtype">int</span> pair_index) {</div>
|
|
<div class="line"><a id="l06541" name="l06541"></a><span class="lineno"> 6541</span> <a class="code hl_define" href="base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9">CHECK_GE</a>(pair_index, 0);</div>
|
|
<div class="line"><a id="l06542" name="l06542"></a><span class="lineno"> 6542</span> <span class="keywordflow">if</span> (pair_index >= pickup_to_delivery_limits_per_pair_index_.size()) {</div>
|
|
<div class="line"><a id="l06543" name="l06543"></a><span class="lineno"> 6543</span> pickup_to_delivery_limits_per_pair_index_.resize(pair_index + 1);</div>
|
|
<div class="line"><a id="l06544" name="l06544"></a><span class="lineno"> 6544</span> }</div>
|
|
<div class="line"><a id="l06545" name="l06545"></a><span class="lineno"> 6545</span> pickup_to_delivery_limits_per_pair_index_[pair_index] =</div>
|
|
<div class="line"><a id="l06546" name="l06546"></a><span class="lineno"> 6546</span> std::move(limit_function);</div>
|
|
<div class="line"><a id="l06547" name="l06547"></a><span class="lineno"> 6547</span>}</div>
|
|
<div class="line"><a id="l06548" name="l06548"></a><span class="lineno"> 6548</span> </div>
|
|
<div class="line"><a id="l06549" name="l06549"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#a36f4aa60ff1b8c1dd5fc1180199cad8d"> 6549</a></span><span class="keywordtype">bool</span> <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a36f4aa60ff1b8c1dd5fc1180199cad8d">RoutingDimension::HasPickupToDeliveryLimits</a>()<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06550" name="l06550"></a><span class="lineno"> 6550</span> <span class="keywordflow">return</span> !pickup_to_delivery_limits_per_pair_index_.empty();</div>
|
|
<div class="line"><a id="l06551" name="l06551"></a><span class="lineno"> 6551</span>}</div>
|
|
<div class="line"><a id="l06552" name="l06552"></a><span class="lineno"> 6552</span> </div>
|
|
<div class="line"><a id="l06553" name="l06553"></a><span class="lineno"><a class="line" href="classoperations__research_1_1_routing_dimension.html#a3efd441f3accdd91d91ffbd1d4e1b255"> 6553</a></span>int64_t <a class="code hl_function" href="classoperations__research_1_1_routing_dimension.html#a3efd441f3accdd91d91ffbd1d4e1b255">RoutingDimension::GetPickupToDeliveryLimitForPair</a>(<span class="keywordtype">int</span> pair_index,</div>
|
|
<div class="line"><a id="l06554" name="l06554"></a><span class="lineno"> 6554</span> <span class="keywordtype">int</span> pickup,</div>
|
|
<div class="line"><a id="l06555" name="l06555"></a><span class="lineno"> 6555</span> <span class="keywordtype">int</span> delivery)<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06556" name="l06556"></a><span class="lineno"> 6556</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(pair_index, 0);</div>
|
|
<div class="line"><a id="l06557" name="l06557"></a><span class="lineno"> 6557</span> </div>
|
|
<div class="line"><a id="l06558" name="l06558"></a><span class="lineno"> 6558</span> <span class="keywordflow">if</span> (pair_index >= pickup_to_delivery_limits_per_pair_index_.size()) {</div>
|
|
<div class="line"><a id="l06559" name="l06559"></a><span class="lineno"> 6559</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>();</div>
|
|
<div class="line"><a id="l06560" name="l06560"></a><span class="lineno"> 6560</span> }</div>
|
|
<div class="line"><a id="l06561" name="l06561"></a><span class="lineno"> 6561</span> <span class="keyword">const</span> <a class="code hl_typedef" href="classoperations__research_1_1_routing_dimension.html#a7d1899ebcd524b8902d6777a1644fdc9">PickupToDeliveryLimitFunction</a>& pickup_to_delivery_limit_function =</div>
|
|
<div class="line"><a id="l06562" name="l06562"></a><span class="lineno"> 6562</span> pickup_to_delivery_limits_per_pair_index_[pair_index];</div>
|
|
<div class="line"><a id="l06563" name="l06563"></a><span class="lineno"> 6563</span> <span class="keywordflow">if</span> (!pickup_to_delivery_limit_function) {</div>
|
|
<div class="line"><a id="l06564" name="l06564"></a><span class="lineno"> 6564</span> <span class="comment">// No limit function set for this pair.</span></div>
|
|
<div class="line"><a id="l06565" name="l06565"></a><span class="lineno"> 6565</span> <span class="keywordflow">return</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>();</div>
|
|
<div class="line"><a id="l06566" name="l06566"></a><span class="lineno"> 6566</span> }</div>
|
|
<div class="line"><a id="l06567" name="l06567"></a><span class="lineno"> 6567</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(pickup, 0);</div>
|
|
<div class="line"><a id="l06568" name="l06568"></a><span class="lineno"> 6568</span> <a class="code hl_define" href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a>(delivery, 0);</div>
|
|
<div class="line"><a id="l06569" name="l06569"></a><span class="lineno"> 6569</span> <span class="keywordflow">return</span> pickup_to_delivery_limit_function(pickup, delivery);</div>
|
|
<div class="line"><a id="l06570" name="l06570"></a><span class="lineno"> 6570</span>}</div>
|
|
<div class="line"><a id="l06571" name="l06571"></a><span class="lineno"> 6571</span> </div>
|
|
<div class="line"><a id="l06572" name="l06572"></a><span class="lineno"> 6572</span><span class="keywordtype">void</span> RoutingDimension::SetupSlackAndDependentTransitCosts()<span class="keyword"> const </span>{</div>
|
|
<div class="line"><a id="l06573" name="l06573"></a><span class="lineno"> 6573</span> <span class="keywordflow">if</span> (model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>() == 0) <span class="keywordflow">return</span>;</div>
|
|
<div class="line"><a id="l06574" name="l06574"></a><span class="lineno"> 6574</span> <span class="comment">// Figure out whether all vehicles have the same span cost coefficient or not.</span></div>
|
|
<div class="line"><a id="l06575" name="l06575"></a><span class="lineno"> 6575</span> <span class="keywordtype">bool</span> all_vehicle_span_costs_are_equal = <span class="keyword">true</span>;</div>
|
|
<div class="line"><a id="l06576" name="l06576"></a><span class="lineno"> 6576</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i < model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++i) {</div>
|
|
<div class="line"><a id="l06577" name="l06577"></a><span class="lineno"> 6577</span> all_vehicle_span_costs_are_equal &= vehicle_span_cost_coefficients_[i] ==</div>
|
|
<div class="line"><a id="l06578" name="l06578"></a><span class="lineno"> 6578</span> vehicle_span_cost_coefficients_[0];</div>
|
|
<div class="line"><a id="l06579" name="l06579"></a><span class="lineno"> 6579</span> }</div>
|
|
<div class="line"><a id="l06580" name="l06580"></a><span class="lineno"> 6580</span> </div>
|
|
<div class="line"><a id="l06581" name="l06581"></a><span class="lineno"> 6581</span> <span class="keywordflow">if</span> (all_vehicle_span_costs_are_equal &&</div>
|
|
<div class="line"><a id="l06582" name="l06582"></a><span class="lineno"> 6582</span> vehicle_span_cost_coefficients_[0] == 0) {</div>
|
|
<div class="line"><a id="l06583" name="l06583"></a><span class="lineno"> 6583</span> <span class="keywordflow">return</span>; <span class="comment">// No vehicle span cost.</span></div>
|
|
<div class="line"><a id="l06584" name="l06584"></a><span class="lineno"> 6584</span> }</div>
|
|
<div class="line"><a id="l06585" name="l06585"></a><span class="lineno"> 6585</span> </div>
|
|
<div class="line"><a id="l06586" name="l06586"></a><span class="lineno"> 6586</span> <span class="comment">// Make sure that the vehicle's start cumul will be maximized in the end;</span></div>
|
|
<div class="line"><a id="l06587" name="l06587"></a><span class="lineno"> 6587</span> <span class="comment">// and that the vehicle's end cumul and the node's slacks will be minimized.</span></div>
|
|
<div class="line"><a id="l06588" name="l06588"></a><span class="lineno"> 6588</span> <span class="comment">// Note that we don't do that if there was no span cost (see the return</span></div>
|
|
<div class="line"><a id="l06589" name="l06589"></a><span class="lineno"> 6589</span> <span class="comment">// clause above), because in that case we want the dimension cumul to</span></div>
|
|
<div class="line"><a id="l06590" name="l06590"></a><span class="lineno"> 6590</span> <span class="comment">// remain unconstrained. Since transitions depend on base dimensions, we</span></div>
|
|
<div class="line"><a id="l06591" name="l06591"></a><span class="lineno"> 6591</span> <span class="comment">// have to make sure the slacks of base dimensions are taken care of.</span></div>
|
|
<div class="line"><a id="l06592" name="l06592"></a><span class="lineno"> 6592</span> <span class="comment">// Also, it makes more sense to make decisions from the root of the tree</span></div>
|
|
<div class="line"><a id="l06593" name="l06593"></a><span class="lineno"> 6593</span> <span class="comment">// towards to leaves, and hence the slacks are pushed in reverse order.</span></div>
|
|
<div class="line"><a id="l06594" name="l06594"></a><span class="lineno"> 6594</span> std::vector<const RoutingDimension*> dimensions_with_relevant_slacks = {<span class="keyword">this</span>};</div>
|
|
<div class="line"><a id="l06595" name="l06595"></a><span class="lineno"> 6595</span> <span class="keywordflow">while</span> (<span class="keyword">true</span>) {</div>
|
|
<div class="line"><a id="l06596" name="l06596"></a><span class="lineno"> 6596</span> <span class="keyword">const</span> RoutingDimension* <a class="code hl_variable" href="constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599">next</a> =</div>
|
|
<div class="line"><a id="l06597" name="l06597"></a><span class="lineno"> 6597</span> dimensions_with_relevant_slacks.back()->base_dimension_;</div>
|
|
<div class="line"><a id="l06598" name="l06598"></a><span class="lineno"> 6598</span> <span class="keywordflow">if</span> (<a class="code hl_variable" href="constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599">next</a> == <span class="keyword">nullptr</span> || <a class="code hl_variable" href="constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599">next</a> == dimensions_with_relevant_slacks.back()) {</div>
|
|
<div class="line"><a id="l06599" name="l06599"></a><span class="lineno"> 6599</span> <span class="keywordflow">break</span>;</div>
|
|
<div class="line"><a id="l06600" name="l06600"></a><span class="lineno"> 6600</span> }</div>
|
|
<div class="line"><a id="l06601" name="l06601"></a><span class="lineno"> 6601</span> dimensions_with_relevant_slacks.push_back(<a class="code hl_variable" href="constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599">next</a>);</div>
|
|
<div class="line"><a id="l06602" name="l06602"></a><span class="lineno"> 6602</span> }</div>
|
|
<div class="line"><a id="l06603" name="l06603"></a><span class="lineno"> 6603</span> </div>
|
|
<div class="line"><a id="l06604" name="l06604"></a><span class="lineno"> 6604</span> <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = dimensions_with_relevant_slacks.rbegin();</div>
|
|
<div class="line"><a id="l06605" name="l06605"></a><span class="lineno"> 6605</span> it != dimensions_with_relevant_slacks.rend(); ++it) {</div>
|
|
<div class="line"><a id="l06606" name="l06606"></a><span class="lineno"> 6606</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i < model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">vehicles</a>(); ++i) {</div>
|
|
<div class="line"><a id="l06607" name="l06607"></a><span class="lineno"> 6607</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8fc98154baec00fd3be88c9d6a0234dc">AddVariableTargetToFinalizer</a>((*it)->cumuls_[model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#afb80fd36c1fb57d2db049403483e2074">End</a>(i)],</div>
|
|
<div class="line"><a id="l06608" name="l06608"></a><span class="lineno"> 6608</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits<int64_t>::min</a>());</div>
|
|
<div class="line"><a id="l06609" name="l06609"></a><span class="lineno"> 6609</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8fc98154baec00fd3be88c9d6a0234dc">AddVariableTargetToFinalizer</a>((*it)->cumuls_[model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">Start</a>(i)],</div>
|
|
<div class="line"><a id="l06610" name="l06610"></a><span class="lineno"> 6610</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">std::numeric_limits<int64_t>::max</a>());</div>
|
|
<div class="line"><a id="l06611" name="l06611"></a><span class="lineno"> 6611</span> }</div>
|
|
<div class="line"><a id="l06612" name="l06612"></a><span class="lineno"> 6612</span> <span class="keywordflow">for</span> (IntVar* <span class="keyword">const</span> slack : (*it)->slacks_) {</div>
|
|
<div class="line"><a id="l06613" name="l06613"></a><span class="lineno"> 6613</span> model_-><a class="code hl_function" href="classoperations__research_1_1_routing_model.html#a8fc98154baec00fd3be88c9d6a0234dc">AddVariableTargetToFinalizer</a>(slack,</div>
|
|
<div class="line"><a id="l06614" name="l06614"></a><span class="lineno"> 6614</span> <a class="code hl_variable" href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">std::numeric_limits<int64_t>::min</a>());</div>
|
|
<div class="line"><a id="l06615" name="l06615"></a><span class="lineno"> 6615</span> }</div>
|
|
<div class="line"><a id="l06616" name="l06616"></a><span class="lineno"> 6616</span> }</div>
|
|
<div class="line"><a id="l06617" name="l06617"></a><span class="lineno"> 6617</span>}</div>
|
|
<div class="line"><a id="l06618" name="l06618"></a><span class="lineno"> 6618</span>} <span class="comment">// namespace operations_research</span></div>
|
|
<div class="ttc" id="aalldiff__cst_8cc_html_a26e6db9bcc64b584051ecc28171ed11f"><div class="ttname"><a href="alldiff__cst_8cc.html#a26e6db9bcc64b584051ecc28171ed11f">max</a></div><div class="ttdeci">int64_t max</div><div class="ttdef"><b>Definition:</b> <a href="alldiff__cst_8cc_source.html#l00140">alldiff_cst.cc:140</a></div></div>
|
|
<div class="ttc" id="aalldiff__cst_8cc_html_ad10edae0a852d72fb76afb1c77735045"><div class="ttname"><a href="alldiff__cst_8cc.html#ad10edae0a852d72fb76afb1c77735045">min</a></div><div class="ttdeci">int64_t min</div><div class="ttdef"><b>Definition:</b> <a href="alldiff__cst_8cc_source.html#l00139">alldiff_cst.cc:139</a></div></div>
|
|
<div class="ttc" id="aarc__flow__builder_8cc_html_a85d16954ed793ec11f3250a16cab2a36"><div class="ttname"><a href="arc__flow__builder_8cc.html#a85d16954ed793ec11f3250a16cab2a36">dimensions</a></div><div class="ttdeci">std::vector< int > dimensions</div><div class="ttdef"><b>Definition:</b> <a href="arc__flow__builder_8cc_source.html#l00048">arc_flow_builder.cc:48</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html"><div class="ttname"><a href="base_2logging_8h.html">logging.h</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_a3e1cfef60e774a81f30eaddf26a3a274"><div class="ttname"><a href="base_2logging_8h.html#a3e1cfef60e774a81f30eaddf26a3a274">CHECK</a></div><div class="ttdeci">#define CHECK(condition)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00491">base/logging.h:491</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_a4395e95bab44e222cb2e77251017a0e2"><div class="ttname"><a href="base_2logging_8h.html#a4395e95bab44e222cb2e77251017a0e2">DCHECK_LE</a></div><div class="ttdeci">#define DCHECK_LE(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00888">base/logging.h:888</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_a46e69120fbd3b36e6960e096d23b66f0"><div class="ttname"><a href="base_2logging_8h.html#a46e69120fbd3b36e6960e096d23b66f0">DCHECK_NE</a></div><div class="ttdeci">#define DCHECK_NE(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00887">base/logging.h:887</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_a4bd2e815ca2f702a4b6aa744b1ff3b82"><div class="ttname"><a href="base_2logging_8h.html#a4bd2e815ca2f702a4b6aa744b1ff3b82">CHECK_LT</a></div><div class="ttdeci">#define CHECK_LT(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00701">base/logging.h:701</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_a7c0ce053b28d53aa4eaf3eb7fb71663b"><div class="ttname"><a href="base_2logging_8h.html#a7c0ce053b28d53aa4eaf3eb7fb71663b">CHECK_EQ</a></div><div class="ttdeci">#define CHECK_EQ(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00698">base/logging.h:698</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_a7cc25402ecd7591b4c39934dd656b1f9"><div class="ttname"><a href="base_2logging_8h.html#a7cc25402ecd7591b4c39934dd656b1f9">CHECK_GE</a></div><div class="ttdeci">#define CHECK_GE(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00702">base/logging.h:702</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_aae2dc65d9ea248d54bf39daa986dd295"><div class="ttname"><a href="base_2logging_8h.html#aae2dc65d9ea248d54bf39daa986dd295">DCHECK_GE</a></div><div class="ttdeci">#define DCHECK_GE(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00890">base/logging.h:890</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_ab25e01a2942b821d66371fc68d53f2eb"><div class="ttname"><a href="base_2logging_8h.html#ab25e01a2942b821d66371fc68d53f2eb">CHECK_NE</a></div><div class="ttdeci">#define CHECK_NE(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00699">base/logging.h:699</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_ab4f56aa24c4c9cddc47a6abd2d747f9a"><div class="ttname"><a href="base_2logging_8h.html#ab4f56aa24c4c9cddc47a6abd2d747f9a">DCHECK_GT</a></div><div class="ttdeci">#define DCHECK_GT(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00891">base/logging.h:891</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_ab62f5ed8f2d48e29802be0cbbcd1359a"><div class="ttname"><a href="base_2logging_8h.html#ab62f5ed8f2d48e29802be0cbbcd1359a">DCHECK_LT</a></div><div class="ttdeci">#define DCHECK_LT(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00889">base/logging.h:889</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_accad43a85d781d53381cd53a9894b6ae"><div class="ttname"><a href="base_2logging_8h.html#accad43a85d781d53381cd53a9894b6ae">LOG</a></div><div class="ttdeci">#define LOG(severity)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00416">base/logging.h:416</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_ae17f8119c108cf3070bad3449c7e0006"><div class="ttname"><a href="base_2logging_8h.html#ae17f8119c108cf3070bad3449c7e0006">DCHECK</a></div><div class="ttdeci">#define DCHECK(condition)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00885">base/logging.h:885</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_ae4db23f10f5d4aad6d735f5a74cd6f8c"><div class="ttname"><a href="base_2logging_8h.html#ae4db23f10f5d4aad6d735f5a74cd6f8c">CHECK_LE</a></div><div class="ttdeci">#define CHECK_LE(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00700">base/logging.h:700</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_ae89df3243bbb8341130c7b3f44145ea0"><div class="ttname"><a href="base_2logging_8h.html#ae89df3243bbb8341130c7b3f44145ea0">DCHECK_EQ</a></div><div class="ttdeci">#define DCHECK_EQ(val1, val2)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00886">base/logging.h:886</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_aeef651f886eb5252c08835194213efe2"><div class="ttname"><a href="base_2logging_8h.html#aeef651f886eb5252c08835194213efe2">ABSL_DIE_IF_NULL</a></div><div class="ttdeci">#define ABSL_DIE_IF_NULL</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00041">base/logging.h:41</a></div></div>
|
|
<div class="ttc" id="abase_2logging_8h_html_afcaa7cadd41741bb855c2ada1d2ef927"><div class="ttname"><a href="base_2logging_8h.html#afcaa7cadd41741bb855c2ada1d2ef927">VLOG</a></div><div class="ttdeci">#define VLOG(verboselevel)</div><div class="ttdef"><b>Definition:</b> <a href="base_2logging_8h_source.html#l00979">base/logging.h:979</a></div></div>
|
|
<div class="ttc" id="abitset_8h_html"><div class="ttname"><a href="bitset_8h.html">bitset.h</a></div></div>
|
|
<div class="ttc" id="aclass_dense_connected_components_finder_html"><div class="ttname"><a href="class_dense_connected_components_finder.html">DenseConnectedComponentsFinder</a></div><div class="ttdef"><b>Definition:</b> <a href="connected__components_8h_source.html#l00081">connected_components.h:81</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_assignment_html"><div class="ttname"><a href="classoperations__research_1_1_assignment.html">operations_research::Assignment</a></div><div class="ttdoc">An Assignment is a variable -> domains mapping, used to report solutions to the user.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l05042">constraint_solver.h:5042</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_assignment_html_a60e7fa8388801a72e31391e8203a9464"><div class="ttname"><a href="classoperations__research_1_1_assignment.html#a60e7fa8388801a72e31391e8203a9464">operations_research::Assignment::Contains</a></div><div class="ttdeci">bool Contains(const IntVar *const var) const</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2assignment_8cc_source.html#l00992">constraint_solver/assignment.cc:992</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_assignment_html_a673faac1a261ca2414930dddbfaef92b"><div class="ttname"><a href="classoperations__research_1_1_assignment.html#a673faac1a261ca2414930dddbfaef92b">operations_research::Assignment::ObjectiveValue</a></div><div class="ttdeci">int64_t ObjectiveValue() const</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2assignment_8cc_source.html#l00899">constraint_solver/assignment.cc:899</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_assignment_html_a86601a2dad7a051d7b387ffa789898ff"><div class="ttname"><a href="classoperations__research_1_1_assignment.html#a86601a2dad7a051d7b387ffa789898ff">operations_research::Assignment::AddObjective</a></div><div class="ttdeci">void AddObjective(IntVar *const v)</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2assignment_8cc_source.html#l00877">constraint_solver/assignment.cc:877</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_assignment_html_a88515905299f569432aaba577a912add"><div class="ttname"><a href="classoperations__research_1_1_assignment.html#a88515905299f569432aaba577a912add">operations_research::Assignment::SetValue</a></div><div class="ttdeci">void SetValue(const IntVar *const var, int64_t value)</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2assignment_8cc_source.html#l00682">constraint_solver/assignment.cc:682</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_assignment_html_a8dbbd913afa005c99a0ec9cbfa665b46"><div class="ttname"><a href="classoperations__research_1_1_assignment.html#a8dbbd913afa005c99a0ec9cbfa665b46">operations_research::Assignment::Max</a></div><div class="ttdeci">int64_t Max(const IntVar *const var) const</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2assignment_8cc_source.html#l00658">constraint_solver/assignment.cc:658</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_assignment_html_a8e0cac088b44596d620963b8bc693770"><div class="ttname"><a href="classoperations__research_1_1_assignment.html#a8e0cac088b44596d620963b8bc693770">operations_research::Assignment::Value</a></div><div class="ttdeci">int64_t Value(const IntVar *const var) const</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2assignment_8cc_source.html#l00662">constraint_solver/assignment.cc:662</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_assignment_html_aad86dd69d5664ce8e16198be929fd941"><div class="ttname"><a href="classoperations__research_1_1_assignment.html#aad86dd69d5664ce8e16198be929fd941">operations_research::Assignment::CopyIntersection</a></div><div class="ttdeci">void CopyIntersection(const Assignment *assignment)</div><div class="ttdoc">Copies the intersection of the two assignments to the current assignment.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2assignment_8cc_source.html#l01004">constraint_solver/assignment.cc:1004</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_assignment_html_ac97eab84adb6cc33ae0124c944a4f8c7"><div class="ttname"><a href="classoperations__research_1_1_assignment.html#ac97eab84adb6cc33ae0124c944a4f8c7">operations_research::Assignment::Copy</a></div><div class="ttdeci">void Copy(const Assignment *assignment)</div><div class="ttdoc">Copies 'assignment' to the current assignment, clearing its previous content.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2assignment_8cc_source.html#l01013">constraint_solver/assignment.cc:1013</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_assignment_html_ae8ff1d18d50b93a2499ccd7130addecb"><div class="ttname"><a href="classoperations__research_1_1_assignment.html#ae8ff1d18d50b93a2499ccd7130addecb">operations_research::Assignment::Add</a></div><div class="ttdeci">IntVarElement * Add(IntVar *const var)</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2assignment_8cc_source.html#l00640">constraint_solver/assignment.cc:640</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_assignment_html_aecf5d63faebdaeda9dca52f916576459"><div class="ttname"><a href="classoperations__research_1_1_assignment.html#aecf5d63faebdaeda9dca52f916576459">operations_research::Assignment::Bound</a></div><div class="ttdeci">bool Bound(const IntVar *const var) const</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2assignment_8cc_source.html#l00666">constraint_solver/assignment.cc:666</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_assignment_html_af2c17e9e8d310419dade841aca1ab837"><div class="ttname"><a href="classoperations__research_1_1_assignment.html#af2c17e9e8d310419dade841aca1ab837">operations_research::Assignment::Min</a></div><div class="ttdeci">int64_t Min(const IntVar *const var) const</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2assignment_8cc_source.html#l00654">constraint_solver/assignment.cc:654</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_base_int_expr_html"><div class="ttname"><a href="classoperations__research_1_1_base_int_expr.html">operations_research::BaseIntExpr</a></div><div class="ttdef"><b>Definition:</b> <a href="constraint__solveri_8h_source.html#l00100">constraint_solveri.h:100</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_constraint_html"><div class="ttname"><a href="classoperations__research_1_1_constraint.html">operations_research::Constraint</a></div><div class="ttdoc">A constraint is the main modeling object.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03587">constraint_solver.h:3587</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_constraint_solver_parameters_html"><div class="ttname"><a href="classoperations__research_1_1_constraint_solver_parameters.html">operations_research::ConstraintSolverParameters</a></div><div class="ttdef"><b>Definition:</b> <a href="solver__parameters_8pb_8h_source.html#l00094">solver_parameters.pb.h:95</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_decision_builder_html"><div class="ttname"><a href="classoperations__research_1_1_decision_builder.html">operations_research::DecisionBuilder</a></div><div class="ttdoc">A DecisionBuilder is responsible for creating the search tree.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03270">constraint_solver.h:3270</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_demon_html"><div class="ttname"><a href="classoperations__research_1_1_demon.html">operations_research::Demon</a></div><div class="ttdoc">A Demon is the base element of a propagation queue.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03303">constraint_solver.h:3303</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_demon_html_a0c1ff1e86b1eb08d0f87eab2943dac2a"><div class="ttname"><a href="classoperations__research_1_1_demon.html#a0c1ff1e86b1eb08d0f87eab2943dac2a">operations_research::Demon::inhibit</a></div><div class="ttdeci">void inhibit(Solver *const s)</div><div class="ttdoc">This method inhibits the demon in the search tree below the current position.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8cc_source.html#l00202">constraint_solver.cc:202</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_domain_html"><div class="ttname"><a href="classoperations__research_1_1_domain.html">operations_research::Domain</a></div><div class="ttdoc">We call domain any subset of Int64 = [kint64min, kint64max].</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8h_source.html#l00081">sorted_interval_list.h:81</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_ebert_graph_base_html_a7b505ba4a01bce342d049f5a8674da72"><div class="ttname"><a href="classoperations__research_1_1_ebert_graph_base.html#a7b505ba4a01bce342d049f5a8674da72">operations_research::EbertGraphBase::AddArc</a></div><div class="ttdeci">ArcIndexType AddArc(NodeIndexType tail, NodeIndexType head)</div><div class="ttdef"><b>Definition:</b> <a href="ebert__graph_8h_source.html#l01002">ebert_graph.h:1002</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_first_solution_strategy_html_a11b9a9b7d0fdd3c25f85386594d92131"><div class="ttname"><a href="classoperations__research_1_1_first_solution_strategy.html#a11b9a9b7d0fdd3c25f85386594d92131">operations_research::FirstSolutionStrategy::GLOBAL_CHEAPEST_ARC</a></div><div class="ttdeci">static constexpr Value GLOBAL_CHEAPEST_ARC</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00271">routing_enums.pb.h:271</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_first_solution_strategy_html_a19fd09a7629e12dc005225f4ff7d9c35"><div class="ttname"><a href="classoperations__research_1_1_first_solution_strategy.html#a19fd09a7629e12dc005225f4ff7d9c35">operations_research::FirstSolutionStrategy::BEST_INSERTION</a></div><div class="ttdeci">static constexpr Value BEST_INSERTION</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00263">routing_enums.pb.h:263</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_first_solution_strategy_html_a31bc681b1d8ba03d79e0f08fd310e943"><div class="ttname"><a href="classoperations__research_1_1_first_solution_strategy.html#a31bc681b1d8ba03d79e0f08fd310e943">operations_research::FirstSolutionStrategy::Value</a></div><div class="ttdeci">FirstSolutionStrategy_Value Value</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00244">routing_enums.pb.h:244</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_first_solution_strategy_html_a3fe8067f96051727ad3cdb085328f4e6"><div class="ttname"><a href="classoperations__research_1_1_first_solution_strategy.html#a3fe8067f96051727ad3cdb085328f4e6">operations_research::FirstSolutionStrategy::SAVINGS</a></div><div class="ttdeci">static constexpr Value SAVINGS</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00255">routing_enums.pb.h:255</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_first_solution_strategy_html_a48a447de5f3e3a57cd6e0266a8b53825"><div class="ttname"><a href="classoperations__research_1_1_first_solution_strategy.html#a48a447de5f3e3a57cd6e0266a8b53825">operations_research::FirstSolutionStrategy::LOCAL_CHEAPEST_ARC</a></div><div class="ttdeci">static constexpr Value LOCAL_CHEAPEST_ARC</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00273">routing_enums.pb.h:273</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_first_solution_strategy_html_a4aa7531a8f305562e8db414b076c2547"><div class="ttname"><a href="classoperations__research_1_1_first_solution_strategy.html#a4aa7531a8f305562e8db414b076c2547">operations_research::FirstSolutionStrategy::FIRST_UNBOUND_MIN_VALUE</a></div><div class="ttdeci">static constexpr Value FIRST_UNBOUND_MIN_VALUE</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00275">routing_enums.pb.h:275</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_first_solution_strategy_html_a5af655ec3247fcc1346b07db492918b0"><div class="ttname"><a href="classoperations__research_1_1_first_solution_strategy.html#a5af655ec3247fcc1346b07db492918b0">operations_research::FirstSolutionStrategy::ALL_UNPERFORMED</a></div><div class="ttdeci">static constexpr Value ALL_UNPERFORMED</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00261">routing_enums.pb.h:261</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_first_solution_strategy_html_a8530d171da599ab97b7c85a9e07ca7fb"><div class="ttname"><a href="classoperations__research_1_1_first_solution_strategy.html#a8530d171da599ab97b7c85a9e07ca7fb">operations_research::FirstSolutionStrategy::LOCAL_CHEAPEST_INSERTION</a></div><div class="ttdeci">static constexpr Value LOCAL_CHEAPEST_INSERTION</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00269">routing_enums.pb.h:269</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_first_solution_strategy_html_a9af610cf53b13943acd6c4cb7be7c43c"><div class="ttname"><a href="classoperations__research_1_1_first_solution_strategy.html#a9af610cf53b13943acd6c4cb7be7c43c">operations_research::FirstSolutionStrategy::AUTOMATIC</a></div><div class="ttdeci">static constexpr Value AUTOMATIC</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00247">routing_enums.pb.h:247</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_first_solution_strategy_html_aa3f1b8abbac547f481f99a26c0e223b7"><div class="ttname"><a href="classoperations__research_1_1_first_solution_strategy.html#aa3f1b8abbac547f481f99a26c0e223b7">operations_research::FirstSolutionStrategy::PATH_MOST_CONSTRAINED_ARC</a></div><div class="ttdeci">static constexpr Value PATH_MOST_CONSTRAINED_ARC</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00251">routing_enums.pb.h:251</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_first_solution_strategy_html_ab0844c2ed1a1fa91a23f06ec2b96eaf4"><div class="ttname"><a href="classoperations__research_1_1_first_solution_strategy.html#ab0844c2ed1a1fa91a23f06ec2b96eaf4">operations_research::FirstSolutionStrategy::UNSET</a></div><div class="ttdeci">static constexpr Value UNSET</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00245">routing_enums.pb.h:245</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_first_solution_strategy_html_ab295f9b95b94beadfd87c99e057ec703"><div class="ttname"><a href="classoperations__research_1_1_first_solution_strategy.html#ab295f9b95b94beadfd87c99e057ec703">operations_research::FirstSolutionStrategy::CHRISTOFIDES</a></div><div class="ttdeci">static constexpr Value CHRISTOFIDES</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00259">routing_enums.pb.h:259</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_first_solution_strategy_html_aca22eabfd47888ab251053351b3b20d5"><div class="ttname"><a href="classoperations__research_1_1_first_solution_strategy.html#aca22eabfd47888ab251053351b3b20d5">operations_research::FirstSolutionStrategy::SWEEP</a></div><div class="ttdeci">static constexpr Value SWEEP</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00257">routing_enums.pb.h:257</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_first_solution_strategy_html_ad881a20d00240fb652ccb3b0c8d4cfa9"><div class="ttname"><a href="classoperations__research_1_1_first_solution_strategy.html#ad881a20d00240fb652ccb3b0c8d4cfa9">operations_research::FirstSolutionStrategy::PARALLEL_CHEAPEST_INSERTION</a></div><div class="ttdeci">static constexpr Value PARALLEL_CHEAPEST_INSERTION</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00265">routing_enums.pb.h:265</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_first_solution_strategy_html_adc4a0aa5c9965a51b9e07be9c1e328a1"><div class="ttname"><a href="classoperations__research_1_1_first_solution_strategy.html#adc4a0aa5c9965a51b9e07be9c1e328a1">operations_research::FirstSolutionStrategy::Value_Name</a></div><div class="ttdeci">static const std::string & Value_Name(T enum_t_value)</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00291">routing_enums.pb.h:291</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_first_solution_strategy_html_aee8aae82281ff07467b56312b49edcd4"><div class="ttname"><a href="classoperations__research_1_1_first_solution_strategy.html#aee8aae82281ff07467b56312b49edcd4">operations_research::FirstSolutionStrategy::EVALUATOR_STRATEGY</a></div><div class="ttdeci">static constexpr Value EVALUATOR_STRATEGY</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00253">routing_enums.pb.h:253</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_first_solution_strategy_html_af8b7465c1391f91692bed327d5d4fa66"><div class="ttname"><a href="classoperations__research_1_1_first_solution_strategy.html#af8b7465c1391f91692bed327d5d4fa66">operations_research::FirstSolutionStrategy::SEQUENTIAL_CHEAPEST_INSERTION</a></div><div class="ttdeci">static constexpr Value SEQUENTIAL_CHEAPEST_INSERTION</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00267">routing_enums.pb.h:267</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_first_solution_strategy_html_af9514bec629ba99306ed93ab08252708"><div class="ttname"><a href="classoperations__research_1_1_first_solution_strategy.html#af9514bec629ba99306ed93ab08252708">operations_research::FirstSolutionStrategy::PATH_CHEAPEST_ARC</a></div><div class="ttdeci">static constexpr Value PATH_CHEAPEST_ARC</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00249">routing_enums.pb.h:249</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_forward_ebert_graph_html"><div class="ttname"><a href="classoperations__research_1_1_forward_ebert_graph.html">operations_research::ForwardEbertGraph</a></div><div class="ttdef"><b>Definition:</b> <a href="ebert__graph_8h_source.html#l01563">ebert_graph.h:1565</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_global_dimension_cumul_optimizer_html"><div class="ttname"><a href="classoperations__research_1_1_global_dimension_cumul_optimizer.html">operations_research::GlobalDimensionCumulOptimizer</a></div><div class="ttdef"><b>Definition:</b> <a href="routing__lp__scheduling_8h_source.html#l00750">routing_lp_scheduling.h:750</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_init_and_get_values_html"><div class="ttname"><a href="classoperations__research_1_1_init_and_get_values.html">operations_research::InitAndGetValues</a></div><div class="ttdoc">Utility class to encapsulate an IntVarIterator and use it in a range-based loop.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03944">constraint_solver.h:3944</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_int_expr_html"><div class="ttname"><a href="classoperations__research_1_1_int_expr.html">operations_research::IntExpr</a></div><div class="ttdoc">The class IntExpr is the base of all integer expressions in constraint programming.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03839">constraint_solver.h:3839</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_int_expr_html_a1d04569b37cb7fe6ed0956ab71e08bc9"><div class="ttname"><a href="classoperations__research_1_1_int_expr.html#a1d04569b37cb7fe6ed0956ab71e08bc9">operations_research::IntExpr::Bound</a></div><div class="ttdeci">virtual bool Bound() const</div><div class="ttdoc">Returns true if the min and the max of the expression are equal.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03865">constraint_solver.h:3865</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_int_expr_html_a62b340f6d1dde6a36560bd88a382ada7"><div class="ttname"><a href="classoperations__research_1_1_int_expr.html#a62b340f6d1dde6a36560bd88a382ada7">operations_research::IntExpr::Min</a></div><div class="ttdeci">virtual int64_t Min() const =0</div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_int_expr_html_a8a1d9ddd5f5fc8f2a02b8a8700d3e3b1"><div class="ttname"><a href="classoperations__research_1_1_int_expr.html#a8a1d9ddd5f5fc8f2a02b8a8700d3e3b1">operations_research::IntExpr::Var</a></div><div class="ttdeci">virtual IntVar * Var()=0</div><div class="ttdoc">Creates a variable from the expression.</div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_int_expr_html_ac84c250d67f30c89e845cd460eeaaad8"><div class="ttname"><a href="classoperations__research_1_1_int_expr.html#ac84c250d67f30c89e845cd460eeaaad8">operations_research::IntExpr::Max</a></div><div class="ttdeci">virtual int64_t Max() const =0</div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_int_var_filtered_decision_builder_html"><div class="ttname"><a href="classoperations__research_1_1_int_var_filtered_decision_builder.html">operations_research::IntVarFilteredDecisionBuilder</a></div><div class="ttdoc">Decision builder building a solution using heuristics with local search filters to evaluate its feasi...</div><div class="ttdef"><b>Definition:</b> <a href="routing__search_8h_source.html#l00136">routing_search.h:136</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_int_var_filtered_decision_builder_html_aac2118d22c4275990bdd1fec28a2a8d3"><div class="ttname"><a href="classoperations__research_1_1_int_var_filtered_decision_builder.html#aac2118d22c4275990bdd1fec28a2a8d3">operations_research::IntVarFilteredDecisionBuilder::number_of_decisions</a></div><div class="ttdeci">int64_t number_of_decisions() const</div><div class="ttdoc">Returns statistics from its underlying heuristic.</div><div class="ttdef"><b>Definition:</b> <a href="routing__search_8cc_source.html#l00201">routing_search.cc:201</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_int_var_filtered_decision_builder_html_afd4b70bcd23086d4968db3a1d822ee2c"><div class="ttname"><a href="classoperations__research_1_1_int_var_filtered_decision_builder.html#afd4b70bcd23086d4968db3a1d822ee2c">operations_research::IntVarFilteredDecisionBuilder::number_of_rejects</a></div><div class="ttdeci">int64_t number_of_rejects() const</div><div class="ttdef"><b>Definition:</b> <a href="routing__search_8cc_source.html#l00205">routing_search.cc:205</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_int_var_html"><div class="ttname"><a href="classoperations__research_1_1_int_var.html">operations_research::IntVar</a></div><div class="ttdoc">The class IntVar is a subset of IntExpr.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l04001">constraint_solver.h:4001</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_int_var_html_a0723abf37f7a5a8a604fd1bcd96a7be0"><div class="ttname"><a href="classoperations__research_1_1_int_var.html#a0723abf37f7a5a8a604fd1bcd96a7be0">operations_research::IntVar::Contains</a></div><div class="ttdeci">virtual bool Contains(int64_t v) const =0</div><div class="ttdoc">This method returns whether the value 'v' is in the domain of the variable.</div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_int_var_html_a6e33a313eaf507bae0eb7068455a5bdc"><div class="ttname"><a href="classoperations__research_1_1_int_var.html#a6e33a313eaf507bae0eb7068455a5bdc">operations_research::IntVar::WhenBound</a></div><div class="ttdeci">virtual void WhenBound(Demon *d)=0</div><div class="ttdoc">This method attaches a demon that will be awakened when the variable is bound.</div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_int_var_html_acc2ece7bb8bf97bb35cdf9650fe6c55b"><div class="ttname"><a href="classoperations__research_1_1_int_var.html#acc2ece7bb8bf97bb35cdf9650fe6c55b">operations_research::IntVar::Value</a></div><div class="ttdeci">virtual int64_t Value() const =0</div><div class="ttdoc">This method returns the value of the variable.</div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_int_var_html_af8625719d57e4a61b5aa251d99762966"><div class="ttname"><a href="classoperations__research_1_1_int_var.html#af8625719d57e4a61b5aa251d99762966">operations_research::IntVar::Size</a></div><div class="ttdeci">virtual uint64_t Size() const =0</div><div class="ttdoc">This method returns the number of values in the domain of the variable.</div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_interval_var_html"><div class="ttname"><a href="classoperations__research_1_1_interval_var.html">operations_research::IntervalVar</a></div><div class="ttdoc">Interval variables are often used in scheduling.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l04398">constraint_solver.h:4398</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_linear_sum_assignment_html"><div class="ttname"><a href="classoperations__research_1_1_linear_sum_assignment.html">operations_research::LinearSumAssignment</a></div><div class="ttdef"><b>Definition:</b> <a href="linear__assignment_8h_source.html#l00227">linear_assignment.h:227</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_linear_sum_assignment_html_a5afb9dde1c31f5f053cc83bf6e594db0"><div class="ttname"><a href="classoperations__research_1_1_linear_sum_assignment.html#a5afb9dde1c31f5f053cc83bf6e594db0">operations_research::LinearSumAssignment::GetCost</a></div><div class="ttdeci">CostValue GetCost() const</div><div class="ttdef"><b>Definition:</b> <a href="linear__assignment_8h_source.html#l01474">linear_assignment.h:1474</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_linear_sum_assignment_html_a63b3d12e721188086870cc42cc46a258"><div class="ttname"><a href="classoperations__research_1_1_linear_sum_assignment.html#a63b3d12e721188086870cc42cc46a258">operations_research::LinearSumAssignment::ComputeAssignment</a></div><div class="ttdeci">bool ComputeAssignment()</div><div class="ttdef"><b>Definition:</b> <a href="linear__assignment_8h_source.html#l01449">linear_assignment.h:1449</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_linear_sum_assignment_html_a77a0519df5fb71834593bb661b72921c"><div class="ttname"><a href="classoperations__research_1_1_linear_sum_assignment.html#a77a0519df5fb71834593bb661b72921c">operations_research::LinearSumAssignment::SetArcCost</a></div><div class="ttdeci">void SetArcCost(ArcIndex arc, CostValue cost)</div><div class="ttdef"><b>Definition:</b> <a href="linear__assignment_8h_source.html#l01010">linear_assignment.h:1010</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_local_dimension_cumul_optimizer_html"><div class="ttname"><a href="classoperations__research_1_1_local_dimension_cumul_optimizer.html">operations_research::LocalDimensionCumulOptimizer</a></div><div class="ttdef"><b>Definition:</b> <a href="routing__lp__scheduling_8h_source.html#l00704">routing_lp_scheduling.h:704</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_local_search_metaheuristic_html_a04f2564a49d86fca19f1f00379927756"><div class="ttname"><a href="classoperations__research_1_1_local_search_metaheuristic.html#a04f2564a49d86fca19f1f00379927756">operations_research::LocalSearchMetaheuristic::SIMULATED_ANNEALING</a></div><div class="ttdeci">static constexpr Value SIMULATED_ANNEALING</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00426">routing_enums.pb.h:426</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_local_search_metaheuristic_html_a39bb4fe872d4536162c79c5b85d647f6"><div class="ttname"><a href="classoperations__research_1_1_local_search_metaheuristic.html#a39bb4fe872d4536162c79c5b85d647f6">operations_research::LocalSearchMetaheuristic::TABU_SEARCH</a></div><div class="ttdeci">static constexpr Value TABU_SEARCH</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00428">routing_enums.pb.h:428</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_local_search_metaheuristic_html_a3efed50baf4fb5d0fd2434c3c7f0b586"><div class="ttname"><a href="classoperations__research_1_1_local_search_metaheuristic.html#a3efed50baf4fb5d0fd2434c3c7f0b586">operations_research::LocalSearchMetaheuristic::GUIDED_LOCAL_SEARCH</a></div><div class="ttdeci">static constexpr Value GUIDED_LOCAL_SEARCH</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00424">routing_enums.pb.h:424</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_local_search_metaheuristic_html_a689551414de01c3e0b5483bafc4f8877"><div class="ttname"><a href="classoperations__research_1_1_local_search_metaheuristic.html#a689551414de01c3e0b5483bafc4f8877">operations_research::LocalSearchMetaheuristic::GENERIC_TABU_SEARCH</a></div><div class="ttdeci">static constexpr Value GENERIC_TABU_SEARCH</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00430">routing_enums.pb.h:430</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_local_search_metaheuristic_html_aa04540e46b556c56082408cda31fd514"><div class="ttname"><a href="classoperations__research_1_1_local_search_metaheuristic.html#aa04540e46b556c56082408cda31fd514">operations_research::LocalSearchMetaheuristic::Value</a></div><div class="ttdeci">LocalSearchMetaheuristic_Value Value</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00417">routing_enums.pb.h:417</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_local_search_metaheuristic_html_adc4a0aa5c9965a51b9e07be9c1e328a1"><div class="ttname"><a href="classoperations__research_1_1_local_search_metaheuristic.html#adc4a0aa5c9965a51b9e07be9c1e328a1">operations_research::LocalSearchMetaheuristic::Value_Name</a></div><div class="ttdeci">static const std::string & Value_Name(T enum_t_value)</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00446">routing_enums.pb.h:446</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_local_search_operator_html"><div class="ttname"><a href="classoperations__research_1_1_local_search_operator.html">operations_research::LocalSearchOperator</a></div><div class="ttdoc">The base class for all local search operators.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solveri_8h_source.html#l00791">constraint_solveri.h:791</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_math_util_html_a55fc8a3af7c2526c83e83586cd578d89"><div class="ttname"><a href="classoperations__research_1_1_math_util.html#a55fc8a3af7c2526c83e83586cd578d89">operations_research::MathUtil::FastInt64Round</a></div><div class="ttdeci">static int64_t FastInt64Round(double x)</div><div class="ttdef"><b>Definition:</b> <a href="mathutil_8h_source.html#l00138">mathutil.h:138</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_model_visitor_html"><div class="ttname"><a href="classoperations__research_1_1_model_visitor.html">operations_research::ModelVisitor</a></div><div class="ttdoc">Model visitor.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03336">constraint_solver.h:3336</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_model_visitor_html_a18ba1952015fae2770ace40c811c2efb"><div class="ttname"><a href="classoperations__research_1_1_model_visitor.html#a18ba1952015fae2770ace40c811c2efb">operations_research::ModelVisitor::kIndex2Argument</a></div><div class="ttdeci">static const char kIndex2Argument[]</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03458">constraint_solver.h:3458</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_model_visitor_html_a1a1c411b20f73c324361e8eff94f12bd"><div class="ttname"><a href="classoperations__research_1_1_model_visitor.html#a1a1c411b20f73c324361e8eff94f12bd">operations_research::ModelVisitor::kMinArgument</a></div><div class="ttdeci">static const char kMinArgument[]</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03468">constraint_solver.h:3468</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_model_visitor_html_a489f38dd601db8d045efae4d9ae7d754"><div class="ttname"><a href="classoperations__research_1_1_model_visitor.html#a489f38dd601db8d045efae4d9ae7d754">operations_research::ModelVisitor::kTargetArgument</a></div><div class="ttdeci">static const char kTargetArgument[]</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03489">constraint_solver.h:3489</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_model_visitor_html_a5f9d5cd2badcf4361bfebd07c9cb63d8"><div class="ttname"><a href="classoperations__research_1_1_model_visitor.html#a5f9d5cd2badcf4361bfebd07c9cb63d8">operations_research::ModelVisitor::kMaxArgument</a></div><div class="ttdeci">static const char kMaxArgument[]</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03466">constraint_solver.h:3466</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_model_visitor_html_a764c2bb6842cf7a1a5aedac877295b46"><div class="ttname"><a href="classoperations__research_1_1_model_visitor.html#a764c2bb6842cf7a1a5aedac877295b46">operations_research::ModelVisitor::kLessOrEqual</a></div><div class="ttdeci">static const char kLessOrEqual[]</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03381">constraint_solver.h:3381</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_model_visitor_html_a8e24c7d309e4aaa23eca1c75bd42bdc5"><div class="ttname"><a href="classoperations__research_1_1_model_visitor.html#a8e24c7d309e4aaa23eca1c75bd42bdc5">operations_research::ModelVisitor::kLeftArgument</a></div><div class="ttdeci">static const char kLeftArgument[]</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03465">constraint_solver.h:3465</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_model_visitor_html_aa9175e7f7c9d2598d26293435ecd89ce"><div class="ttname"><a href="classoperations__research_1_1_model_visitor.html#aa9175e7f7c9d2598d26293435ecd89ce">operations_research::ModelVisitor::kVarsArgument</a></div><div class="ttdeci">static const char kVarsArgument[]</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03496">constraint_solver.h:3496</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_model_visitor_html_aaeff643bea5491c9055dc67124d5d3d2"><div class="ttname"><a href="classoperations__research_1_1_model_visitor.html#aaeff643bea5491c9055dc67124d5d3d2">operations_research::ModelVisitor::kRightArgument</a></div><div class="ttdeci">static const char kRightArgument[]</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03477">constraint_solver.h:3477</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_model_visitor_html_adc9534f3f00f5aa6046609988d38967b"><div class="ttname"><a href="classoperations__research_1_1_model_visitor.html#adc9534f3f00f5aa6046609988d38967b">operations_research::ModelVisitor::kValuesArgument</a></div><div class="ttdeci">static const char kValuesArgument[]</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03494">constraint_solver.h:3494</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_model_visitor_html_af490af7f25d4b57c9b088a61001f6a1e"><div class="ttname"><a href="classoperations__research_1_1_model_visitor.html#af490af7f25d4b57c9b088a61001f6a1e">operations_research::ModelVisitor::kIndexArgument</a></div><div class="ttdeci">static const char kIndexArgument[]</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03459">constraint_solver.h:3459</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_piecewise_linear_function_html"><div class="ttname"><a href="classoperations__research_1_1_piecewise_linear_function.html">operations_research::PiecewiseLinearFunction</a></div><div class="ttdef"><b>Definition:</b> <a href="piecewise__linear__function_8h_source.html#l00101">piecewise_linear_function.h:101</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_propagation_base_object_html_a0b526d33739114e9255ffbe8343efe1a"><div class="ttname"><a href="classoperations__research_1_1_propagation_base_object.html#a0b526d33739114e9255ffbe8343efe1a">operations_research::PropagationBaseObject::solver</a></div><div class="ttdeci">Solver * solver() const</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03181">constraint_solver.h:3181</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_propagation_base_object_html_a173cbf153462b14f9b57362d2c45638a"><div class="ttname"><a href="classoperations__research_1_1_propagation_base_object.html#a173cbf153462b14f9b57362d2c45638a">operations_research::PropagationBaseObject::EnqueueDelayedDemon</a></div><div class="ttdeci">void EnqueueDelayedDemon(Demon *const d)</div><div class="ttdoc">This method pushes the demon onto the propagation queue.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03194">constraint_solver.h:3194</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_range_int_to_int_function_html"><div class="ttname"><a href="classoperations__research_1_1_range_int_to_int_function.html">operations_research::RangeIntToIntFunction</a></div><div class="ttdef"><b>Definition:</b> <a href="range__query__function_8h_source.html#l00028">range_query_function.h:28</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_regular_limit_html"><div class="ttname"><a href="classoperations__research_1_1_regular_limit.html">operations_research::RegularLimit</a></div><div class="ttdoc">Usual limit based on wall_time, number of explored branches and number of failures in the search tree...</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l04285">constraint_solver.h:4285</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_regular_limit_html_a31c8a0b81a7b1d7ebccff84666901671"><div class="ttname"><a href="classoperations__research_1_1_regular_limit.html#a31c8a0b81a7b1d7ebccff84666901671">operations_research::RegularLimit::UpdateLimits</a></div><div class="ttdeci">void UpdateLimits(absl::Duration time, int64_t branches, int64_t failures, int64_t solutions)</div><div class="ttdef"><b>Definition:</b> <a href="search_8cc_source.html#l04063">search.cc:4063</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html">operations_research::RoutingDimension</a></div><div class="ttdoc">Dimensions represent quantities accumulated at nodes along the routes.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02494">routing.h:2494</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a149832f24795a7b2c0b61da79d9ec3ba"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a149832f24795a7b2c0b61da79d9ec3ba">operations_research::RoutingDimension::SetSpanCostCoefficientForAllVehicles</a></div><div class="ttdeci">void SetSpanCostCoefficientForAllVehicles(int64_t coefficient)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06192">routing.cc:6192</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a170770b614a847e56afe80355b53a363"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a170770b614a847e56afe80355b53a363">operations_research::RoutingDimension::SetCumulVarPiecewiseLinearCost</a></div><div class="ttdeci">void SetCumulVarPiecewiseLinearCost(int64_t index, const PiecewiseLinearFunction &cost)</div><div class="ttdoc">Sets a piecewise linear cost on the cumul variable of a given variable index.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06203">routing.cc:6203</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a24dcbf29c0d6cd766009a182a6484e3b"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a24dcbf29c0d6cd766009a182a6484e3b">operations_research::RoutingDimension::name</a></div><div class="ttdeci">const std::string & name() const</div><div class="ttdoc">Returns the name of the dimension.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02758">routing.h:2758</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a2658bab0f635e3b399b100ecd6bc12cb"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a2658bab0f635e3b399b100ecd6bc12cb">operations_research::RoutingDimension::cumuls</a></div><div class="ttdeci">const std::vector< IntVar * > & cumuls() const</div><div class="ttdoc">Like CumulVar(), TransitVar(), SlackVar() but return the whole variable vectors instead (indexed by i...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02523">routing.h:2523</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a2f01e7a89b0da7143b9ece70c88fd640"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a2f01e7a89b0da7143b9ece70c88fd640">operations_research::RoutingDimension::vehicle_capacities</a></div><div class="ttdeci">const std::vector< int64_t > & vehicle_capacities() const</div><div class="ttdoc">Returns the capacities for all vehicles.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02572">routing.h:2572</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a320c6e0379386d701cc6b84a25c7f020"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a320c6e0379386d701cc6b84a25c7f020">operations_research::RoutingDimension::HasCumulVarPiecewiseLinearCost</a></div><div class="ttdeci">bool HasCumulVarPiecewiseLinearCost(int64_t index) const</div><div class="ttdoc">Returns true if a piecewise linear cost has been set for a given variable index.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06222">routing.cc:6222</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a32c310c90b2870f76dfe58ef41127d83"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a32c310c90b2870f76dfe58ef41127d83">operations_research::RoutingDimension::GetCumulVarSoftUpperBoundCoefficient</a></div><div class="ttdeci">int64_t GetCumulVarSoftUpperBoundCoefficient(int64_t index) const</div><div class="ttdoc">Returns the cost coefficient of the soft upper bound of a cumul variable for a given variable index.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06292">routing.cc:6292</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a36f4aa60ff1b8c1dd5fc1180199cad8d"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a36f4aa60ff1b8c1dd5fc1180199cad8d">operations_research::RoutingDimension::HasPickupToDeliveryLimits</a></div><div class="ttdeci">bool HasPickupToDeliveryLimits() const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06549">routing.cc:6549</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a3a71e48b4ed287752b9d9d9f7086ec7d"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a3a71e48b4ed287752b9d9d9f7086ec7d">operations_research::RoutingDimension::CumulVar</a></div><div class="ttdeci">IntVar * CumulVar(int64_t index) const</div><div class="ttdoc">Get the cumul, transit and slack variables for the given node (given as int64_t var index).</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02513">routing.h:2513</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a3efd441f3accdd91d91ffbd1d4e1b255"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a3efd441f3accdd91d91ffbd1d4e1b255">operations_research::RoutingDimension::GetPickupToDeliveryLimitForPair</a></div><div class="ttdeci">int64_t GetPickupToDeliveryLimitForPair(int pair_index, int pickup, int delivery) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06553">routing.cc:6553</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a3ffb5532e1a2da908b35ce947f30a0a3"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a3ffb5532e1a2da908b35ce947f30a0a3">operations_research::RoutingDimension::HasCumulVarSoftLowerBound</a></div><div class="ttdeci">bool HasCumulVarSoftLowerBound(int64_t index) const</div><div class="ttdoc">Returns true if a soft lower bound has been set for a given variable index.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06331">routing.cc:6331</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a53a1734d4818932a457346136f5f2bdc"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a53a1734d4818932a457346136f5f2bdc">operations_research::RoutingDimension::SetBreakDistanceDurationOfVehicle</a></div><div class="ttdeci">void SetBreakDistanceDurationOfVehicle(int64_t distance, int64_t duration, int vehicle)</div><div class="ttdoc">With breaks supposed to be consecutive, this forces the distance between breaks of size at least mini...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06517">routing.cc:6517</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a5c170c586b06b6435f4e85cfc9db27e5"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a5c170c586b06b6435f4e85cfc9db27e5">operations_research::RoutingDimension::transit_evaluator</a></div><div class="ttdeci">const RoutingModel::TransitCallback2 & transit_evaluator(int vehicle) const</div><div class="ttdoc">Returns the callback evaluating the transit value between two node indices for a given vehicle.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02577">routing.h:2577</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a62099b067d4f0d26e41a020c2fca1731"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a62099b067d4f0d26e41a020c2fca1731">operations_research::RoutingDimension::vehicle_span_cost_coefficients</a></div><div class="ttdeci">const std::vector< int64_t > & vehicle_span_cost_coefficients() const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02825">routing.h:2825</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a6debc638c02bfb2b4afe0afccdd98ca5"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a6debc638c02bfb2b4afe0afccdd98ca5">operations_research::RoutingDimension::HasBreakConstraints</a></div><div class="ttdeci">bool HasBreakConstraints() const</div><div class="ttdoc">Returns true if any break interval or break distance was defined.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06494">routing.cc:6494</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a70dcc75273b8ffe7bf1df455e227d939"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a70dcc75273b8ffe7bf1df455e227d939">operations_research::RoutingDimension::GetAllowedIntervalsInRange</a></div><div class="ttdeci">SortedDisjointIntervalList GetAllowedIntervalsInRange(int64_t index, int64_t min_value, int64_t max_value) const</div><div class="ttdoc">Returns allowed intervals for a given node in a given interval.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06153">routing.cc:6153</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a76645042dd00fd9a97a9c4a395927947"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a76645042dd00fd9a97a9c4a395927947">operations_research::RoutingDimension::InitializeBreaks</a></div><div class="ttdeci">void InitializeBreaks()</div><div class="ttdoc">Sets up vehicle_break_intervals_, vehicle_break_distance_duration_, pre_travel_evaluators and post_tr...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06484">routing.cc:6484</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a7d1899ebcd524b8902d6777a1644fdc9"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a7d1899ebcd524b8902d6777a1644fdc9">operations_research::RoutingDimension::PickupToDeliveryLimitFunction</a></div><div class="ttdeci">std::function< int64_t(int, int)> PickupToDeliveryLimitFunction</div><div class="ttdoc">Limits, in terms of maximum difference between the cumul variables, between the pickup and delivery a...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02776">routing.h:2776</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a8e93e99ce491f2779c0d2e5e7de5a98a"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a8e93e99ce491f2779c0d2e5e7de5a98a">operations_research::RoutingDimension::GetPreTravelEvaluatorOfVehicle</a></div><div class="ttdeci">int GetPreTravelEvaluatorOfVehicle(int vehicle) const</div><div class="ttdoc">!defined(SWIGPYTHON)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06505">routing.cc:6505</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a8eafd6802aace5a8b509d920de5e37c5"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a8eafd6802aace5a8b509d920de5e37c5">operations_research::RoutingDimension::HasCumulVarSoftUpperBound</a></div><div class="ttdeci">bool HasCumulVarSoftUpperBound(int64_t index) const</div><div class="ttdoc">Returns true if a soft upper bound has been set for a given variable index.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06279">routing.cc:6279</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a90dcdb4d66f8781421f5913150a85a06"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a90dcdb4d66f8781421f5913150a85a06">operations_research::RoutingDimension::model</a></div><div class="ttdeci">RoutingModel * model() const</div><div class="ttdoc">Returns the model on which the dimension was created.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02498">routing.h:2498</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_a91b8a6eb7cf5ab0ebc74ddced140d700"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#a91b8a6eb7cf5ab0ebc74ddced140d700">operations_research::RoutingDimension::GetBreakIntervalsOfVehicle</a></div><div class="ttdeci">const std::vector< IntervalVar * > & GetBreakIntervalsOfVehicle(int vehicle) const</div><div class="ttdoc">Returns the break intervals set by SetBreakIntervalsOfVehicle().</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06498">routing.cc:6498</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_aa21323f8eeaa9c502d6cfb92109a73d4"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#aa21323f8eeaa9c502d6cfb92109a73d4">operations_research::RoutingDimension::SetPickupToDeliveryLimitFunctionForPair</a></div><div class="ttdeci">void SetPickupToDeliveryLimitFunctionForPair(PickupToDeliveryLimitFunction limit_function, int pair_index)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06539">routing.cc:6539</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_aa46d01169492b00c999344e8982ddd0f"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#aa46d01169492b00c999344e8982ddd0f">operations_research::RoutingDimension::vehicle_to_class</a></div><div class="ttdeci">int vehicle_to_class(int vehicle) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02605">routing.h:2605</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_aa597b91522af2c0f7f36f566e22f6d4a"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#aa597b91522af2c0f7f36f566e22f6d4a">operations_research::RoutingDimension::GetCumulVarPiecewiseLinearCost</a></div><div class="ttdeci">const PiecewiseLinearFunction * GetCumulVarPiecewiseLinearCost(int64_t index) const</div><div class="ttdoc">Returns the piecewise linear cost of a cumul variable for a given variable index.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06227">routing.cc:6227</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_aacebe98359d92dbc79626807ad78971c"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#aacebe98359d92dbc79626807ad78971c">operations_research::RoutingDimension::GetTransitValue</a></div><div class="ttdeci">int64_t GetTransitValue(int64_t from_index, int64_t to_index, int64_t vehicle) const</div><div class="ttdoc">Returns the transition value for a given pair of nodes (as var index); this value is the one taken by...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06147">routing.cc:6147</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_ad62d2fe202a7e38982ee1dea486f7a9f"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#ad62d2fe202a7e38982ee1dea486f7a9f">operations_research::RoutingDimension::SetCumulVarSoftUpperBound</a></div><div class="ttdeci">void SetCumulVarSoftUpperBound(int64_t index, int64_t upper_bound, int64_t coefficient)</div><div class="ttdoc">Sets a soft upper bound to the cumul variable of a given variable index.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06269">routing.cc:6269</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_ae34995163df20f89961e907ac3b25532"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#ae34995163df20f89961e907ac3b25532">operations_research::RoutingDimension::SetBreakIntervalsOfVehicle</a></div><div class="ttdeci">void SetBreakIntervalsOfVehicle(std::vector< IntervalVar * > breaks, int vehicle, int pre_travel_evaluator, int post_travel_evaluator)</div><div class="ttdoc">Sets the breaks for a given vehicle.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06455">routing.cc:6455</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_ae80c65007e8e9be55995bb2aa4493898"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#ae80c65007e8e9be55995bb2aa4493898">operations_research::RoutingDimension::GetCumulVarSoftUpperBound</a></div><div class="ttdeci">int64_t GetCumulVarSoftUpperBound(int64_t index) const</div><div class="ttdoc">Returns the soft upper bound of a cumul variable for a given variable index.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06284">routing.cc:6284</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_aeb48e0a259af538f591d9f843c113d00"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#aeb48e0a259af538f591d9f843c113d00">operations_research::RoutingDimension::GetBreakDistanceDurationOfVehicle</a></div><div class="ttdeci">const std::vector< std::pair< int64_t, int64_t > > & GetBreakDistanceDurationOfVehicle(int vehicle) const</div><div class="ttdoc">Returns the pairs (distance, duration) specified by break distance constraints.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06533">routing.cc:6533</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_aec65c2e89b95b1509b76fbff076666ad"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#aec65c2e89b95b1509b76fbff076666ad">operations_research::RoutingDimension::SetSpanUpperBoundForVehicle</a></div><div class="ttdeci">void SetSpanUpperBoundForVehicle(int64_t upper_bound, int vehicle)</div><div class="ttdoc">!defined(SWIGCSHARP) && !defined(SWIGJAVA) !defined(SWIGPYTHON)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06176">routing.cc:6176</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_af3506c5dbc4ca4f281ed0589164f3de0"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#af3506c5dbc4ca4f281ed0589164f3de0">operations_research::RoutingDimension::SetGlobalSpanCostCoefficient</a></div><div class="ttdeci">void SetGlobalSpanCostCoefficient(int64_t coefficient)</div><div class="ttdoc">Sets a cost proportional to the global dimension span, that is the difference between the largest val...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06198">routing.cc:6198</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_af42a5771d18b334091cc0f786219fe04"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#af42a5771d18b334091cc0f786219fe04">operations_research::RoutingDimension::~RoutingDimension</a></div><div class="ttdeci">~RoutingDimension()</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l05553">routing.cc:5553</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_af63828b2874b76ba4af52bfbbed5f156"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#af63828b2874b76ba4af52bfbbed5f156">operations_research::RoutingDimension::GetCumulVarSoftLowerBoundCoefficient</a></div><div class="ttdeci">int64_t GetCumulVarSoftLowerBoundCoefficient(int64_t index) const</div><div class="ttdoc">Returns the cost coefficient of the soft lower bound of a cumul variable for a given variable index.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06344">routing.cc:6344</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_afb4c32e76561cad95bd8be2777d8f1ac"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#afb4c32e76561cad95bd8be2777d8f1ac">operations_research::RoutingDimension::GetPostTravelEvaluatorOfVehicle</a></div><div class="ttdeci">int GetPostTravelEvaluatorOfVehicle(int vehicle) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06511">routing.cc:6511</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_afb58020be40d47c942a4f3f0b7661068"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#afb58020be40d47c942a4f3f0b7661068">operations_research::RoutingDimension::SetSpanCostCoefficientForVehicle</a></div><div class="ttdeci">void SetSpanCostCoefficientForVehicle(int64_t coefficient, int vehicle)</div><div class="ttdoc">Sets a cost proportional to the dimension span on a given vehicle, or on all vehicles at once.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06184">routing.cc:6184</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_afc83fbeb8594e87774089b99b0add61f"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#afc83fbeb8594e87774089b99b0add61f">operations_research::RoutingDimension::SetCumulVarSoftLowerBound</a></div><div class="ttdeci">void SetCumulVarSoftLowerBound(int64_t index, int64_t lower_bound, int64_t coefficient)</div><div class="ttdoc">Sets a soft lower bound to the cumul variable of a given variable index.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06321">routing.cc:6321</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_dimension_html_afe26c6f9f4c70620ce91fbff37f4834d"><div class="ttname"><a href="classoperations__research_1_1_routing_dimension.html#afe26c6f9f4c70620ce91fbff37f4834d">operations_research::RoutingDimension::GetCumulVarSoftLowerBound</a></div><div class="ttdeci">int64_t GetCumulVarSoftLowerBound(int64_t index) const</div><div class="ttdoc">Returns the soft lower bound of a cumul variable for a given variable index.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06336">routing.cc:6336</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_index_manager_html"><div class="ttname"><a href="classoperations__research_1_1_routing_index_manager.html">operations_research::RoutingIndexManager</a></div><div class="ttdoc">Manager for any NodeIndex <-> variable index conversion.</div><div class="ttdef"><b>Definition:</b> <a href="routing__index__manager_8h_source.html#l00049">routing_index_manager.h:49</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_index_manager_html_a182f3163446aae823f46636ed452b5fc"><div class="ttname"><a href="classoperations__research_1_1_routing_index_manager.html#a182f3163446aae823f46636ed452b5fc">operations_research::RoutingIndexManager::GetEndIndex</a></div><div class="ttdeci">int64_t GetEndIndex(int vehicle) const</div><div class="ttdef"><b>Definition:</b> <a href="routing__index__manager_8h_source.html#l00077">routing_index_manager.h:77</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_index_manager_html_a59b450e599349dfec9718bd43da47f24"><div class="ttname"><a href="classoperations__research_1_1_routing_index_manager.html#a59b450e599349dfec9718bd43da47f24">operations_research::RoutingIndexManager::GetStartIndex</a></div><div class="ttdeci">int64_t GetStartIndex(int vehicle) const</div><div class="ttdef"><b>Definition:</b> <a href="routing__index__manager_8h_source.html#l00074">routing_index_manager.h:74</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_index_manager_html_a77ea1e8bec366bf225bad6732c7eec63"><div class="ttname"><a href="classoperations__research_1_1_routing_index_manager.html#a77ea1e8bec366bf225bad6732c7eec63">operations_research::RoutingIndexManager::num_unique_depots</a></div><div class="ttdeci">int num_unique_depots() const</div><div class="ttdoc">complete.</div><div class="ttdef"><b>Definition:</b> <a href="routing__index__manager_8h_source.html#l00103">routing_index_manager.h:103</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_index_manager_html_aaa5a86f47526bbf08a77756d5b542d48"><div class="ttname"><a href="classoperations__research_1_1_routing_index_manager.html#aaa5a86f47526bbf08a77756d5b542d48">operations_research::RoutingIndexManager::IndexToNode</a></div><div class="ttdeci">NodeIndex IndexToNode(int64_t index) const</div><div class="ttdef"><b>Definition:</b> <a href="routing__index__manager_8h_source.html#l00092">routing_index_manager.h:92</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_index_manager_html_ab4cc8be57f3de60a3cc605250950295a"><div class="ttname"><a href="classoperations__research_1_1_routing_index_manager.html#ab4cc8be57f3de60a3cc605250950295a">operations_research::RoutingIndexManager::GetIndexToNodeMap</a></div><div class="ttdeci">std::vector< NodeIndex > GetIndexToNodeMap() const</div><div class="ttdef"><b>Definition:</b> <a href="routing__index__manager_8h_source.html#l00104">routing_index_manager.h:104</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_index_manager_html_ad422f8593b66956120c8a5b1959b2623"><div class="ttname"><a href="classoperations__research_1_1_routing_index_manager.html#ad422f8593b66956120c8a5b1959b2623">operations_research::RoutingIndexManager::num_vehicles</a></div><div class="ttdeci">int num_vehicles() const</div><div class="ttdef"><b>Definition:</b> <a href="routing__index__manager_8h_source.html#l00070">routing_index_manager.h:70</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_index_manager_html_ae7309bcc0f1a1e238ad7501f1b553ef2"><div class="ttname"><a href="classoperations__research_1_1_routing_index_manager.html#ae7309bcc0f1a1e238ad7501f1b553ef2">operations_research::RoutingIndexManager::num_indices</a></div><div class="ttdeci">int num_indices() const</div><div class="ttdef"><b>Definition:</b> <a href="routing__index__manager_8h_source.html#l00072">routing_index_manager.h:72</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_1_1_resource_group_1_1_attributes_html"><div class="ttname"><a href="classoperations__research_1_1_routing_model_1_1_resource_group_1_1_attributes.html">operations_research::RoutingModel::ResourceGroup::Attributes</a></div><div class="ttdoc">Attributes for a dimension.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00393">routing.h:393</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_1_1_resource_group_1_1_attributes_html_a2ee6f3658c1eec6d46c09c2494ace6a2"><div class="ttname"><a href="classoperations__research_1_1_routing_model_1_1_resource_group_1_1_attributes.html#a2ee6f3658c1eec6d46c09c2494ace6a2">operations_research::RoutingModel::ResourceGroup::Attributes::Attributes</a></div><div class="ttdeci">Attributes()</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01271">routing.cc:1271</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_1_1_resource_group_1_1_resource_html"><div class="ttname"><a href="classoperations__research_1_1_routing_model_1_1_resource_group_1_1_resource.html">operations_research::RoutingModel::ResourceGroup::Resource</a></div><div class="ttdoc">A Resource sets attributes (costs/constraints) for a set of dimensions.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00411">routing.h:411</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_1_1_resource_group_1_1_resource_html_a62ffecc22f41f4274edc49987db5770e"><div class="ttname"><a href="classoperations__research_1_1_routing_model_1_1_resource_group_1_1_resource.html#a62ffecc22f41f4274edc49987db5770e">operations_research::RoutingModel::ResourceGroup::Resource::GetDimensionAttributes</a></div><div class="ttdeci">const Attributes & GetDimensionAttributes(const RoutingDimension *dimension) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01282">routing.cc:1282</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_1_1_resource_group_html"><div class="ttname"><a href="classoperations__research_1_1_routing_model_1_1_resource_group.html">operations_research::RoutingModel::ResourceGroup</a></div><div class="ttdoc">A ResourceGroup defines a set of available Resources with attributes on one or multiple dimensions.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00390">routing.h:390</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_1_1_resource_group_html_a24926108b770033792d015cb86aeffb3"><div class="ttname"><a href="classoperations__research_1_1_routing_model_1_1_resource_group.html#a24926108b770033792d015cb86aeffb3">operations_research::RoutingModel::ResourceGroup::Size</a></div><div class="ttdeci">int Size() const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00440">routing.h:440</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_1_1_resource_group_html_aa28b494f521776a038f0a4d5f9289ebb"><div class="ttname"><a href="classoperations__research_1_1_routing_model_1_1_resource_group.html#aa28b494f521776a038f0a4d5f9289ebb">operations_research::RoutingModel::ResourceGroup::AddResource</a></div><div class="ttdeci">void AddResource(Attributes attributes, const RoutingDimension *dimension)</div><div class="ttdoc">Add a Resource with the given attributes for the corresponding dimension.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01313">routing.cc:1313</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_1_1_resource_group_html_ad93f7aec147f056b882871e4859d7ed7"><div class="ttname"><a href="classoperations__research_1_1_routing_model_1_1_resource_group.html#ad93f7aec147f056b882871e4859d7ed7">operations_research::RoutingModel::ResourceGroup::GetAffectedDimensionIndices</a></div><div class="ttdeci">const absl::flat_hash_set< DimensionIndex > & GetAffectedDimensionIndices() const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00436">routing.h:436</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html">operations_research::RoutingModel</a></div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00209">routing.h:209</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a00141bd90e555aea59a9e98cfbcda6eb"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a00141bd90e555aea59a9e98cfbcda6eb">operations_research::RoutingModel::RoutingModelInspector</a></div><div class="ttdeci">friend class RoutingModelInspector</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02062">routing.h:2062</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a045b5c068a5676ef3d3af9357621d7f7"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a045b5c068a5676ef3d3af9357621d7f7">operations_research::RoutingModel::ComputeLowerBound</a></div><div class="ttdeci">int64_t ComputeLowerBound()</div><div class="ttdoc">Computes a lower bound to the routing problem solving a linear assignment problem.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l02913">routing.cc:2913</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a086605d9650ce3c576d8a9c45ce0b9fc"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a086605d9650ce3c576d8a9c45ce0b9fc">operations_research::RoutingModel::AddAtSolutionCallback</a></div><div class="ttdeci">void AddAtSolutionCallback(std::function< void()> callback)</div><div class="ttdoc">Adds a callback called each time a solution is found during the search.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l02650">routing.cc:2650</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a090a12711254bafc2cc797f8f6b21a8c"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a090a12711254bafc2cc797f8f6b21a8c">operations_research::RoutingModel::SolveFromAssignmentsWithParameters</a></div><div class="ttdeci">const Assignment * SolveFromAssignmentsWithParameters(const std::vector< const Assignment * > &assignments, const RoutingSearchParameters &search_parameters, std::vector< const Assignment * > *solutions=nullptr)</div><div class="ttdoc">Same as above but will try all assignments in order as first solutions until one succeeds.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l02733">routing.cc:2733</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a0b526d33739114e9255ffbe8343efe1a"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a0b526d33739114e9255ffbe8343efe1a">operations_research::RoutingModel::solver</a></div><div class="ttdeci">Solver * solver() const</div><div class="ttdoc">Returns the underlying constraint solver.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01440">routing.h:1440</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a0ceffe3b4741e0075a7be69d5d539ec4"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a0ceffe3b4741e0075a7be69d5d539ec4">operations_research::RoutingModel::TransitCallback</a></div><div class="ttdeci">const TransitCallback2 & TransitCallback(int callback_index) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00480">routing.h:480</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a0d3987c3df07976d19f3165788fc97a9"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a0d3987c3df07976d19f3165788fc97a9">operations_research::RoutingModel::RestoreAssignment</a></div><div class="ttdeci">Assignment * RestoreAssignment(const Assignment &solution)</div><div class="ttdoc">Restores an assignment as a solution in the routing model and returns the new solution.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03209">routing.cc:3209</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a0e106a97f0156868f1d1c741b283793e"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a0e106a97f0156868f1d1c741b283793e">operations_research::RoutingModel::GetTabuVarsCallback</a></div><div class="ttdeci">std::function< std::vector< operations_research::IntVar * >(RoutingModel *)> GetTabuVarsCallback</div><div class="ttdoc">Sets the callback returning the variable to use for the Tabu Search metaheuristic.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01480">routing.h:1481</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a0e23be986e4c3b96a50c8798aa5f536d"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a0e23be986e4c3b96a50c8798aa5f536d">operations_research::RoutingModel::AddSearchMonitor</a></div><div class="ttdeci">void AddSearchMonitor(SearchMonitor *const monitor)</div><div class="ttdoc">Adds a search monitor to the search used to solve the routing model.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l02631">routing.cc:2631</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a102980a19e062b6a1b0b89f119d64e67"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a102980a19e062b6a1b0b89f119d64e67">operations_research::RoutingModel::AddDimensionDependentDimensionWithVehicleCapacity</a></div><div class="ttdeci">bool AddDimensionDependentDimensionWithVehicleCapacity(const std::vector< int > &pure_transits, const std::vector< int > &dependent_transits, const RoutingDimension *base_dimension, int64_t slack_max, std::vector< int64_t > vehicle_capacities, bool fix_start_cumul_to_zero, const std::string &name)</div><div class="ttdoc">Creates a dimension with transits depending on the cumuls of another dimension.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00577">routing.h:577</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a114000eadb54d1a6275add6c1e6fcf33"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a114000eadb54d1a6275add6c1e6fcf33">operations_research::RoutingModel::GetVehicleClassIndexOfVehicle</a></div><div class="ttdeci">VehicleClassIndex GetVehicleClassIndexOfVehicle(int64_t vehicle) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01371">routing.h:1371</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a1156fa8214dba09e2a2a94862244aa1f"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a1156fa8214dba09e2a2a94862244aa1f">operations_research::RoutingModel::AddLocalSearchOperator</a></div><div class="ttdeci">void AddLocalSearchOperator(LocalSearchOperator *ls_operator)</div><div class="ttdoc">Adds a local search operator to the set of operators used to solve the vehicle routing problem.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01930">routing.cc:1930</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a1a976fc02875c6fbc766c8a67c8a2b93"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a1a976fc02875c6fbc766c8a67c8a2b93">operations_research::RoutingModel::AddMatrixDimension</a></div><div class="ttdeci">std::pair< int, bool > AddMatrixDimension(std::vector< std::vector< int64_t > > values, int64_t capacity, bool fix_start_cumul_to_zero, const std::string &name)</div><div class="ttdoc">Creates a dimension where the transit variable is constrained to be equal to 'values[i][next(i)]' for...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01038">routing.cc:1038</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a1e783e12fa9a756c3f96ef9bb09cb972"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a1e783e12fa9a756c3f96ef9bb09cb972">operations_research::RoutingModel::GetPairIndicesOfType</a></div><div class="ttdeci">const std::vector< int > & GetPairIndicesOfType(int type) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03643">routing.cc:3643</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a204041e5264282d54dfd198011e776d3"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a204041e5264282d54dfd198011e776d3">operations_research::RoutingModel::TransitCallback1</a></div><div class="ttdeci">RoutingTransitCallback1 TransitCallback1</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00238">routing.h:238</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a20e9006ff9b8dc8ce89a8239a092b0c7"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a20e9006ff9b8dc8ce89a8239a092b0c7">operations_research::RoutingModel::GetTemporalTypeIncompatibilitiesOfType</a></div><div class="ttdeci">const absl::flat_hash_set< int > & GetTemporalTypeIncompatibilitiesOfType(int type) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03689">routing.cc:3689</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a219dfa10a2c3c26cff85c5adde3d47a3"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a219dfa10a2c3c26cff85c5adde3d47a3">operations_research::RoutingModel::GetDimensionResourceGroupIndices</a></div><div class="ttdeci">const std::vector< int > & GetDimensionResourceGroupIndices(const RoutingDimension *dimension) const</div><div class="ttdoc">Returns the indices of resource groups for this dimension.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01328">routing.cc:1328</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a25d079aaf52ffdf6d547384b523ff018"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a25d079aaf52ffdf6d547384b523ff018">operations_research::RoutingModel::DebugOutputAssignment</a></div><div class="ttdeci">std::string DebugOutputAssignment(const Assignment &solution_assignment, const std::string &dimension_to_print) const</div><div class="ttdoc">Print some debugging information about an assignment, including the feasible intervals of the CumulVa...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03802">routing.cc:3802</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a2c5397c69eec560d911892a7c1642bdd"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a2c5397c69eec560d911892a7c1642bdd">operations_research::RoutingModel::GetRequiredTypeAlternativesWhenRemovingType</a></div><div class="ttdeci">const std::vector< absl::flat_hash_set< int > > & GetRequiredTypeAlternativesWhenRemovingType(int type) const</div><div class="ttdoc">Returns the set of requirement alternatives when removing the given type.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03778">routing.cc:3778</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a34ab0d5fa45360b5e6a42b9a78cfe5a8"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a34ab0d5fa45360b5e6a42b9a78cfe5a8">operations_research::RoutingModel::GetVehicleClassesCount</a></div><div class="ttdeci">int GetVehicleClassesCount() const</div><div class="ttdoc">Returns the number of different vehicle classes in the model.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01391">routing.h:1391</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a34bd38fe78ef5896f2a623170f1be5d0"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a34bd38fe78ef5896f2a623170f1be5d0">operations_research::RoutingModel::GetFixedCostOfVehicle</a></div><div class="ttdeci">int64_t GetFixedCostOfVehicle(int vehicle) const</div><div class="ttdoc">Returns the route fixed cost taken into account if the route of the vehicle is not empty,...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01356">routing.cc:1356</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a34be40dba53068c0eb5c1f1fbb5966c0"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a34be40dba53068c0eb5c1f1fbb5966c0">operations_research::RoutingModel::AddVectorDimension</a></div><div class="ttdeci">std::pair< int, bool > AddVectorDimension(std::vector< int64_t > values, int64_t capacity, bool fix_start_cumul_to_zero, const std::string &name)</div><div class="ttdoc">Creates a dimension where the transit variable is constrained to be equal to 'values[i]' for node i; ...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01029">routing.cc:1029</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a351611d23877598dbf426f4235b68112"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a351611d23877598dbf426f4235b68112">operations_research::RoutingModel::GetPickupAndDeliveryPolicyOfVehicle</a></div><div class="ttdeci">PickupAndDeliveryPolicy GetPickupAndDeliveryPolicyOfVehicle(int vehicle) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01883">routing.cc:1883</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a3582f01eabc65ba4b801215ca6420a7c"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a3582f01eabc65ba4b801215ca6420a7c">operations_research::RoutingModel::IsStart</a></div><div class="ttdeci">bool IsStart(int64_t index) const</div><div class="ttdoc">Returns true if 'index' represents the first node of a route.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03452">routing.cc:3452</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a3656e594d89a44fb6b35ba8f2d395624"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a3656e594d89a44fb6b35ba8f2d395624">operations_research::RoutingModel::SetPickupAndDeliveryPolicyOfAllVehicles</a></div><div class="ttdeci">void SetPickupAndDeliveryPolicyOfAllVehicles(PickupAndDeliveryPolicy policy)</div><div class="ttdoc">Sets the Pickup and delivery policy of all vehicles.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01874">routing.cc:1874</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a3941ea5b7354b04afea324f91a2ebd35"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a3941ea5b7354b04afea324f91a2ebd35">operations_research::RoutingModel::AddSoftSameVehicleConstraint</a></div><div class="ttdeci">void AddSoftSameVehicleConstraint(const std::vector< int64_t > &indices, int64_t cost)</div><div class="ttdoc">Adds a soft constraint to force a set of variable indices to be on the same vehicle.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01797">routing.cc:1797</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a3d81f16de798be60f56cf03cd9b907cf"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a3d81f16de798be60f56cf03cd9b907cf">operations_research::RoutingModel::ReadAssignment</a></div><div class="ttdeci">Assignment * ReadAssignment(const std::string &file_name)</div><div class="ttdoc">Reads an assignment from a file and returns the current solution.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03200">routing.cc:3200</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a3ea07f9778e02e7160c30bfb0f08736b"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a3ea07f9778e02e7160c30bfb0f08736b">operations_research::RoutingModel::CompactAssignment</a></div><div class="ttdeci">Assignment * CompactAssignment(const Assignment &assignment) const</div><div class="ttdoc">Returns a compacted version of the given assignment, in which all vehicles with id lower or equal to ...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03057">routing.cc:3057</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a422ce2898045c53fc90d21d8633d4af7"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a422ce2898045c53fc90d21d8633d4af7">operations_research::RoutingModel::RegisterStateDependentTransitCallback</a></div><div class="ttdeci">int RegisterStateDependentTransitCallback(VariableIndexEvaluator2 callback)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l00915">routing.cc:915</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a434b15d056c7e1751925eba475e84c32"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a434b15d056c7e1751925eba475e84c32">operations_research::RoutingModel::GetDeliveryIndexPairs</a></div><div class="ttdeci">const std::vector< std::pair< int, int > > & GetDeliveryIndexPairs(int64_t node_index) const</div><div class="ttdoc">Same as above for deliveries.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01862">routing.cc:1862</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a437ae499bef0aa64f2753166a000f5bd"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a437ae499bef0aa64f2753166a000f5bd">operations_research::RoutingModel::AddToAssignment</a></div><div class="ttdeci">void AddToAssignment(IntVar *const var)</div><div class="ttdoc">Adds an extra variable to the vehicle routing assignment.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l05173">routing.cc:5173</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a43c00b1c44d7f5bec9287ce60fadef52"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a43c00b1c44d7f5bec9287ce60fadef52">operations_research::RoutingModel::VehicleVar</a></div><div class="ttdeci">IntVar * VehicleVar(int64_t index) const</div><div class="ttdoc">Returns the vehicle variable of the node corresponding to index.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01319">routing.h:1319</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a4768ba91c34c542eddec212a68d79473"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a4768ba91c34c542eddec212a68d79473">operations_research::RoutingModel::AddVariableMinimizedByFinalizer</a></div><div class="ttdeci">void AddVariableMinimizedByFinalizer(IntVar *var)</div><div class="ttdoc">Adds a variable to minimize in the solution finalizer.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l05163">routing.cc:5163</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a495b53b94a8c31a8f13755962d6c6059"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059">operations_research::RoutingModel::VisitTypePolicy</a></div><div class="ttdeci">VisitTypePolicy</div><div class="ttdoc">Set the node visit types and incompatibilities/requirements between the types (see below).</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00861">routing.h:861</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a495b53b94a8c31a8f13755962d6c6059a0c6d4521dc67c6bc22dc917caef2286a"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a0c6d4521dc67c6bc22dc917caef2286a">operations_research::RoutingModel::TYPE_ADDED_TO_VEHICLE</a></div><div class="ttdeci">@ TYPE_ADDED_TO_VEHICLE</div><div class="ttdoc">When visited, the number of types 'T' on the vehicle increases by one.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00863">routing.h:863</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a495b53b94a8c31a8f13755962d6c6059a5b57570c52e974c761a9b08c1fc7e8ab"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a5b57570c52e974c761a9b08c1fc7e8ab">operations_research::RoutingModel::ADDED_TYPE_REMOVED_FROM_VEHICLE</a></div><div class="ttdeci">@ ADDED_TYPE_REMOVED_FROM_VEHICLE</div><div class="ttdoc">When visited, one instance of type 'T' previously added to the route (TYPE_ADDED_TO_VEHICLE),...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00868">routing.h:868</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a495b53b94a8c31a8f13755962d6c6059a7fc0cab89681d70bbb68958ed70b85c1"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059a7fc0cab89681d70bbb68958ed70b85c1">operations_research::RoutingModel::TYPE_ON_VEHICLE_UP_TO_VISIT</a></div><div class="ttdeci">@ TYPE_ON_VEHICLE_UP_TO_VISIT</div><div class="ttdoc">With the following policy, the visit enforces that type 'T' is considered on the route from its start...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00871">routing.h:871</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a495b53b94a8c31a8f13755962d6c6059ad86e8082b5636a532fe181b288a4dea7"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a495b53b94a8c31a8f13755962d6c6059ad86e8082b5636a532fe181b288a4dea7">operations_research::RoutingModel::TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED</a></div><div class="ttdeci">@ TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED</div><div class="ttdoc">The visit doesn't have an impact on the number of types 'T' on the route, as it's (virtually) added a...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00877">routing.h:876</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a4aa17dcb68bcfcfa4c6c0088f5155da8"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a4aa17dcb68bcfcfa4c6c0088f5155da8">operations_research::RoutingModel::GetMutableGlobalCumulMPOptimizer</a></div><div class="ttdeci">GlobalDimensionCumulOptimizer * GetMutableGlobalCumulMPOptimizer(const RoutingDimension &dimension) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01210">routing.cc:1210</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a4ffedcd1ce5dc6b224edff0b417aad5c"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a4ffedcd1ce5dc6b224edff0b417aad5c">operations_research::RoutingModel::MakePathSpansAndTotalSlacks</a></div><div class="ttdeci">Constraint * MakePathSpansAndTotalSlacks(const RoutingDimension *dimension, std::vector< IntVar * > spans, std::vector< IntVar * > total_slacks)</div><div class="ttdoc">For every vehicle of the routing model:</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l05519">routing.cc:5519</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a50ba9dd11704e0be7edaa9e9f24142ff"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a50ba9dd11704e0be7edaa9e9f24142ff">operations_research::RoutingModel::RoutingDimension</a></div><div class="ttdeci">friend class RoutingDimension</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02061">routing.h:2061</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a51b526b532fc95cfed13d54ed2d6db95"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a51b526b532fc95cfed13d54ed2d6db95">operations_research::RoutingModel::GetHomogeneousCost</a></div><div class="ttdeci">int64_t GetHomogeneousCost(int64_t from_index, int64_t to_index) const</div><div class="ttdoc">Returns the cost of the segment between two nodes supposing all vehicle costs are the same (returns t...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01333">routing.h:1333</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a54dbca44a148f9d6d37d4938d686b838"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a54dbca44a148f9d6d37d4938d686b838">operations_research::RoutingModel::GetMutableLocalCumulOptimizer</a></div><div class="ttdeci">LocalDimensionCumulOptimizer * GetMutableLocalCumulOptimizer(const RoutingDimension &dimension) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01222">routing.cc:1222</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a558728d2399a362f2595455653edad02"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a558728d2399a362f2595455653edad02">operations_research::RoutingModel::RegisterUnaryTransitVector</a></div><div class="ttdeci">int RegisterUnaryTransitVector(std::vector< int64_t > values)</div><div class="ttdoc">Registers 'callback' and returns its index.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l00836">routing.cc:836</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a56d36a8ace500aa67983ea7cbf4e97e7"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a56d36a8ace500aa67983ea7cbf4e97e7">operations_research::RoutingModel::GetSameVehicleRequiredTypeAlternativesOfType</a></div><div class="ttdeci">const std::vector< absl::flat_hash_set< int > > & GetSameVehicleRequiredTypeAlternativesOfType(int type) const</div><div class="ttdoc">Returns the set of same-vehicle requirement alternatives for the given type.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03763">routing.cc:3763</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a572bd92c25ebc67c72137fd59e53f6d6"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a572bd92c25ebc67c72137fd59e53f6d6">operations_research::RoutingModel::Size</a></div><div class="ttdeci">int64_t Size() const</div><div class="ttdoc">Returns the number of next variables in the model.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01460">routing.h:1460</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a57cfea273f9a4d2bacc0cc1e626cb3e1"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a57cfea273f9a4d2bacc0cc1e626cb3e1">operations_research::RoutingModel::GetMutableDimension</a></div><div class="ttdeci">RoutingDimension * GetMutableDimension(const std::string &dimension_name) const</div><div class="ttdoc">Returns a dimension from its name.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01261">routing.cc:1261</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a5ae82715107922af5fbc18f854d58026"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a5ae82715107922af5fbc18f854d58026">operations_research::RoutingModel::GetVisitType</a></div><div class="ttdeci">int GetVisitType(int64_t index) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03633">routing.cc:3633</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a5b158fd970a1fb0cd98f6c3c324aa7d2"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a5b158fd970a1fb0cd98f6c3c324aa7d2">operations_research::RoutingModel::RoutesToAssignment</a></div><div class="ttdeci">bool RoutesToAssignment(const std::vector< std::vector< int64_t > > &routes, bool ignore_inactive_indices, bool close_routes, Assignment *const assignment) const</div><div class="ttdoc">Fills an assignment from a specification of the routes of the vehicles.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03231">routing.cc:3231</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a5e3f4c6871f7b2c67fd5b1ad6c94d891"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a5e3f4c6871f7b2c67fd5b1ad6c94d891">operations_research::RoutingModel::HasTemporalTypeRequirements</a></div><div class="ttdeci">bool HasTemporalTypeRequirements() const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00958">routing.h:958</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a5e7fe0d056275b47eccc1b6bfce0b482"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a5e7fe0d056275b47eccc1b6bfce0b482">operations_research::RoutingModel::NextVar</a></div><div class="ttdeci">IntVar * NextVar(int64_t index) const</div><div class="ttdoc">!defined(SWIGPYTHON)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01304">routing.h:1304</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a5f3df49299b1aaad3bca40b14291aa79"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a5f3df49299b1aaad3bca40b14291aa79">operations_research::RoutingModel::kNoPenalty</a></div><div class="ttdeci">static const int64_t kNoPenalty</div><div class="ttdoc">Constant used to express a hard constraint instead of a soft penalty.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00451">routing.h:451</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a5f404ec17ed0917a6ac3711ac53e60f1"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a5f404ec17ed0917a6ac3711ac53e60f1">operations_research::RoutingModel::AddPickupAndDeliverySets</a></div><div class="ttdeci">void AddPickupAndDeliverySets(DisjunctionIndex pickup_disjunction, DisjunctionIndex delivery_disjunction)</div><div class="ttdoc">Same as AddPickupAndDelivery but notifying that the performed node from the disjunction of index 'pic...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01823">routing.cc:1823</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a5fa8aee5b0c67072dbbb03f1899ec60a"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a5fa8aee5b0c67072dbbb03f1899ec60a">operations_research::RoutingModel::TransitCallback2</a></div><div class="ttdeci">RoutingTransitCallback2 TransitCallback2</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00239">routing.h:239</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a641eb9492d9e1682b05fd882635fcfd7"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a641eb9492d9e1682b05fd882635fcfd7">operations_research::RoutingModel::sweep_arranger</a></div><div class="ttdeci">SweepArranger * sweep_arranger() const</div><div class="ttdoc">Returns the sweep arranger to be used by routing heuristics.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l00504">routing.cc:504</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a644ab247b579b93e9a3b1ecd96ba415c"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a644ab247b579b93e9a3b1ecd96ba415c">operations_research::RoutingModel::GetAllDimensionNames</a></div><div class="ttdeci">std::vector< std::string > GetAllDimensionNames() const</div><div class="ttdoc">Outputs the names of all dimensions added to the routing engine.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01189">routing.cc:1189</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a646667a1b7c142fc9ac9471be43d12d1"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a646667a1b7c142fc9ac9471be43d12d1">operations_research::RoutingModel::AddConstantDimensionWithSlack</a></div><div class="ttdeci">std::pair< int, bool > AddConstantDimensionWithSlack(int64_t value, int64_t capacity, int64_t slack_max, bool fix_start_cumul_to_zero, const std::string &name)</div><div class="ttdoc">Creates a dimension where the transit variable is constrained to be equal to 'value'; 'capacity' is t...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01018">routing.cc:1018</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a64ae94fd93be72fc5872e9fe27a8c8ab"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a64ae94fd93be72fc5872e9fe27a8c8ab">operations_research::RoutingModel::ReadAssignmentFromRoutes</a></div><div class="ttdeci">Assignment * ReadAssignmentFromRoutes(const std::vector< std::vector< int64_t > > &routes, bool ignore_inactive_indices)</div><div class="ttdoc">Restores the routes as the current solution.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03344">routing.cc:3344</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a674ab7782c46ba72034c73932b1dbd38"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a674ab7782c46ba72034c73932b1dbd38">operations_research::RoutingModel::SolveFromAssignmentWithParameters</a></div><div class="ttdeci">const Assignment * SolveFromAssignmentWithParameters(const Assignment *assignment, const RoutingSearchParameters &search_parameters, std::vector< const Assignment * > *solutions=nullptr)</div><div class="ttdoc">Same as above, except that if assignment is not null, it will be used as the initial solution.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l02726">routing.cc:2726</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a67a0db04d321a74b7e7fcfd3f1a3f70ba09515ee36ef4715f09f3aa67f685011e"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70ba09515ee36ef4715f09f3aa67f685011e">operations_research::RoutingModel::ROUTING_SUCCESS</a></div><div class="ttdeci">@ ROUTING_SUCCESS</div><div class="ttdoc">Problem solved successfully after calling RoutingModel::Solve().</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00216">routing.h:216</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a67a0db04d321a74b7e7fcfd3f1a3f70baba9b2029e549c14c8a6b9f6201e329fd"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70baba9b2029e549c14c8a6b9f6201e329fd">operations_research::RoutingModel::ROUTING_FAIL</a></div><div class="ttdeci">@ ROUTING_FAIL</div><div class="ttdoc">No solution found to the problem after calling RoutingModel::Solve().</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00218">routing.h:218</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a67a0db04d321a74b7e7fcfd3f1a3f70bae78ffdfdfc3eb7331c0ef91bdef8452b"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70bae78ffdfdfc3eb7331c0ef91bdef8452b">operations_research::RoutingModel::ROUTING_INVALID</a></div><div class="ttdeci">@ ROUTING_INVALID</div><div class="ttdoc">Model, model parameters or flags are not valid.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00223">routing.h:222</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a67a0db04d321a74b7e7fcfd3f1a3f70baf6452d79d02ab06bc8d722d25825cae3"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a67a0db04d321a74b7e7fcfd3f1a3f70baf6452d79d02ab06bc8d722d25825cae3">operations_research::RoutingModel::ROUTING_FAIL_TIMEOUT</a></div><div class="ttdeci">@ ROUTING_FAIL_TIMEOUT</div><div class="ttdoc">Time limit reached before finding a solution with RoutingModel::Solve().</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00220">routing.h:220</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a6a07d2e1f4a3af4a2c0051ab40a8b788"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a6a07d2e1f4a3af4a2c0051ab40a8b788">operations_research::RoutingModel::SetVisitType</a></div><div class="ttdeci">void SetVisitType(int64_t index, int type, VisitTypePolicy type_policy)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03624">routing.cc:3624</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a6aa2251c9948bb8c23fe58704b580b65"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a6aa2251c9948bb8c23fe58704b580b65">operations_research::RoutingModel::GetDepot</a></div><div class="ttdeci">int64_t GetDepot() const</div><div class="ttdoc">Returns the variable index of the first starting or ending node of all routes.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01934">routing.cc:1934</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a6e0fb2d4d5bbda1cad6bf795152cbe13"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a6e0fb2d4d5bbda1cad6bf795152cbe13">operations_research::RoutingModel::GetDimensionsWithSoftOrSpanCosts</a></div><div class="ttdeci">std::vector< RoutingDimension * > GetDimensionsWithSoftOrSpanCosts() const</div><div class="ttdoc">Returns dimensions with soft or vehicle span costs.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l04571">routing.cc:4571</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a700982f228080c6278eb5a2f7f06f31d"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a700982f228080c6278eb5a2f7f06f31d">operations_research::RoutingModel::SetSweepArranger</a></div><div class="ttdeci">void SetSweepArranger(SweepArranger *sweep_arranger)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l00500">routing.cc:500</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a7086a908f1890a7e1550c97b774e6384"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a7086a908f1890a7e1550c97b774e6384">operations_research::RoutingModel::AddTemporalTypeIncompatibility</a></div><div class="ttdeci">void AddTemporalTypeIncompatibility(int type1, int type2)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03672">routing.cc:3672</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a72d627d4d3da5f1b59256eb9ebf503b5"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a72d627d4d3da5f1b59256eb9ebf503b5">operations_research::RoutingModel::GetSingleNodesOfType</a></div><div class="ttdeci">const std::vector< int > & GetSingleNodesOfType(int type) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03638">routing.cc:3638</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a76b241b39811cd74a0ab6e59ab9f63f2"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a76b241b39811cd74a0ab6e59ab9f63f2">operations_research::RoutingModel::SetFixedCostOfVehicle</a></div><div class="ttdeci">void SetFixedCostOfVehicle(int64_t cost, int vehicle)</div><div class="ttdoc">Sets the fixed cost of one vehicle route.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01361">routing.cc:1361</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a76e91ac014792e6e99d7e19afeff36dc"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a76e91ac014792e6e99d7e19afeff36dc">operations_research::RoutingModel::GetCumulBounds</a></div><div class="ttdeci">std::vector< std::vector< std::pair< int64_t, int64_t > > > GetCumulBounds(const Assignment &solution_assignment, const RoutingDimension &dimension)</div><div class="ttdoc">Returns a vector cumul_bounds, for which cumul_bounds[i][j] is a pair containing the minimum and maxi...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03876">routing.cc:3876</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a780dc49f977070d8f061d82550b8ca82"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a780dc49f977070d8f061d82550b8ca82">operations_research::RoutingModel::GetRequiredTypeAlternativesWhenAddingType</a></div><div class="ttdeci">const std::vector< absl::flat_hash_set< int > > & GetRequiredTypeAlternativesWhenAddingType(int type) const</div><div class="ttdoc">Returns the set of requirement alternatives when adding the given type.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03771">routing.cc:3771</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a78657faa6e076466c745caefdf732970"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a78657faa6e076466c745caefdf732970">operations_research::RoutingModel::ArcIsMoreConstrainedThanArc</a></div><div class="ttdeci">bool ArcIsMoreConstrainedThanArc(int64_t from, int64_t to1, int64_t to2)</div><div class="ttdoc">Returns whether the arc from->to1 is more constrained than from->to2, taking into account,...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03529">routing.cc:3529</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a796b4eed03ed53bbbaed642f4ae94952"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a796b4eed03ed53bbbaed642f4ae94952">operations_research::RoutingModel::AddHardTypeIncompatibility</a></div><div class="ttdeci">void AddHardTypeIncompatibility(int type1, int type2)</div><div class="ttdoc">Incompatibilities: Two nodes with "hard" incompatible types cannot share the same route at all,...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03663">routing.cc:3663</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a7ab8e7947bd1cf91da5560bf7db1fa61"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a7ab8e7947bd1cf91da5560bf7db1fa61">operations_research::RoutingModel::AddPickupAndDelivery</a></div><div class="ttdeci">void AddPickupAndDelivery(int64_t pickup, int64_t delivery)</div><div class="ttdoc">Notifies that index1 and index2 form a pair of nodes which should belong to the same route.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01818">routing.cc:1818</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a7bcff3e4ab28854695610b340d5d11c3"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a7bcff3e4ab28854695610b340d5d11c3">operations_research::RoutingModel::UnaryTransitCallbackOrNull</a></div><div class="ttdeci">const TransitCallback1 & UnaryTransitCallbackOrNull(int callback_index) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00484">routing.h:484</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a7c1886b567f58aff622ab91f7f0f8685"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a7c1886b567f58aff622ab91f7f0f8685">operations_research::RoutingModel::GetArcCostForFirstSolution</a></div><div class="ttdeci">int64_t GetArcCostForFirstSolution(int64_t from_index, int64_t to_index) const</div><div class="ttdoc">Returns the cost of the arc in the context of the first solution strategy.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03495">routing.cc:3495</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a7d83ad98473be9a287f5ef628b99c929"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a7d83ad98473be9a287f5ef628b99c929">operations_research::RoutingModel::IsVehicleAllowedForIndex</a></div><div class="ttdeci">bool IsVehicleAllowedForIndex(int vehicle, int64_t index)</div><div class="ttdoc">Returns true if a vehicle is allowed to visit a given node.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00782">routing.h:782</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a7dd3d77b26ddfc5e981637ee8b83c1ed"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a7dd3d77b26ddfc5e981637ee8b83c1ed">operations_research::RoutingModel::RegisterPositiveUnaryTransitCallback</a></div><div class="ttdeci">int RegisterPositiveUnaryTransitCallback(TransitCallback1 callback)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l00874">routing.cc:874</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a7e2d405cde11bc4a08d752d0e669912c"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a7e2d405cde11bc4a08d752d0e669912c">operations_research::RoutingModel::SetTabuVarsCallback</a></div><div class="ttdeci">void SetTabuVarsCallback(GetTabuVarsCallback tabu_var_callback)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l05059">routing.cc:5059</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a7fcd2e6d28a2ac1d07f052bc8840a477"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a7fcd2e6d28a2ac1d07f052bc8840a477">operations_research::RoutingModel::ApplyLocks</a></div><div class="ttdeci">IntVar * ApplyLocks(const std::vector< int64_t > &locks)</div><div class="ttdoc">Applies a lock chain to the next search.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03148">routing.cc:3148</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a8174e01c9a66c00a87cdbe86ccd3655c"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a8174e01c9a66c00a87cdbe86ccd3655c">operations_research::RoutingModel::GetArcCostForVehicle</a></div><div class="ttdeci">int64_t GetArcCostForVehicle(int64_t from_index, int64_t to_index, int64_t vehicle) const</div><div class="ttdoc">Returns the cost of the transit arc between two nodes for a given vehicle.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03474">routing.cc:3474</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a822458cc9a9a6fa02e86af3e3a1e5c89"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a822458cc9a9a6fa02e86af3e3a1e5c89">operations_research::RoutingModel::CloseVisitTypes</a></div><div class="ttdeci">void CloseVisitTypes()</div><div class="ttdoc">This function should be called once all node visit types have been set and prior to adding any incomp...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03654">routing.cc:3654</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a85555955bff836046b755e58e363f1a2"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a85555955bff836046b755e58e363f1a2">operations_research::RoutingModel::AssignmentToRoutes</a></div><div class="ttdeci">void AssignmentToRoutes(const Assignment &assignment, std::vector< std::vector< int64_t > > *const routes) const</div><div class="ttdoc">Converts the solution in the given assignment to routes for all vehicles.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03357">routing.cc:3357</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a855597cfbfe217d469f87488444bb0cd"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a855597cfbfe217d469f87488444bb0cd">operations_research::RoutingModel::AddDisjunction</a></div><div class="ttdeci">DisjunctionIndex AddDisjunction(const std::vector< int64_t > &indices, int64_t penalty=kNoPenalty, int64_t max_cardinality=1)</div><div class="ttdoc">Adds a disjunction constraint on the indices: exactly 'max_cardinality' of the indices are active.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01721">routing.cc:1721</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a88c2b51c968a004484673a6869c1f39d"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a88c2b51c968a004484673a6869c1f39d">operations_research::RoutingModel::GetDimensions</a></div><div class="ttdeci">const std::vector< RoutingDimension * > & GetDimensions() const</div><div class="ttdoc">Returns all dimensions of the model.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00626">routing.h:626</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a8b9a513f402e84f4c71436cf430f248a"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a8b9a513f402e84f4c71436cf430f248a">operations_research::RoutingModel::IgnoreDisjunctionsAlreadyForcedToZero</a></div><div class="ttdeci">void IgnoreDisjunctionsAlreadyForcedToZero()</div><div class="ttdoc">SPECIAL: Makes the solver ignore all the disjunctions whose active variables are all trivially zero (...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01755">routing.cc:1755</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a8bd5bf6b0d1d0c1c5e2470c5f4882a62"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a8bd5bf6b0d1d0c1c5e2470c5f4882a62">operations_research::RoutingModel::SetPickupAndDeliveryPolicyOfVehicle</a></div><div class="ttdeci">void SetPickupAndDeliveryPolicyOfVehicle(PickupAndDeliveryPolicy policy, int vehicle)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01868">routing.cc:1868</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a8c5267a8f35e062c163b61bcae31857b"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a8c5267a8f35e062c163b61bcae31857b">operations_research::RoutingModel::SolveWithParameters</a></div><div class="ttdeci">const Assignment * SolveWithParameters(const RoutingSearchParameters &search_parameters, std::vector< const Assignment * > *solutions=nullptr)</div><div class="ttdoc">Solves the current routing model with the given parameters.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l02660">routing.cc:2660</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a8c58bbbfc090a581f02d76fabf465b3e"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a8c58bbbfc090a581f02d76fabf465b3e">operations_research::RoutingModel::RegisterTransitCallback</a></div><div class="ttdeci">int RegisterTransitCallback(TransitCallback2 callback)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l00882">routing.cc:882</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a8fc98154baec00fd3be88c9d6a0234dc"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a8fc98154baec00fd3be88c9d6a0234dc">operations_research::RoutingModel::AddVariableTargetToFinalizer</a></div><div class="ttdeci">void AddVariableTargetToFinalizer(IntVar *var, int64_t target)</div><div class="ttdoc">Add a variable to set the closest possible to the target value in the solution finalizer.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l05152">routing.cc:5152</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a903045a090a5c25dfd55fafeec7678ca"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a903045a090a5c25dfd55fafeec7678ca">operations_research::RoutingModel::StateDependentTransitCallback</a></div><div class="ttdeci">const VariableIndexEvaluator2 & StateDependentTransitCallback(int callback_index) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00488">routing.h:488</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a90c35f02b0901acc9822020297e313e7"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a90c35f02b0901acc9822020297e313e7">operations_research::RoutingModel::PackCumulsOfOptimizerDimensionsFromAssignment</a></div><div class="ttdeci">const Assignment * PackCumulsOfOptimizerDimensionsFromAssignment(const Assignment *original_assignment, absl::Duration duration_limit)</div><div class="ttdoc">For every dimension in the model with an optimizer in local/global_dimension_optimizers_,...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l00444">routing.cc:444</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a911482cb7495f22638a02066adf13c8b"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a911482cb7495f22638a02066adf13c8b">operations_research::RoutingModel::Nexts</a></div><div class="ttdeci">const std::vector< IntVar * > & Nexts() const</div><div class="ttdoc">Returns all next variables of the model, such that Nexts(i) is the next variable of the node correspo...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01297">routing.h:1297</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a9148b93be3892d950af000a9b379940e"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a9148b93be3892d950af000a9b379940e">operations_research::RoutingModel::GetDisjunctionIndices</a></div><div class="ttdeci">const std::vector< DisjunctionIndex > & GetDisjunctionIndices(int64_t index) const</div><div class="ttdoc">Returns the indices of the disjunctions to which an index belongs.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00719">routing.h:719</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a9285d707cc3302c913f5c88697743947"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a9285d707cc3302c913f5c88697743947">operations_research::RoutingModel::UnperformedPenaltyOrValue</a></div><div class="ttdeci">int64_t UnperformedPenaltyOrValue(int64_t default_value, int64_t var_index) const</div><div class="ttdoc">Same as above except that it returns default_value instead of 0 when penalty is not well defined (def...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03788">routing.cc:3788</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a966f3010581e2a82e0b1e550667d8bce"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a966f3010581e2a82e0b1e550667d8bce">operations_research::RoutingModel::DimensionIndex</a></div><div class="ttdeci">RoutingDimensionIndex DimensionIndex</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00235">routing.h:235</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a9a9f45350da93a613c6226f7d09d4353"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a9a9f45350da93a613c6226f7d09d4353">operations_research::RoutingModel::CompactAndCheckAssignment</a></div><div class="ttdeci">Assignment * CompactAndCheckAssignment(const Assignment &assignment) const</div><div class="ttdoc">Same as CompactAssignment() but also checks the validity of the final compact solution; if it is not ...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03062">routing.cc:3062</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a9b9a92ffb451f19ec773b0543b3f2497"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a9b9a92ffb451f19ec773b0543b3f2497">operations_research::RoutingModel::GetMutableLocalCumulMPOptimizer</a></div><div class="ttdeci">LocalDimensionCumulOptimizer * GetMutableLocalCumulMPOptimizer(const RoutingDimension &dimension) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01234">routing.cc:1234</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_a9c58894df747f5498c335a3a8c5c0c88"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#a9c58894df747f5498c335a3a8c5c0c88">operations_research::RoutingModel::HasHardTypeIncompatibilities</a></div><div class="ttdeci">bool HasHardTypeIncompatibilities() const</div><div class="ttdoc">Returns true iff any hard (resp.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00910">routing.h:910</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aa11b7e0480c2cfed29972adef0d3fa74"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aa11b7e0480c2cfed29972adef0d3fa74">operations_research::RoutingModel::AddRequiredTypeAlternativesWhenRemovingType</a></div><div class="ttdeci">void AddRequiredTypeAlternativesWhenRemovingType(int dependent_type, absl::flat_hash_set< int > required_type_alternatives)</div><div class="ttdoc">The following requirements apply when visiting dependent nodes that remove their type from the route,...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03740">routing.cc:3740</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aa12303c2dedbd81a69f237f67fa784c5"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aa12303c2dedbd81a69f237f67fa784c5">operations_research::RoutingModel::GetRoutesFromAssignment</a></div><div class="ttdeci">std::vector< std::vector< int64_t > > GetRoutesFromAssignment(const Assignment &assignment)</div><div class="ttdoc">Converts the solution in the given assignment to routes for all vehicles.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03391">routing.cc:3391</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aa1e8634ca9564e23a832de7479ba34ba"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aa1e8634ca9564e23a832de7479ba34ba">operations_research::RoutingModel::Next</a></div><div class="ttdeci">int64_t Next(const Assignment &assignment, int64_t index) const</div><div class="ttdoc">Assignment inspection Returns the variable index of the node directly after the node corresponding to...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03466">routing.cc:3466</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aa3a9b4b73781a66cf0095c3d29af87c7"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aa3a9b4b73781a66cf0095c3d29af87c7">operations_research::RoutingModel::SetAmortizedCostFactorsOfAllVehicles</a></div><div class="ttdeci">void SetAmortizedCostFactorsOfAllVehicles(int64_t linear_cost_factor, int64_t quadratic_cost_factor)</div><div class="ttdoc">The following methods set the linear and quadratic cost factors of vehicles (must be positive values)...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01367">routing.cc:1367</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aa540a1068aef75c041330a2eafccd623"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aa540a1068aef75c041330a2eafccd623">operations_research::RoutingModel::RegisterPositiveTransitCallback</a></div><div class="ttdeci">int RegisterPositiveTransitCallback(TransitCallback2 callback)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l00908">routing.cc:908</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aa5cff2ee7fbe3a9c5c701bfba7460c83"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83">operations_research::RoutingModel::PickupAndDeliveryPolicy</a></div><div class="ttdeci">PickupAndDeliveryPolicy</div><div class="ttdoc">Types of precedence policy applied to pickup and delivery pairs.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00226">routing.h:226</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aa5cff2ee7fbe3a9c5c701bfba7460c83a272376ed085de7d28d36fa1013394cc8"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83a272376ed085de7d28d36fa1013394cc8">operations_research::RoutingModel::PICKUP_AND_DELIVERY_LIFO</a></div><div class="ttdeci">@ PICKUP_AND_DELIVERY_LIFO</div><div class="ttdoc">Deliveries must be performed in reverse order of pickups.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00230">routing.h:230</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aa5cff2ee7fbe3a9c5c701bfba7460c83a2fecd02405f5ff0769292822ad17a955"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83a2fecd02405f5ff0769292822ad17a955">operations_research::RoutingModel::PICKUP_AND_DELIVERY_NO_ORDER</a></div><div class="ttdeci">@ PICKUP_AND_DELIVERY_NO_ORDER</div><div class="ttdoc">Any precedence is accepted.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00228">routing.h:228</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aa5cff2ee7fbe3a9c5c701bfba7460c83a5c55a9aa52a754be8eb1b9d29af97a8a"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aa5cff2ee7fbe3a9c5c701bfba7460c83a5c55a9aa52a754be8eb1b9d29af97a8a">operations_research::RoutingModel::PICKUP_AND_DELIVERY_FIFO</a></div><div class="ttdeci">@ PICKUP_AND_DELIVERY_FIFO</div><div class="ttdoc">Deliveries must be performed in the same order as pickups.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00233">routing.h:232</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aa650ea2c539fab98337ae2f6ca553f3d"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aa650ea2c539fab98337ae2f6ca553f3d">operations_research::RoutingModel::Start</a></div><div class="ttdeci">int64_t Start(int vehicle) const</div><div class="ttdoc">Model inspection.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01277">routing.h:1277</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aa79f8d482de4dd0ef86a1b54999686af"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aa79f8d482de4dd0ef86a1b54999686af">operations_research::RoutingModel::CloseModelWithParameters</a></div><div class="ttdeci">void CloseModelWithParameters(const RoutingSearchParameters &search_parameters)</div><div class="ttdoc">Same as above taking search parameters (as of 10/2015 some the parameters have to be set when closing...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l02215">routing.cc:2215</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aa9e7ba89833775f29889744fe9480d29"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aa9e7ba89833775f29889744fe9480d29">operations_research::RoutingModel::vehicles</a></div><div class="ttdeci">int vehicles() const</div><div class="ttdoc">Returns the number of vehicle routes in the model.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01458">routing.h:1458</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aaa20e609421302541206a667e0c71f36"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aaa20e609421302541206a667e0c71f36">operations_research::RoutingModel::SetAllowedVehiclesForIndex</a></div><div class="ttdeci">void SetAllowedVehiclesForIndex(const std::vector< int > &vehicles, int64_t index)</div><div class="ttdoc">Sets the vehicles which can visit a given node.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01809">routing.cc:1809</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aabdcf3bd412a5a61d811ef85e115e5ff"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aabdcf3bd412a5a61d811ef85e115e5ff">operations_research::RoutingModel::AddVariableMaximizedByFinalizer</a></div><div class="ttdeci">void AddVariableMaximizedByFinalizer(IntVar *var)</div><div class="ttdoc">Adds a variable to maximize in the solution finalizer (see above for information on the solution fina...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l05159">routing.cc:5159</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aae1975baf3d895a6503de44d872ecb1e"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aae1975baf3d895a6503de44d872ecb1e">operations_research::RoutingModel::UnperformedPenalty</a></div><div class="ttdeci">int64_t UnperformedPenalty(int64_t var_index) const</div><div class="ttdoc">Get the "unperformed" penalty of a node.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03784">routing.cc:3784</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aaf77a22f4aad202b26d26415f2ad51c7"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aaf77a22f4aad202b26d26415f2ad51c7">operations_research::RoutingModel::SetAmortizedCostFactorsOfVehicle</a></div><div class="ttdeci">void SetAmortizedCostFactorsOfVehicle(int64_t linear_cost_factor, int64_t quadratic_cost_factor, int vehicle)</div><div class="ttdoc">Sets the linear and quadratic cost factor of the given vehicle.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01375">routing.cc:1375</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ab1d54f34a26afd08eeef25e8725dd7c2"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ab1d54f34a26afd08eeef25e8725dd7c2">operations_research::RoutingModel::ActiveVar</a></div><div class="ttdeci">IntVar * ActiveVar(int64_t index) const</div><div class="ttdoc">Returns the active variable of the node corresponding to index.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01306">routing.h:1306</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ab207970f71285b3169cbb67aa4fb04f8"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ab207970f71285b3169cbb67aa4fb04f8">operations_research::RoutingModel::GetNumberOfDecisionsInFirstSolution</a></div><div class="ttdeci">int64_t GetNumberOfDecisionsInFirstSolution(const RoutingSearchParameters &search_parameters) const</div><div class="ttdoc">Returns statistics on first solution search, number of decisions sent to filters, number of decisions...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03175">routing.cc:3175</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ab313d84a56c5e9b1b8f28da70b8d4045"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ab313d84a56c5e9b1b8f28da70b8d4045">operations_research::RoutingModel::HasTypeRegulations</a></div><div class="ttdeci">bool HasTypeRegulations() const</div><div class="ttdoc">Returns true iff the model has any incompatibilities or requirements set on node types.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00964">routing.h:964</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ab6aae3927f3537c446ac33f2c6ecb922"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ab6aae3927f3537c446ac33f2c6ecb922">operations_research::RoutingModel::VehicleClassIndex</a></div><div class="ttdeci">RoutingVehicleClassIndex VehicleClassIndex</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00237">routing.h:237</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ab81fff41f3dde630902e1c4e2f534732"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ab81fff41f3dde630902e1c4e2f534732">operations_research::RoutingModel::AddWeightedVariableMinimizedByFinalizer</a></div><div class="ttdeci">void AddWeightedVariableMinimizedByFinalizer(IntVar *var, int64_t cost)</div><div class="ttdoc">Adds a variable to minimize in the solution finalizer, with a weighted priority: the higher the more ...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l05139">routing.cc:5139</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ab878a81ace850e3ecd26e95966409f61"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ab878a81ace850e3ecd26e95966409f61">operations_research::RoutingModel::AddIntervalToAssignment</a></div><div class="ttdeci">void AddIntervalToAssignment(IntervalVar *const interval)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l05177">routing.cc:5177</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ab8d61705aa4291d2cd437ba0a7dfccbf"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ab8d61705aa4291d2cd437ba0a7dfccbf">operations_research::RoutingModel::SetArcCostEvaluatorOfAllVehicles</a></div><div class="ttdeci">void SetArcCostEvaluatorOfAllVehicles(int evaluator_index)</div><div class="ttdoc">Sets the cost function of the model such that the cost of a segment of a route between node 'from' an...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01336">routing.cc:1336</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ab9242d96967ff3b4e5bec3241831552b"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ab9242d96967ff3b4e5bec3241831552b">operations_research::RoutingModel::ApplyLocksToAllVehicles</a></div><div class="ttdeci">bool ApplyLocksToAllVehicles(const std::vector< std::vector< int64_t > > &locks, bool close_routes)</div><div class="ttdoc">Applies lock chains to all vehicles to the next search, such that locks[p] is the lock chain for rout...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03169">routing.cc:3169</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aba04bfb310dabb1357ebabd3163350c9"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aba04bfb310dabb1357ebabd3163350c9">operations_research::RoutingModel::GetPerfectBinaryDisjunctions</a></div><div class="ttdeci">std::vector< std::pair< int64_t, int64_t > > GetPerfectBinaryDisjunctions() const</div><div class="ttdoc">Returns the list of all perfect binary disjunctions, as pairs of variable indices: a disjunction is "...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01738">routing.cc:1738</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aba73f2fc54b941bd9233d07cf86b9feb"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aba73f2fc54b941bd9233d07cf86b9feb">operations_research::RoutingModel::VariableIndexEvaluator2</a></div><div class="ttdeci">std::function< StateDependentTransit(int64_t, int64_t)> VariableIndexEvaluator2</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00265">routing.h:265</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_abac1ff6e7eaa5e1ec6e86e726cce3d90"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#abac1ff6e7eaa5e1ec6e86e726cce3d90">operations_research::RoutingModel::GetMutableGlobalCumulOptimizer</a></div><div class="ttdeci">GlobalDimensionCumulOptimizer * GetMutableGlobalCumulOptimizer(const RoutingDimension &dimension) const</div><div class="ttdoc">Returns the global/local dimension cumul optimizer for a given dimension, or nullptr if there is none...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01198">routing.cc:1198</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_abb04114cc25bd55e364b79d9adccab91"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#abb04114cc25bd55e364b79d9adccab91">operations_research::RoutingModel::AddDimensionWithVehicleCapacity</a></div><div class="ttdeci">bool AddDimensionWithVehicleCapacity(int evaluator_index, int64_t slack_max, std::vector< int64_t > vehicle_capacities, bool fix_start_cumul_to_zero, const std::string &name)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l00958">routing.cc:958</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_abb61fc6939fecebe93387f63319d2b7f"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#abb61fc6939fecebe93387f63319d2b7f">operations_research::RoutingModel::CostVar</a></div><div class="ttdeci">IntVar * CostVar() const</div><div class="ttdoc">Returns the global cost variable which is being minimized.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01321">routing.h:1321</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_abc101a64a3c876dcdf1b7176d59bd2c9"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#abc101a64a3c876dcdf1b7176d59bd2c9">operations_research::RoutingModel::HasSameVehicleTypeRequirements</a></div><div class="ttdeci">bool HasSameVehicleTypeRequirements() const</div><div class="ttdoc">Returns true iff any same-route (resp.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00955">routing.h:955</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_abfa127093eb53ae531ccb1f4ada6cc8a"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#abfa127093eb53ae531ccb1f4ada6cc8a">operations_research::RoutingModel::GetArcCostForClass</a></div><div class="ttdeci">int64_t GetArcCostForClass(int64_t from_index, int64_t to_index, int64_t cost_class_index) const</div><div class="ttdoc">Returns the cost of the segment between two nodes for a given cost class.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03484">routing.cc:3484</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ac1a2ab630f6b13644ca6853c7893f413"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ac1a2ab630f6b13644ca6853c7893f413">operations_research::RoutingModel::SetAssignmentFromOtherModelAssignment</a></div><div class="ttdeci">void SetAssignmentFromOtherModelAssignment(Assignment *target_assignment, const RoutingModel *source_model, const Assignment *source_assignment)</div><div class="ttdoc">Given a "source_model" and its "source_assignment", resets "target_assignment" with the IntVar variab...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l02875">routing.cc:2875</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ac22e9cfd1fbf1b4af4f8a9be46ec88a1"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ac22e9cfd1fbf1b4af4f8a9be46ec88a1">operations_research::RoutingModel::AddSameVehicleRequiredTypeAlternatives</a></div><div class="ttdeci">void AddSameVehicleRequiredTypeAlternatives(int dependent_type, absl::flat_hash_set< int > required_type_alternatives)</div><div class="ttdoc">Requirements: NOTE: As of 2019-04, cycles in the requirement graph are not supported,...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03697">routing.cc:3697</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ac26167700ef3e2bf5e595e2150d1f895"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ac26167700ef3e2bf5e595e2150d1f895">operations_research::RoutingModel::GetHardTypeIncompatibilitiesOfType</a></div><div class="ttdeci">const absl::flat_hash_set< int > & GetHardTypeIncompatibilitiesOfType(int type) const</div><div class="ttdoc">Returns visit types incompatible with a given type.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03682">routing.cc:3682</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ac6d5e197d4c8db922db0b8e2a8b7074e"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ac6d5e197d4c8db922db0b8e2a8b7074e">operations_research::RoutingModel::GetPickupIndexPairs</a></div><div class="ttdeci">const std::vector< std::pair< int, int > > & GetPickupIndexPairs(int64_t node_index) const</div><div class="ttdoc">Returns pairs for which the node is a pickup; the first element of each pair is the index in the pick...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01856">routing.cc:1856</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ac8347e84488d1b5eb7b5e6972fb32be3"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ac8347e84488d1b5eb7b5e6972fb32be3">operations_research::RoutingModel::IsMatchingModel</a></div><div class="ttdeci">bool IsMatchingModel() const</div><div class="ttdoc">Returns true if a vehicle/node matching problem is detected.</div><div class="ttdef"><b>Definition:</b> <a href="routing__flow_8cc_source.html#l00055">routing_flow.cc:55</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ac8c094ea0f03a3c394140698e0ce7ffd"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ac8c094ea0f03a3c394140698e0ce7ffd">operations_research::RoutingModel::MakeStateDependentTransit</a></div><div class="ttdeci">static RoutingModel::StateDependentTransit MakeStateDependentTransit(const std::function< int64_t(int64_t)> &f, int64_t domain_start, int64_t domain_end)</div><div class="ttdoc">Creates a cached StateDependentTransit from an std::function.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01177">routing.cc:1177</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_acbab635c68d8a6e0961afae0f606590b"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#acbab635c68d8a6e0961afae0f606590b">operations_research::RoutingModel::RegisterUnaryTransitCallback</a></div><div class="ttdeci">int RegisterUnaryTransitCallback(TransitCallback1 callback)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l00847">routing.cc:847</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_acc939d4c1da0e5db1bb694eda1d95994"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#acc939d4c1da0e5db1bb694eda1d95994">operations_research::RoutingModel::GetNumberOfRejectsInFirstSolution</a></div><div class="ttdeci">int64_t GetNumberOfRejectsInFirstSolution(const RoutingSearchParameters &search_parameters) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03183">routing.cc:3183</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_acf67dc202e247ce193038850f71306d3"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#acf67dc202e247ce193038850f71306d3">operations_research::RoutingModel::IsEnd</a></div><div class="ttdeci">bool IsEnd(int64_t index) const</div><div class="ttdoc">Returns true if 'index' represents the last node of a route.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01283">routing.h:1283</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_acf6e2a1031a61467fff27d14cb937fde"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#acf6e2a1031a61467fff27d14cb937fde">operations_research::RoutingModel::AddDimensionWithVehicleTransits</a></div><div class="ttdeci">bool AddDimensionWithVehicleTransits(const std::vector< int > &evaluator_indices, int64_t slack_max, int64_t capacity, bool fix_start_cumul_to_zero, const std::string &name)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l00949">routing.cc:949</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_acfcef421e8c8cd243157543f741d6a73"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#acfcef421e8c8cd243157543f741d6a73">operations_research::RoutingModel::WriteAssignment</a></div><div class="ttdeci">bool WriteAssignment(const std::string &file_name) const</div><div class="ttdoc">Writes the current solution to a file containing an AssignmentProto.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03191">routing.cc:3191</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ad13ad202092298b43c9099b212c54d3d"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ad13ad202092298b43c9099b212c54d3d">operations_research::RoutingModel::CostClassIndex</a></div><div class="ttdeci">RoutingCostClassIndex CostClassIndex</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00234">routing.h:234</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ad19492313b68e5a963af3793aaec8d90"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ad19492313b68e5a963af3793aaec8d90">operations_research::RoutingModel::HasTemporalTypeIncompatibilities</a></div><div class="ttdeci">bool HasTemporalTypeIncompatibilities() const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00913">routing.h:913</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ad3b144985c2b4b24cf39b839dbd9c16d"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ad3b144985c2b4b24cf39b839dbd9c16d">operations_research::RoutingModel::GetCostClassesCount</a></div><div class="ttdeci">int GetCostClassesCount() const</div><div class="ttdoc">Returns the number of different cost classes in the model.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01366">routing.h:1366</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ad62f14646fa4da5b6836a2ae505706d2"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ad62f14646fa4da5b6836a2ae505706d2">operations_research::RoutingModel::GetNumOfSingletonNodes</a></div><div class="ttdeci">int GetNumOfSingletonNodes() const</div><div class="ttdoc">Returns the number of non-start/end nodes which do not appear in a pickup/delivery pair.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01888">routing.cc:1888</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ad7dbf1150b65fa6495a6cf4a6ab9dd3b"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ad7dbf1150b65fa6495a6cf4a6ab9dd3b">operations_research::RoutingModel::AddRequiredTypeAlternativesWhenAddingType</a></div><div class="ttdeci">void AddRequiredTypeAlternativesWhenAddingType(int dependent_type, absl::flat_hash_set< int > required_type_alternatives)</div><div class="ttdoc">If type_D depends on type_R when adding type_D, any node_D of type_D and VisitTypePolicy TYPE_ADDED_T...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03719">routing.cc:3719</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_adca8397d2ad8dfc3bcd2a768bf3e12a2"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#adca8397d2ad8dfc3bcd2a768bf3e12a2">operations_research::RoutingModel::~RoutingModel</a></div><div class="ttdeci">~RoutingModel()</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l00802">routing.cc:802</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_add1a60041c1f8ec87b492635be1c8704"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#add1a60041c1f8ec87b492635be1c8704">operations_research::RoutingModel::RegisterTransitMatrix</a></div><div class="ttdeci">int RegisterTransitMatrix(std::vector< std::vector< int64_t > > values)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l00855">routing.cc:855</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_add71470f4175a0859e6e3d69c2a53988"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#add71470f4175a0859e6e3d69c2a53988">operations_research::RoutingModel::CloseModel</a></div><div class="ttdeci">void CloseModel()</div><div class="ttdoc">Closes the current routing model; after this method is called, no modification to the model can be do...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l02037">routing.cc:2037</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ae00630e36d2d8a2fa7eb4743a65e80d1"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ae00630e36d2d8a2fa7eb4743a65e80d1">operations_research::RoutingModel::kNoDimension</a></div><div class="ttdeci">static const DimensionIndex kNoDimension</div><div class="ttdoc">Constant used to express the "no dimension" index, returned when a dimension name does not correspond...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00459">routing.h:459</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ae0c21c6d4e99cb309b8b298d280e4853"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ae0c21c6d4e99cb309b8b298d280e4853">operations_research::RoutingModel::CostsAreHomogeneousAcrossVehicles</a></div><div class="ttdeci">bool CostsAreHomogeneousAcrossVehicles() const</div><div class="ttdoc">Whether costs are homogeneous across all vehicles.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01328">routing.h:1328</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ae378d23c967e818f321bd4498b5c74f2"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ae378d23c967e818f321bd4498b5c74f2">operations_research::RoutingModel::GetCostClassIndexOfVehicle</a></div><div class="ttdeci">CostClassIndex GetCostClassIndexOfVehicle(int64_t vehicle) const</div><div class="ttdoc">Get the cost class index of the given vehicle.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01349">routing.h:1349</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ae3bb9f7055b5dabd24e2ea7c6a377a6a"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ae3bb9f7055b5dabd24e2ea7c6a377a6a">operations_research::RoutingModel::Solve</a></div><div class="ttdeci">const Assignment * Solve(const Assignment *assignment=nullptr)</div><div class="ttdoc">Solves the current routing model; closes the current model.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l02655">routing.cc:2655</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ae5a61ca8a5a897aa6c4ce5c466e8f45f"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ae5a61ca8a5a897aa6c4ce5c466e8f45f">operations_research::RoutingModel::kNoDisjunction</a></div><div class="ttdeci">static const DisjunctionIndex kNoDisjunction</div><div class="ttdoc">Constant used to express the "no disjunction" index, returned when a node does not appear in any disj...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00455">routing.h:455</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ae75b9e0c54aab66cffec86c67df3a1d8"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ae75b9e0c54aab66cffec86c67df3a1d8">operations_research::RoutingModel::SetFixedCostOfAllVehicles</a></div><div class="ttdeci">void SetFixedCostOfAllVehicles(int64_t cost)</div><div class="ttdoc">Sets the fixed cost of all vehicle routes.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01350">routing.cc:1350</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_ae75d9f49c157b7784fc8baa7d623ee35"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#ae75d9f49c157b7784fc8baa7d623ee35">operations_research::RoutingModel::SetArcCostEvaluatorOfVehicle</a></div><div class="ttdeci">void SetArcCostEvaluatorOfVehicle(int evaluator_index, int vehicle)</div><div class="ttdoc">Sets the cost function for a given vehicle route.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01343">routing.cc:1343</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aea90b377b2cc45917a08d519be784009"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aea90b377b2cc45917a08d519be784009">operations_research::RoutingModel::HasDimension</a></div><div class="ttdeci">bool HasDimension(const std::string &dimension_name) const</div><div class="ttdoc">Returns true if a dimension exists for a given dimension name.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01246">routing.cc:1246</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aeb6c785d9ebc792b3c6eda788a6dfdf0"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aeb6c785d9ebc792b3c6eda788a6dfdf0">operations_research::RoutingModel::GetVisitTypePolicy</a></div><div class="ttdeci">VisitTypePolicy GetVisitTypePolicy(int64_t index) const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03648">routing.cc:3648</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aedb8dca94b15e5465fef1667d1a81db6"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aedb8dca94b15e5465fef1667d1a81db6">operations_research::RoutingModel::IsVehicleUsed</a></div><div class="ttdeci">bool IsVehicleUsed(const Assignment &assignment, int vehicle) const</div><div class="ttdoc">Returns true if the route of 'vehicle' is non empty in 'assignment'.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l03456">routing.cc:3456</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_af0ef4b9ace61b0d3f366cf128bfae32d"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#af0ef4b9ace61b0d3f366cf128bfae32d">operations_research::RoutingModel::GetPrimaryConstrainedDimension</a></div><div class="ttdeci">const std::string & GetPrimaryConstrainedDimension() const</div><div class="ttdoc">Get the primary constrained dimension, or an empty string if it is unset.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00681">routing.h:681</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_af12674b693b7b7cfe271e5b066e10bff"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#af12674b693b7b7cfe271e5b066e10bff">operations_research::RoutingModel::RoutingModel</a></div><div class="ttdeci">RoutingModel(const RoutingIndexManager &index_manager)</div><div class="ttdoc">Constructor taking an index manager.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l00709">routing.cc:709</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_af607134ad28032b4e736467dfd11a466"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#af607134ad28032b4e736467dfd11a466">operations_research::RoutingModel::AddResourceGroup</a></div><div class="ttdeci">ResourceGroup *const AddResourceGroup()</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01308">routing.cc:1308</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_af6fa2d6d6bd7201d701efca7da040dd6"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#af6fa2d6d6bd7201d701efca7da040dd6">operations_research::RoutingModel::AddDimensionWithVehicleTransitAndCapacity</a></div><div class="ttdeci">bool AddDimensionWithVehicleTransitAndCapacity(const std::vector< int > &evaluator_indices, int64_t slack_max, std::vector< int64_t > vehicle_capacities, bool fix_start_cumul_to_zero, const std::string &name)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l00968">routing.cc:968</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_afa7cbbd4db2dd5d0bec3393efc9ebac1"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#afa7cbbd4db2dd5d0bec3393efc9ebac1">operations_research::RoutingModel::DisjunctionIndex</a></div><div class="ttdeci">RoutingDisjunctionIndex DisjunctionIndex</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00236">routing.h:236</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_afb80fd36c1fb57d2db049403483e2074"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#afb80fd36c1fb57d2db049403483e2074">operations_research::RoutingModel::End</a></div><div class="ttdeci">int64_t End(int vehicle) const</div><div class="ttdoc">Returns the variable index of the ending node of a vehicle route.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l01279">routing.h:1279</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_afe7b5ce21d69c0cf5e8469a73988b0df"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#afe7b5ce21d69c0cf5e8469a73988b0df">operations_research::RoutingModel::AddDimension</a></div><div class="ttdeci">bool AddDimension(int evaluator_index, int64_t slack_max, int64_t capacity, bool fix_start_cumul_to_zero, const std::string &name)</div><div class="ttdoc">Model creation.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l00939">routing.cc:939</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_aff7724c6a1de20cd5369108e3db5fc76"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#aff7724c6a1de20cd5369108e3db5fc76">operations_research::RoutingModel::GetDimensionOrDie</a></div><div class="ttdeci">const RoutingDimension & GetDimensionOrDie(const std::string &dimension_name) const</div><div class="ttdoc">Returns a dimension from its name. Dies if the dimension does not exist.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01256">routing.cc:1256</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_html_affd6cc6c76adff8e52220cff2c61635b"><div class="ttname"><a href="classoperations__research_1_1_routing_model.html#affd6cc6c76adff8e52220cff2c61635b">operations_research::RoutingModel::GetDisjunctionNodeIndices</a></div><div class="ttdeci">const std::vector< int64_t > & GetDisjunctionNodeIndices(DisjunctionIndex index) const</div><div class="ttdoc">Returns the variable indices of the nodes in the disjunction of index 'index'.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00740">routing.h:740</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_inspector_html"><div class="ttname"><a href="classoperations__research_1_1_routing_model_inspector.html">operations_research::RoutingModelInspector</a></div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l02041">routing.cc:2041</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_inspector_html_a0523ce908e2fa6b2958084a5b05a88c1"><div class="ttname"><a href="classoperations__research_1_1_routing_model_inspector.html#a0523ce908e2fa6b2958084a5b05a88c1">operations_research::RoutingModelInspector::RoutingModelInspector</a></div><div class="ttdeci">RoutingModelInspector(RoutingModel *model)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l02043">routing.cc:2043</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_inspector_html_a0c0d4fedf92e938f09d19b1b02015bea"><div class="ttname"><a href="classoperations__research_1_1_routing_model_inspector.html#a0c0d4fedf92e938f09d19b1b02015bea">operations_research::RoutingModelInspector::VisitIntegerArrayArgument</a></div><div class="ttdeci">void VisitIntegerArrayArgument(const std::string &arg_name, const std::vector< int64_t > &values) override</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l02080">routing.cc:2080</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_inspector_html_a8ed69e6d44dd4141c434a1784120382f"><div class="ttname"><a href="classoperations__research_1_1_routing_model_inspector.html#a8ed69e6d44dd4141c434a1784120382f">operations_research::RoutingModelInspector::EndVisitConstraint</a></div><div class="ttdeci">void EndVisitConstraint(const std::string &type_name, const Constraint *const constraint) override</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l02071">routing.cc:2071</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_inspector_html_a93b849189eca7118a5db04c2fe8aa901"><div class="ttname"><a href="classoperations__research_1_1_routing_model_inspector.html#a93b849189eca7118a5db04c2fe8aa901">operations_research::RoutingModelInspector::EndVisitModel</a></div><div class="ttdeci">void EndVisitModel(const std::string &solver_name) override</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l02059">routing.cc:2059</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_inspector_html_a98cecd8eead2c232b65629ea0abb43e5"><div class="ttname"><a href="classoperations__research_1_1_routing_model_inspector.html#a98cecd8eead2c232b65629ea0abb43e5">operations_research::RoutingModelInspector::~RoutingModelInspector</a></div><div class="ttdeci">~RoutingModelInspector() override</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l02058">routing.cc:2058</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_inspector_html_adee845e0e33b4eb085f916eb47246eaa"><div class="ttname"><a href="classoperations__research_1_1_routing_model_inspector.html#adee845e0e33b4eb085f916eb47246eaa">operations_research::RoutingModelInspector::VisitIntegerExpressionArgument</a></div><div class="ttdeci">void VisitIntegerExpressionArgument(const std::string &type_name, IntExpr *const expr) override</div><div class="ttdoc">Visit integer expression argument.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l02075">routing.cc:2075</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_parameters_html"><div class="ttname"><a href="classoperations__research_1_1_routing_model_parameters.html">operations_research::RoutingModelParameters</a></div><div class="ttdef"><b>Definition:</b> <a href="routing__parameters_8pb_8h_source.html#l01440">routing_parameters.pb.h:1441</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_visitor_html_a0ce138792ec79a561f17dd17b2c0610d"><div class="ttname"><a href="classoperations__research_1_1_routing_model_visitor.html#a0ce138792ec79a561f17dd17b2c0610d">operations_research::RoutingModelVisitor::kLightElement2</a></div><div class="ttdeci">static const char kLightElement2[]</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02073">routing.h:2073</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_visitor_html_a22cceffdff8afb41f5d2422ed014d4d0"><div class="ttname"><a href="classoperations__research_1_1_routing_model_visitor.html#a22cceffdff8afb41f5d2422ed014d4d0">operations_research::RoutingModelVisitor::kRemoveValues</a></div><div class="ttdeci">static const char kRemoveValues[]</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02074">routing.h:2074</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_model_visitor_html_a3408a1e02997042597b7499dad0cb343"><div class="ttname"><a href="classoperations__research_1_1_routing_model_visitor.html#a3408a1e02997042597b7499dad0cb343">operations_research::RoutingModelVisitor::kLightElement</a></div><div class="ttdeci">static const char kLightElement[]</div><div class="ttdoc">Constraint types.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02072">routing.h:2072</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_search_parameters_html"><div class="ttname"><a href="classoperations__research_1_1_routing_search_parameters.html">operations_research::RoutingSearchParameters</a></div><div class="ttdef"><b>Definition:</b> <a href="routing__parameters_8pb_8h_source.html#l00761">routing_parameters.pb.h:762</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_routing_search_parameters_html_a2a0fd7ce08b3bdbcffa69f132fb4b963"><div class="ttname"><a href="classoperations__research_1_1_routing_search_parameters.html#a2a0fd7ce08b3bdbcffa69f132fb4b963">operations_research::RoutingSearchParameters::number_of_solutions_to_collect</a></div><div class="ttdeci">::PROTOBUF_NAMESPACE_ID::int32 number_of_solutions_to_collect() const</div><div class="ttdef"><b>Definition:</b> <a href="routing__parameters_8pb_8h_source.html#l03114">routing_parameters.pb.h:3114</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_search_monitor_html"><div class="ttname"><a href="classoperations__research_1_1_search_monitor.html">operations_research::SearchMonitor</a></div><div class="ttdoc">A search monitor is a simple set of callbacks to monitor all search events.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03638">constraint_solver.h:3638</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solution_collector_html_a5aeabb40e6e7550c805534764b3076fa"><div class="ttname"><a href="classoperations__research_1_1_solution_collector.html#a5aeabb40e6e7550c805534764b3076fa">operations_research::SolutionCollector::solution_count</a></div><div class="ttdeci">int solution_count() const</div><div class="ttdoc">Returns how many solutions were stored during the search.</div><div class="ttdef"><b>Definition:</b> <a href="search_8cc_source.html#l02334">search.cc:2334</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solution_collector_html_a97be81e7520315f04f648537dd06bff5"><div class="ttname"><a href="classoperations__research_1_1_solution_collector.html#a97be81e7520315f04f648537dd06bff5">operations_research::SolutionCollector::solution</a></div><div class="ttdeci">Assignment * solution(int n) const</div><div class="ttdoc">Returns the nth solution.</div><div class="ttdef"><b>Definition:</b> <a href="search_8cc_source.html#l02329">search.cc:2329</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html"><div class="ttname"><a href="classoperations__research_1_1_solver.html">operations_research::Solver</a></div><div class="ttdoc">Solver Class.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00243">constraint_solver.h:243</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_a1c80076360afc597a0a4d815b1252cf6"><div class="ttname"><a href="classoperations__research_1_1_solver.html#a1c80076360afc597a0a4d815b1252cf6">operations_research::Solver::MakeSemiContinuousExpr</a></div><div class="ttdeci">IntExpr * MakeSemiContinuousExpr(IntExpr *const expr, int64_t fixed_charge, int64_t step)</div><div class="ttdoc">Semi continuous Expression (x <= 0 -> f(x) = 0; x > 0 -> f(x) = ax + b) a >= 0 and b >= 0.</div><div class="ttdef"><b>Definition:</b> <a href="expressions_8cc_source.html#l07169">expressions.cc:7169</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_a2085a8965de86fa4cf3aa76331331372"><div class="ttname"><a href="classoperations__research_1_1_solver.html#a2085a8965de86fa4cf3aa76331331372">operations_research::Solver::MakeEquality</a></div><div class="ttdeci">Constraint * MakeEquality(IntExpr *const left, IntExpr *const right)</div><div class="ttdoc">left == right</div><div class="ttdef"><b>Definition:</b> <a href="range__cst_8cc_source.html#l00512">range_cst.cc:512</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_a45c5a2dd0d47110ef5b00408854d8d84a26ee6f4132972f3880a16bf01faf5886"><div class="ttname"><a href="classoperations__research_1_1_solver.html#a45c5a2dd0d47110ef5b00408854d8d84a26ee6f4132972f3880a16bf01faf5886">operations_research::Solver::ASSIGN_MIN_VALUE</a></div><div class="ttdeci">@ ASSIGN_MIN_VALUE</div><div class="ttdoc">Selects the min value of the selected variable.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00353">constraint_solver.h:353</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_a55d833360c375d45a3c503437de9841c"><div class="ttname"><a href="classoperations__research_1_1_solver.html#a55d833360c375d45a3c503437de9841c">operations_research::Solver::IndexEvaluator2</a></div><div class="ttdeci">std::function< int64_t(int64_t, int64_t)> IndexEvaluator2</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00734">constraint_solver.h:734</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_a5931080c9bfda8dedfef0e3adf313ab3"><div class="ttname"><a href="classoperations__research_1_1_solver.html#a5931080c9bfda8dedfef0e3adf313ab3">operations_research::Solver::AddConstraint</a></div><div class="ttdeci">void AddConstraint(Constraint *const c)</div><div class="ttdoc">Adds the constraint 'c' to the model.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8cc_source.html#l01662">constraint_solver.cc:1662</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_a6fc60ae040ae35c83f09736d2e682a18a935985d0022c026978eace7ff7cd5f7a"><div class="ttname"><a href="classoperations__research_1_1_solver.html#a6fc60ae040ae35c83f09736d2e682a18a935985d0022c026978eace7ff7cd5f7a">operations_research::Solver::FULLPATHLNS</a></div><div class="ttdeci">@ FULLPATHLNS</div><div class="ttdoc">Operator which relaxes one entire path and all inactive nodes, thus defining num_paths neighbors.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00528">constraint_solver.h:528</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_a6fc60ae040ae35c83f09736d2e682a18a9bbd3bcce8e7d9e4a6901cce828e8704"><div class="ttname"><a href="classoperations__research_1_1_solver.html#a6fc60ae040ae35c83f09736d2e682a18a9bbd3bcce8e7d9e4a6901cce828e8704">operations_research::Solver::OROPT</a></div><div class="ttdeci">@ OROPT</div><div class="ttdoc">Relocate: OROPT and RELOCATE.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00450">constraint_solver.h:450</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_a6fc60ae040ae35c83f09736d2e682a18a9ea125a691a8fb716dc09ac09db7c4f3"><div class="ttname"><a href="classoperations__research_1_1_solver.html#a6fc60ae040ae35c83f09736d2e682a18a9ea125a691a8fb716dc09ac09db7c4f3">operations_research::Solver::PATHLNS</a></div><div class="ttdeci">@ PATHLNS</div><div class="ttdoc">Operator which relaxes two sub-chains of three consecutive arcs each.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00524">constraint_solver.h:524</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_a6fc60ae040ae35c83f09736d2e682a18a9fe88872d52e4a1fead358f9f6b57408"><div class="ttname"><a href="classoperations__research_1_1_solver.html#a6fc60ae040ae35c83f09736d2e682a18a9fe88872d52e4a1fead358f9f6b57408">operations_research::Solver::UNACTIVELNS</a></div><div class="ttdeci">@ UNACTIVELNS</div><div class="ttdoc">Operator which relaxes all inactive nodes and one sub-chain of six consecutive arcs.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00533">constraint_solver.h:533</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_a88b9877d88ea2cf4d4b4b5bfc2916110"><div class="ttname"><a href="classoperations__research_1_1_solver.html#a88b9877d88ea2cf4d4b4b5bfc2916110">operations_research::Solver::MakeElement</a></div><div class="ttdeci">IntExpr * MakeElement(const std::vector< int64_t > &values, IntVar *const index)</div><div class="ttdoc">values[index]</div><div class="ttdef"><b>Definition:</b> <a href="element_8cc_source.html#l00657">element.cc:657</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_a8b1044e7c2b76345532f848a982a7106a3850e163a7085a9d2cf0109439baaff1"><div class="ttname"><a href="classoperations__research_1_1_solver.html#a8b1044e7c2b76345532f848a982a7106a3850e163a7085a9d2cf0109439baaff1">operations_research::Solver::CHOOSE_STATIC_GLOBAL_BEST</a></div><div class="ttdeci">@ CHOOSE_STATIC_GLOBAL_BEST</div><div class="ttdoc">Pairs are compared at the first call of the selector, and results are cached.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00390">constraint_solver.h:390</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_a934e08f84e590e48ab860fcd97ca7130"><div class="ttname"><a href="classoperations__research_1_1_solver.html#a934e08f84e590e48ab860fcd97ca7130">operations_research::Solver::MakeMax</a></div><div class="ttdeci">IntExpr * MakeMax(const std::vector< IntVar * > &vars)</div><div class="ttdoc">std::max(vars)</div><div class="ttdef"><b>Definition:</b> <a href="expr__array_8cc_source.html#l03344">expr_array.cc:3344</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_a988e122844528e222326bd327a5d60fd"><div class="ttname"><a href="classoperations__research_1_1_solver.html#a988e122844528e222326bd327a5d60fd">operations_research::Solver::MakeDifference</a></div><div class="ttdeci">IntExpr * MakeDifference(IntExpr *const left, IntExpr *const right)</div><div class="ttdoc">left - right</div><div class="ttdef"><b>Definition:</b> <a href="expressions_8cc_source.html#l06667">expressions.cc:6667</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_aaa825d53a4aec98b8e8d5694b99a0c33"><div class="ttname"><a href="classoperations__research_1_1_solver.html#aaa825d53a4aec98b8e8d5694b99a0c33">operations_research::Solver::DefaultSolverParameters</a></div><div class="ttdeci">static ConstraintSolverParameters DefaultSolverParameters()</div><div class="ttdoc">Create a ConstraintSolverParameters proto with all the default values.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8cc_source.html#l00121">constraint_solver.cc:121</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_ab7ab23bc58ea40dc03a5418ddbce7601a1a148a0aaaad7f56eea42df9876e7ae9"><div class="ttname"><a href="classoperations__research_1_1_solver.html#ab7ab23bc58ea40dc03a5418ddbce7601a1a148a0aaaad7f56eea42df9876e7ae9">operations_research::Solver::CHOOSE_FIRST_UNBOUND</a></div><div class="ttdeci">@ CHOOSE_FIRST_UNBOUND</div><div class="ttdoc">Select the first unbound variable.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00274">constraint_solver.h:274</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_ab7ab23bc58ea40dc03a5418ddbce7601a1e36b06cc28522f212507ecaac29797d"><div class="ttname"><a href="classoperations__research_1_1_solver.html#ab7ab23bc58ea40dc03a5418ddbce7601a1e36b06cc28522f212507ecaac29797d">operations_research::Solver::CHOOSE_PATH</a></div><div class="ttdeci">@ CHOOSE_PATH</div><div class="ttdoc">Selects the next unbound variable on a path, the path being defined by the variables: var[i] correspo...</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00339">constraint_solver.h:339</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_ac957f0efc6de9135512f60f80ba36083"><div class="ttname"><a href="classoperations__research_1_1_solver.html#ac957f0efc6de9135512f60f80ba36083">operations_research::Solver::MakeSum</a></div><div class="ttdeci">IntExpr * MakeSum(IntExpr *const left, IntExpr *const right)</div><div class="ttdoc">left + right.</div><div class="ttdef"><b>Definition:</b> <a href="expressions_8cc_source.html#l06564">expressions.cc:6564</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_ae37d3a68746841403f335654370e8560"><div class="ttname"><a href="classoperations__research_1_1_solver.html#ae37d3a68746841403f335654370e8560">operations_research::Solver::IndexEvaluator1</a></div><div class="ttdeci">std::function< int64_t(int64_t)> IndexEvaluator1</div><div class="ttdoc">Callback typedefs.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00733">constraint_solver.h:733</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_ae88d696e499f29968ad16dcf587fff50"><div class="ttname"><a href="classoperations__research_1_1_solver.html#ae88d696e499f29968ad16dcf587fff50">operations_research::Solver::MakeProd</a></div><div class="ttdeci">IntExpr * MakeProd(IntExpr *const left, IntExpr *const right)</div><div class="ttdoc">left * right</div><div class="ttdef"><b>Definition:</b> <a href="expressions_8cc_source.html#l06869">expressions.cc:6869</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_aeb92d4addb41255c9732cacfcb54f795"><div class="ttname"><a href="classoperations__research_1_1_solver.html#aeb92d4addb41255c9732cacfcb54f795">operations_research::Solver::Fail</a></div><div class="ttdeci">void Fail()</div><div class="ttdoc">Abandon the current branch in the search tree. A backtrack will follow.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8cc_source.html#l02421">constraint_solver.cc:2421</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_af5502e2288132c081fc96fdbcee282e6"><div class="ttname"><a href="classoperations__research_1_1_solver.html#af5502e2288132c081fc96fdbcee282e6">operations_research::Solver::VariableValueComparator</a></div><div class="ttdeci">std::function< bool(int64_t, int64_t, int64_t)> VariableValueComparator</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00749">constraint_solver.h:749</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_af5a1f8b1ea0ab0796c8667b9e2ef0ce7"><div class="ttname"><a href="classoperations__research_1_1_solver.html#af5a1f8b1ea0ab0796c8667b9e2ef0ce7">operations_research::Solver::RevAlloc</a></div><div class="ttdeci">T * RevAlloc(T *object)</div><div class="ttdoc">Registers the given object as being reversible.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00789">constraint_solver.h:789</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_afd2868244e1a645aaf41eb8a6a6c8bf4"><div class="ttname"><a href="classoperations__research_1_1_solver.html#afd2868244e1a645aaf41eb8a6a6c8bf4">operations_research::Solver::EvaluatorLocalSearchOperators</a></div><div class="ttdeci">EvaluatorLocalSearchOperators</div><div class="ttdoc">This enum is used in Solver::MakeOperator associated with an evaluator to specify the neighborhood to...</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00562">constraint_solver.h:562</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_afd2868244e1a645aaf41eb8a6a6c8bf4a092684b466c2d8f6dffcc4fcc45a4c87"><div class="ttname"><a href="classoperations__research_1_1_solver.html#afd2868244e1a645aaf41eb8a6a6c8bf4a092684b466c2d8f6dffcc4fcc45a4c87">operations_research::Solver::TSPOPT</a></div><div class="ttdeci">@ TSPOPT</div><div class="ttdoc">Sliding TSP operator.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00575">constraint_solver.h:575</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_afd2868244e1a645aaf41eb8a6a6c8bf4a2e646463fe193258a090a50ba806fd6e"><div class="ttname"><a href="classoperations__research_1_1_solver.html#afd2868244e1a645aaf41eb8a6a6c8bf4a2e646463fe193258a090a50ba806fd6e">operations_research::Solver::LK</a></div><div class="ttdeci">@ LK</div><div class="ttdoc">Lin-Kernighan local search.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00567">constraint_solver.h:567</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_afd2868244e1a645aaf41eb8a6a6c8bf4af23b5d9059cb973667272b793cfd37b1"><div class="ttname"><a href="classoperations__research_1_1_solver.html#afd2868244e1a645aaf41eb8a6a6c8bf4af23b5d9059cb973667272b793cfd37b1">operations_research::Solver::TSPLNS</a></div><div class="ttdeci">@ TSPLNS</div><div class="ttdoc">TSP-base LNS.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00584">constraint_solver.h:583</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_solver_html_afd2d924f019d44bc99930a1e931a735fa662ed4b51721a45f07d645d4ca099a61"><div class="ttname"><a href="classoperations__research_1_1_solver.html#afd2d924f019d44bc99930a1e931a735fa662ed4b51721a45f07d645d4ca099a61">operations_research::Solver::LE</a></div><div class="ttdeci">@ LE</div><div class="ttdoc">Move is accepted when the current objective value <= objective.Max.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l00594">constraint_solver.h:594</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_sorted_disjoint_interval_list_html"><div class="ttname"><a href="classoperations__research_1_1_sorted_disjoint_interval_list.html">operations_research::SortedDisjointIntervalList</a></div><div class="ttdoc">This class represents a sorted list of disjoint, closed intervals.</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8h_source.html#l00470">sorted_interval_list.h:470</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_sorted_disjoint_interval_list_html_a40d32f4fefffabddc000b85ca140be07"><div class="ttname"><a href="classoperations__research_1_1_sorted_disjoint_interval_list.html#a40d32f4fefffabddc000b85ca140be07">operations_research::SortedDisjointIntervalList::InsertInterval</a></div><div class="ttdeci">Iterator InsertInterval(int64_t start, int64_t end)</div><div class="ttdoc">Adds the interval [start..end] to the list, and merges overlapping or immediately adjacent intervals ...</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8cc_source.html#l00632">sorted_interval_list.cc:632</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_sorted_disjoint_interval_list_html_a69b6e2a03c835ca5d658a1f16acbaa9c"><div class="ttname"><a href="classoperations__research_1_1_sorted_disjoint_interval_list.html#a69b6e2a03c835ca5d658a1f16acbaa9c">operations_research::SortedDisjointIntervalList::end</a></div><div class="ttdeci">ConstIterator end() const</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8h_source.html#l00565">sorted_interval_list.h:565</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_sorted_disjoint_interval_list_html_a815bbd9d71f04362c32528f444b2e5f4"><div class="ttname"><a href="classoperations__research_1_1_sorted_disjoint_interval_list.html#a815bbd9d71f04362c32528f444b2e5f4">operations_research::SortedDisjointIntervalList::FirstIntervalGreaterOrEqual</a></div><div class="ttdeci">Iterator FirstIntervalGreaterOrEqual(int64_t value) const</div><div class="ttdoc">Returns an iterator to either:</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8cc_source.html#l00757">sorted_interval_list.cc:757</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_sorted_disjoint_interval_list_html_a887fa442455fd18cac74b3039e442aeb"><div class="ttname"><a href="classoperations__research_1_1_sorted_disjoint_interval_list.html#a887fa442455fd18cac74b3039e442aeb">operations_research::SortedDisjointIntervalList::Iterator</a></div><div class="ttdeci">IntervalSet::iterator Iterator</div><div class="ttdef"><b>Definition:</b> <a href="sorted__interval__list_8h_source.html#l00478">sorted_interval_list.h:478</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_sweep_arranger_html"><div class="ttname"><a href="classoperations__research_1_1_sweep_arranger.html">operations_research::SweepArranger</a></div><div class="ttdoc">Class to arrange indices by by their distance and their angles from the depot.</div><div class="ttdef"><b>Definition:</b> <a href="routing__search_8h_source.html#l00990">routing_search.h:990</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_type_incompatibility_checker_html_a0e62f00f807fac1ac7e9d14e00fb8394"><div class="ttname"><a href="classoperations__research_1_1_type_incompatibility_checker.html#a0e62f00f807fac1ac7e9d14e00fb8394">operations_research::TypeIncompatibilityChecker::TypeIncompatibilityChecker</a></div><div class="ttdeci">TypeIncompatibilityChecker(const RoutingModel &model, bool check_hard_incompatibilities)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l05905">routing.cc:5905</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_type_regulations_checker_html"><div class="ttname"><a href="classoperations__research_1_1_type_regulations_checker.html">operations_research::TypeRegulationsChecker</a></div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02286">routing.h:2286</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_type_regulations_checker_html_a1698ad93b76ebfc58a0e1a2771e4b75c"><div class="ttname"><a href="classoperations__research_1_1_type_regulations_checker.html#a1698ad93b76ebfc58a0e1a2771e4b75c">operations_research::TypeRegulationsChecker::HasRegulationsToCheck</a></div><div class="ttdeci">virtual bool HasRegulationsToCheck() const =0</div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_type_regulations_checker_html_a4d6ef97994588af94176c027b321bcb6"><div class="ttname"><a href="classoperations__research_1_1_type_regulations_checker.html#a4d6ef97994588af94176c027b321bcb6">operations_research::TypeRegulationsChecker::CheckTypeRegulations</a></div><div class="ttdeci">virtual bool CheckTypeRegulations(int type, VisitTypePolicy policy, int pos)=0</div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_type_regulations_checker_html_a72ee439843f75a7dc189962f5561ad97"><div class="ttname"><a href="classoperations__research_1_1_type_regulations_checker.html#a72ee439843f75a7dc189962f5561ad97">operations_research::TypeRegulationsChecker::OnInitializeCheck</a></div><div class="ttdeci">virtual void OnInitializeCheck()</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02332">routing.h:2332</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_type_regulations_checker_html_a74fa9fd5626d4013ab5e2bc408c27f0e"><div class="ttname"><a href="classoperations__research_1_1_type_regulations_checker.html#a74fa9fd5626d4013ab5e2bc408c27f0e">operations_research::TypeRegulationsChecker::CheckVehicle</a></div><div class="ttdeci">bool CheckVehicle(int vehicle, const std::function< int64_t(int64_t)> &next_accessor)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l05823">routing.cc:5823</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_type_regulations_checker_html_a7745da6edcf25f61956a75b5bb3a7080"><div class="ttname"><a href="classoperations__research_1_1_type_regulations_checker.html#a7745da6edcf25f61956a75b5bb3a7080">operations_research::TypeRegulationsChecker::TypeRegulationsChecker</a></div><div class="ttdeci">TypeRegulationsChecker(const RoutingModel &model)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l05820">routing.cc:5820</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_type_regulations_checker_html_a7a699c6ed63d424d0c3c322eb7161ace"><div class="ttname"><a href="classoperations__research_1_1_type_regulations_checker.html#a7a699c6ed63d424d0c3c322eb7161ace">operations_research::TypeRegulationsChecker::FinalizeCheck</a></div><div class="ttdeci">virtual bool FinalizeCheck() const</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02336">routing.h:2336</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_type_regulations_checker_html_aab77529dea185cbc2341ac96b6be72ee"><div class="ttname"><a href="classoperations__research_1_1_type_regulations_checker.html#aab77529dea185cbc2341ac96b6be72ee">operations_research::TypeRegulationsChecker::InitializeCheck</a></div><div class="ttdeci">void InitializeCheck(int vehicle, const std::function< int64_t(int64_t)> &next_accessor)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l05867">routing.cc:5867</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_type_regulations_checker_html_ae8ea938d5980cf2079ded7ea1dcd38e7"><div class="ttname"><a href="classoperations__research_1_1_type_regulations_checker.html#ae8ea938d5980cf2079ded7ea1dcd38e7">operations_research::TypeRegulationsChecker::TypeCurrentlyOnRoute</a></div><div class="ttdeci">bool TypeCurrentlyOnRoute(int type, int pos) const</div><div class="ttdoc">Returns true iff there's at least one instance of the given type on the route when scanning the route...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l05898">routing.cc:5898</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_type_regulations_checker_html_aeb246ac61d4eadd6abf6dbdb6ce134f5"><div class="ttname"><a href="classoperations__research_1_1_type_regulations_checker.html#aeb246ac61d4eadd6abf6dbdb6ce134f5">operations_research::TypeRegulationsChecker::model_</a></div><div class="ttdeci">const RoutingModel & model_</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02338">routing.h:2338</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_type_regulations_checker_html_afcb22d4d3273e1f4153f851e1bddf417"><div class="ttname"><a href="classoperations__research_1_1_type_regulations_checker.html#afcb22d4d3273e1f4153f851e1bddf417">operations_research::TypeRegulationsChecker::TypeOccursOnRoute</a></div><div class="ttdeci">bool TypeOccursOnRoute(int type) const</div><div class="ttdoc">Returns true iff any occurrence of the given type was seen on the route, i.e.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l05892">routing.cc:5892</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_type_regulations_constraint_html"><div class="ttname"><a href="classoperations__research_1_1_type_regulations_constraint.html">operations_research::TypeRegulationsConstraint</a></div><div class="ttdoc">The following constraint ensures that incompatibilities and requirements between types are respected.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02426">routing.h:2426</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_type_regulations_constraint_html_a19d94d32f3bde30deeebb883c6f71f84"><div class="ttname"><a href="classoperations__research_1_1_type_regulations_constraint.html#a19d94d32f3bde30deeebb883c6f71f84">operations_research::TypeRegulationsConstraint::Post</a></div><div class="ttdeci">void Post() override</div><div class="ttdoc">This method is called when the constraint is processed by the solver.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06045">routing.cc:6045</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_type_regulations_constraint_html_a36d844f2722273b190ed9a069dd25938"><div class="ttname"><a href="classoperations__research_1_1_type_regulations_constraint.html#a36d844f2722273b190ed9a069dd25938">operations_research::TypeRegulationsConstraint::InitialPropagate</a></div><div class="ttdeci">void InitialPropagate() override</div><div class="ttdoc">This method performs the initial propagation of the constraint.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06060">routing.cc:6060</a></div></div>
|
|
<div class="ttc" id="aclassoperations__research_1_1_type_regulations_constraint_html_ac45256999b51546027c5f81897ee4b46"><div class="ttname"><a href="classoperations__research_1_1_type_regulations_constraint.html#ac45256999b51546027c5f81897ee4b46">operations_research::TypeRegulationsConstraint::TypeRegulationsConstraint</a></div><div class="ttdeci">TypeRegulationsConstraint(const RoutingModel &model)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l06012">routing.cc:6012</a></div></div>
|
|
<div class="ttc" id="aclassutil_1_1_base_graph_html_a8a40f2c75615a26ba71e94dd7d42f481"><div class="ttname"><a href="classutil_1_1_base_graph.html#a8a40f2c75615a26ba71e94dd7d42f481">util::BaseGraph::AllNodes</a></div><div class="ttdeci">IntegerRange< NodeIndex > AllNodes() const</div><div class="ttdef"><b>Definition:</b> <a href="graph_8h_source.html#l00936">graph.h:936</a></div></div>
|
|
<div class="ttc" id="aclassutil_1_1_reverse_arc_list_graph_html"><div class="ttname"><a href="classutil_1_1_reverse_arc_list_graph.html">util::ReverseArcListGraph</a></div><div class="ttdef"><b>Definition:</b> <a href="graph_8h_source.html#l00461">graph.h:462</a></div></div>
|
|
<div class="ttc" id="aconnected__components_8h_html"><div class="ttname"><a href="connected__components_8h.html">connected_components.h</a></div></div>
|
|
<div class="ttc" id="aconstraint__solver_2table_8cc_html_a9293e4d29cac928301645070dd307683"><div class="ttname"><a href="constraint__solver_2table_8cc.html#a9293e4d29cac928301645070dd307683">b</a></div><div class="ttdeci">int64_t b</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2table_8cc_source.html#l00047">constraint_solver/table.cc:47</a></div></div>
|
|
<div class="ttc" id="aconstraint__solver_2table_8cc_html_acb18315d548212835cd8ed4287e6c0b6"><div class="ttname"><a href="constraint__solver_2table_8cc.html#acb18315d548212835cd8ed4287e6c0b6">a</a></div><div class="ttdeci">int64_t a</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2table_8cc_source.html#l00046">constraint_solver/table.cc:46</a></div></div>
|
|
<div class="ttc" id="aconstraint__solver_8cc_html_a395f613555f398dd389670bb4c2a4599"><div class="ttname"><a href="constraint__solver_8cc.html#a395f613555f398dd389670bb4c2a4599">next</a></div><div class="ttdeci">Block * next</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8cc_source.html#l00677">constraint_solver.cc:677</a></div></div>
|
|
<div class="ttc" id="aconstraint__solver_8h_html"><div class="ttname"><a href="constraint__solver_8h.html">constraint_solver.h</a></div></div>
|
|
<div class="ttc" id="aconstraint__solveri_8h_html"><div class="ttname"><a href="constraint__solveri_8h.html">constraint_solveri.h</a></div></div>
|
|
<div class="ttc" id="acp__model__fz__solver_8cc_html_a10a1eab179b472c030bdc2a2efef7219"><div class="ttname"><a href="cp__model__fz__solver_8cc.html#a10a1eab179b472c030bdc2a2efef7219">parameters</a></div><div class="ttdeci">SatParameters parameters</div><div class="ttdef"><b>Definition:</b> <a href="cp__model__fz__solver_8cc_source.html#l00116">cp_model_fz_solver.cc:116</a></div></div>
|
|
<div class="ttc" id="adefault__search_8cc_html_ac673bc430bdc3fdaa09f7becf98ef267"><div class="ttname"><a href="default__search_8cc.html#ac673bc430bdc3fdaa09f7becf98ef267">name</a></div><div class="ttdeci">const std::string name</div><div class="ttdef"><b>Definition:</b> <a href="default__search_8cc_source.html#l00813">default_search.cc:813</a></div></div>
|
|
<div class="ttc" id="ademon__profiler_8cc_html_ac072af30c4ffbc834bb4c681f6ecb514"><div class="ttname"><a href="demon__profiler_8cc.html#ac072af30c4ffbc834bb4c681f6ecb514">value</a></div><div class="ttdeci">int64_t value</div><div class="ttdef"><b>Definition:</b> <a href="demon__profiler_8cc_source.html#l00044">demon_profiler.cc:44</a></div></div>
|
|
<div class="ttc" id="aebert__graph_8h_html"><div class="ttname"><a href="ebert__graph_8h.html">ebert_graph.h</a></div></div>
|
|
<div class="ttc" id="aelement_8cc_html_a2dac2393bef148b7c15723ef0770d558"><div class="ttname"><a href="element_8cc.html#a2dac2393bef148b7c15723ef0770d558">expr_</a></div><div class="ttdeci">IntVar *const expr_</div><div class="ttdef"><b>Definition:</b> <a href="element_8cc_source.html#l00087">element.cc:87</a></div></div>
|
|
<div class="ttc" id="aexpr__array_8cc_html_a472a99923cbe11ae7b5a5d157d9ad465"><div class="ttname"><a href="expr__array_8cc.html#a472a99923cbe11ae7b5a5d157d9ad465">var</a></div><div class="ttdeci">IntVar * var</div><div class="ttdef"><b>Definition:</b> <a href="expr__array_8cc_source.html#l01874">expr_array.cc:1874</a></div></div>
|
|
<div class="ttc" id="aexpressions_8cc_html_aae6e045630301833144e9075260cb2b9"><div class="ttname"><a href="expressions_8cc.html#aae6e045630301833144e9075260cb2b9">limit_</a></div><div class="ttdeci">const int64_t limit_</div><div class="ttdef"><b>Definition:</b> <a href="expressions_8cc_source.html#l05479">expressions.cc:5479</a></div></div>
|
|
<div class="ttc" id="agraph_8h_html"><div class="ttname"><a href="graph_8h.html">graph.h</a></div></div>
|
|
<div class="ttc" id="agscip__solver_8cc_html_a1ba5ca0f61f2fa13bd23bf0f89004f35"><div class="ttname"><a href="gscip__solver_8cc.html#a1ba5ca0f61f2fa13bd23bf0f89004f35">upper_bound</a></div><div class="ttdeci">double upper_bound</div><div class="ttdef"><b>Definition:</b> <a href="gscip__solver_8cc_source.html#l00126">gscip_solver.cc:126</a></div></div>
|
|
<div class="ttc" id="agscip__solver_8cc_html_a1e2f9a2352c1d9a6cada9544898fceec"><div class="ttname"><a href="gscip__solver_8cc.html#a1e2f9a2352c1d9a6cada9544898fceec">lower_bound</a></div><div class="ttdeci">double lower_bound</div><div class="ttdef"><b>Definition:</b> <a href="gscip__solver_8cc_source.html#l00125">gscip_solver.cc:125</a></div></div>
|
|
<div class="ttc" id="agurobi__interface_8cc_html_a0728f23c9a47655d38e0bf1a2f200bcf"><div class="ttname"><a href="gurobi__interface_8cc.html#a0728f23c9a47655d38e0bf1a2f200bcf">model</a></div><div class="ttdeci">GRBmodel * model</div><div class="ttdef"><b>Definition:</b> <a href="gurobi__interface_8cc_source.html#l00273">gurobi_interface.cc:273</a></div></div>
|
|
<div class="ttc" id="agurobi__interface_8cc_html_a6627a3800ac768bb5528ef54c9cace36"><div class="ttname"><a href="gurobi__interface_8cc.html#a6627a3800ac768bb5528ef54c9cace36">callback</a></div><div class="ttdeci">MPCallback * callback</div><div class="ttdef"><b>Definition:</b> <a href="gurobi__interface_8cc_source.html#l00514">gurobi_interface.cc:514</a></div></div>
|
|
<div class="ttc" id="aint__type_8h_html"><div class="ttname"><a href="int__type_8h.html">int_type.h</a></div></div>
|
|
<div class="ttc" id="aintegral__types_8h_html"><div class="ttname"><a href="integral__types_8h.html">integral_types.h</a></div></div>
|
|
<div class="ttc" id="alinear__assignment_8h_html"><div class="ttname"><a href="linear__assignment_8h.html">linear_assignment.h</a></div></div>
|
|
<div class="ttc" id="alog__severity_8h_html_a50e5762f38854b37ee3e2851bc1bb0e7"><div class="ttname"><a href="log__severity_8h.html#a50e5762f38854b37ee3e2851bc1bb0e7">WARNING</a></div><div class="ttdeci">const int WARNING</div><div class="ttdef"><b>Definition:</b> <a href="log__severity_8h_source.html#l00031">log_severity.h:31</a></div></div>
|
|
<div class="ttc" id="alog__severity_8h_html_ab4a2cbab234914b320b7fae11b6e8cb9"><div class="ttname"><a href="log__severity_8h.html#ab4a2cbab234914b320b7fae11b6e8cb9">INFO</a></div><div class="ttdeci">const int INFO</div><div class="ttdef"><b>Definition:</b> <a href="log__severity_8h_source.html#l00031">log_severity.h:31</a></div></div>
|
|
<div class="ttc" id="alog__severity_8h_html_ac9bcbe19995a8140cd4ec61773cd6e67"><div class="ttname"><a href="log__severity_8h.html#ac9bcbe19995a8140cd4ec61773cd6e67">ERROR</a></div><div class="ttdeci">const int ERROR</div><div class="ttdef"><b>Definition:</b> <a href="log__severity_8h_source.html#l00032">log_severity.h:32</a></div></div>
|
|
<div class="ttc" id="amap__util_8h_html"><div class="ttname"><a href="map__util_8h.html">map_util.h</a></div></div>
|
|
<div class="ttc" id="amathutil_8h_html"><div class="ttname"><a href="mathutil_8h.html">mathutil.h</a></div></div>
|
|
<div class="ttc" id="anamespaceabsl_html"><div class="ttname"><a href="namespaceabsl.html">absl</a></div><div class="ttdef"><b>Definition:</b> <a href="cleanup_8h_source.html#l00022">cleanup.h:22</a></div></div>
|
|
<div class="ttc" id="anamespacegtl_html_a4ee3db0c4acaa0f277a0d7006f5ad1e6"><div class="ttname"><a href="namespacegtl.html#a4ee3db0c4acaa0f277a0d7006f5ad1e6">gtl::STLDeleteElements</a></div><div class="ttdeci">void STLDeleteElements(T *container)</div><div class="ttdef"><b>Definition:</b> <a href="stl__util_8h_source.html#l00372">stl_util.h:372</a></div></div>
|
|
<div class="ttc" id="anamespacegtl_html_a523b266127b26ec3817cae4c5f41c391"><div class="ttname"><a href="namespacegtl.html#a523b266127b26ec3817cae4c5f41c391">gtl::LookupOrInsert</a></div><div class="ttdeci">Collection::value_type::second_type & LookupOrInsert(Collection *const collection, const typename Collection::value_type::first_type &key, const typename Collection::value_type::second_type &value)</div><div class="ttdef"><b>Definition:</b> <a href="map__util_8h_source.html#l00237">map_util.h:237</a></div></div>
|
|
<div class="ttc" id="anamespacegtl_html_a6a4238d2e35cf819a8e83d60d331ea64"><div class="ttname"><a href="namespacegtl.html#a6a4238d2e35cf819a8e83d60d331ea64">gtl::FindCopy</a></div><div class="ttdeci">bool FindCopy(const Collection &collection, const Key &key, Value *const value)</div><div class="ttdef"><b>Definition:</b> <a href="map__util_8h_source.html#l00185">map_util.h:185</a></div></div>
|
|
<div class="ttc" id="anamespacegtl_html_a73f41ac11336b94768fdd41594153d59"><div class="ttname"><a href="namespacegtl.html#a73f41ac11336b94768fdd41594153d59">gtl::FindOrDie</a></div><div class="ttdeci">const Collection::value_type::second_type & FindOrDie(const Collection &collection, const typename Collection::value_type::first_type &key)</div><div class="ttdef"><b>Definition:</b> <a href="map__util_8h_source.html#l00206">map_util.h:206</a></div></div>
|
|
<div class="ttc" id="anamespacegtl_html_a795ebdb62731938c8c31b221f0f074b4"><div class="ttname"><a href="namespacegtl.html#a795ebdb62731938c8c31b221f0f074b4">gtl::FindWithDefault</a></div><div class="ttdeci">const Collection::value_type::second_type & FindWithDefault(const Collection &collection, const typename Collection::value_type::first_type &key, const typename Collection::value_type::second_type &value)</div><div class="ttdef"><b>Definition:</b> <a href="map__util_8h_source.html#l00029">map_util.h:29</a></div></div>
|
|
<div class="ttc" id="anamespacegtl_html_a9f74dcd1ec00022462cbf110edaafc6d"><div class="ttname"><a href="namespacegtl.html#a9f74dcd1ec00022462cbf110edaafc6d">gtl::FindOrNull</a></div><div class="ttdeci">const Collection::value_type::second_type * FindOrNull(const Collection &collection, const typename Collection::value_type::first_type &key)</div><div class="ttdef"><b>Definition:</b> <a href="map__util_8h_source.html#l00060">map_util.h:60</a></div></div>
|
|
<div class="ttc" id="anamespacegtl_html_aae28e97bd1fa93cb0032642550da7455"><div class="ttname"><a href="namespacegtl.html#aae28e97bd1fa93cb0032642550da7455">gtl::ContainsKey</a></div><div class="ttdeci">bool ContainsKey(const Collection &collection, const Key &key)</div><div class="ttdef"><b>Definition:</b> <a href="map__util_8h_source.html#l00200">map_util.h:200</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_1_1math__opt_html_a5de89a1f6e3f80a49a0d76136d8044e2"><div class="ttname"><a href="namespaceoperations__research_1_1math__opt.html#a5de89a1f6e3f80a49a0d76136d8044e2">operations_research::math_opt::swap</a></div><div class="ttdeci">void swap(IdMap< K, V > &a, IdMap< K, V > &b)</div><div class="ttdef"><b>Definition:</b> <a href="id__map_8h_source.html#l00263">id_map.h:263</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html"><div class="ttname"><a href="namespaceoperations__research.html">operations_research</a></div><div class="ttdoc">Collection of objects used to extend the Constraint Solver library.</div><div class="ttdef"><b>Definition:</b> <a href="dense__doubly__linked__list_8h_source.html#l00021">dense_doubly_linked_list.h:21</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a082573f2b119f85031afcc6b9096b102"><div class="ttname"><a href="namespaceoperations__research.html#a082573f2b119f85031afcc6b9096b102">operations_research::SolveModelWithSat</a></div><div class="ttdeci">bool SolveModelWithSat(const RoutingModel &model, const RoutingSearchParameters &search_parameters, const Assignment *initial_solution, Assignment *solution)</div><div class="ttdoc">Attempts to solve the model using the cp-sat solver.</div><div class="ttdef"><b>Definition:</b> <a href="routing__sat_8cc_source.html#l01055">routing_sat.cc:1055</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a0e3e4445c55d0c59ef4edbaf7acbd3a8"><div class="ttname"><a href="namespaceoperations__research.html#a0e3e4445c55d0c59ef4edbaf7acbd3a8">operations_research::AppendDimensionCumulFilters</a></div><div class="ttdeci">void AppendDimensionCumulFilters(const std::vector< RoutingDimension * > &dimensions, const RoutingSearchParameters &parameters, bool filter_objective_cost, std::vector< LocalSearchFilterManager::FilterEvent > *filters)</div><div class="ttdef"><b>Definition:</b> <a href="routing__filters_8cc_source.html#l02207">routing_filters.cc:2207</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a111f44b9b9cf67a8e8d83794ac9f5291"><div class="ttname"><a href="namespaceoperations__research.html#a111f44b9b9cf67a8e8d83794ac9f5291">operations_research::CapAdd</a></div><div class="ttdeci">int64_t CapAdd(int64_t x, int64_t y)</div><div class="ttdef"><b>Definition:</b> <a href="saturated__arithmetic_8h_source.html#l00126">saturated_arithmetic.h:126</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a15e668e6078014aa160c39782f916322"><div class="ttname"><a href="namespaceoperations__research.html#a15e668e6078014aa160c39782f916322">operations_research::MakeCachedIntToIntFunction</a></div><div class="ttdeci">RangeIntToIntFunction * MakeCachedIntToIntFunction(const std::function< int64_t(int64_t)> &f, int64_t domain_start, int64_t domain_end)</div><div class="ttdef"><b>Definition:</b> <a href="range__query__function_8cc_source.html#l00219">range_query_function.cc:219</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a26868b9d744edcd8d59145e068678885"><div class="ttname"><a href="namespaceoperations__research.html#a26868b9d744edcd8d59145e068678885">operations_research::RoutingTransitCallback2</a></div><div class="ttdeci">std::function< int64_t(int64_t, int64_t)> RoutingTransitCallback2</div><div class="ttdef"><b>Definition:</b> <a href="routing__types_8h_source.html#l00043">routing_types.h:43</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a26a2d5d3c5887e436bf4da4c20a99a26"><div class="ttname"><a href="namespaceoperations__research.html#a26a2d5d3c5887e436bf4da4c20a99a26">operations_research::MakeAllUnperformed</a></div><div class="ttdeci">DecisionBuilder * MakeAllUnperformed(RoutingModel *model)</div><div class="ttdef"><b>Definition:</b> <a href="routing__search_8cc_source.html#l04069">routing_search.cc:4069</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a288aa8299841c0561fbe3505220f708a"><div class="ttname"><a href="namespaceoperations__research.html#a288aa8299841c0561fbe3505220f708a">operations_research::FirstSolutionStrategy_Value_Value_ARRAYSIZE</a></div><div class="ttdeci">constexpr int FirstSolutionStrategy_Value_Value_ARRAYSIZE</div><div class="ttdef"><b>Definition:</b> <a href="routing__enums_8pb_8h_source.html#l00095">routing_enums.pb.h:95</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a2fb66556abf59bfcf2fc1b87789d2a8e"><div class="ttname"><a href="namespaceoperations__research.html#a2fb66556abf59bfcf2fc1b87789d2a8e">operations_research::DefaultRoutingModelParameters</a></div><div class="ttdeci">RoutingModelParameters DefaultRoutingModelParameters()</div><div class="ttdef"><b>Definition:</b> <a href="routing__parameters_8cc_source.html#l00034">routing_parameters.cc:34</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a447588dfd4d5f539ec22f403e21ca668"><div class="ttname"><a href="namespaceoperations__research.html#a447588dfd4d5f539ec22f403e21ca668">operations_research::MakeVehicleBreaksFilter</a></div><div class="ttdeci">IntVarLocalSearchFilter * MakeVehicleBreaksFilter(const RoutingModel &routing_model, const RoutingDimension &dimension)</div><div class="ttdef"><b>Definition:</b> <a href="routing__breaks_8cc_source.html#l01077">routing_breaks.cc:1077</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a4955428bea2f2202769a58fdd47a126d"><div class="ttname"><a href="namespaceoperations__research.html#a4955428bea2f2202769a58fdd47a126d">operations_research::FindErrorInRoutingSearchParameters</a></div><div class="ttdeci">std::string FindErrorInRoutingSearchParameters(const RoutingSearchParameters &search_parameters)</div><div class="ttdoc">Returns an empty std::string if the routing search parameters are valid, and a non-empty,...</div><div class="ttdef"><b>Definition:</b> <a href="routing__parameters_8cc_source.html#l00144">routing_parameters.cc:144</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a4a43d435871f16c321861fa5de32df82"><div class="ttname"><a href="namespaceoperations__research.html#a4a43d435871f16c321861fa5de32df82">operations_research::CapSub</a></div><div class="ttdeci">int64_t CapSub(int64_t x, int64_t y)</div><div class="ttdef"><b>Definition:</b> <a href="saturated__arithmetic_8h_source.html#l00156">saturated_arithmetic.h:156</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a4bbb86ef97d259aabe86e0abde4759e3"><div class="ttname"><a href="namespaceoperations__research.html#a4bbb86ef97d259aabe86e0abde4759e3">operations_research::MakeVehicleAmortizedCostFilter</a></div><div class="ttdeci">IntVarLocalSearchFilter * MakeVehicleAmortizedCostFilter(const RoutingModel &routing_model)</div><div class="ttdoc">Returns a filter computing vehicle amortized costs.</div><div class="ttdef"><b>Definition:</b> <a href="routing__filters_8cc_source.html#l00681">routing_filters.cc:681</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a57f1befcdc8fc2b6f9741369a1beb136"><div class="ttname"><a href="namespaceoperations__research.html#a57f1befcdc8fc2b6f9741369a1beb136">operations_research::SetAssignmentFromAssignment</a></div><div class="ttdeci">void SetAssignmentFromAssignment(Assignment *target_assignment, const std::vector< IntVar * > &target_vars, const Assignment *source_assignment, const std::vector< IntVar * > &source_vars)</div><div class="ttdoc">NOLINT.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_2assignment_8cc_source.html#l01021">constraint_solver/assignment.cc:1021</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a59955a2e2c2b28075cdc795f99df6134"><div class="ttname"><a href="namespaceoperations__research.html#a59955a2e2c2b28075cdc795f99df6134">operations_research::MakeCachedRangeMinMaxIndexFunction</a></div><div class="ttdeci">RangeMinMaxIndexFunction * MakeCachedRangeMinMaxIndexFunction(const std::function< int64_t(int64_t)> &f, int64_t domain_start, int64_t domain_end)</div><div class="ttdef"><b>Definition:</b> <a href="range__query__function_8cc_source.html#l00225">range_query_function.cc:225</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a5a9881f8a07b166ef2cbde572cea27b6"><div class="ttname"><a href="namespaceoperations__research.html#a5a9881f8a07b166ef2cbde572cea27b6">operations_research::Zero</a></div><div class="ttdeci">int64_t Zero()</div><div class="ttdoc">NOLINT.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03146">constraint_solver.h:3146</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a6a24a85a196ecfb2b799a0409ef757c6"><div class="ttname"><a href="namespaceoperations__research.html#a6a24a85a196ecfb2b799a0409ef757c6">operations_research::MakeCPFeasibilityFilter</a></div><div class="ttdeci">IntVarLocalSearchFilter * MakeCPFeasibilityFilter(RoutingModel *routing_model)</div><div class="ttdoc">Returns a filter checking the current solution using CP propagation.</div><div class="ttdef"><b>Definition:</b> <a href="routing__filters_8cc_source.html#l02841">routing_filters.cc:2841</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a7f3c7082ef5ac88b70d3488d5886812a"><div class="ttname"><a href="namespaceoperations__research.html#a7f3c7082ef5ac88b70d3488d5886812a">operations_research::MakeSetValuesFromTargets</a></div><div class="ttdeci">DecisionBuilder * MakeSetValuesFromTargets(Solver *solver, std::vector< IntVar * > variables, std::vector< int64_t > targets)</div><div class="ttdoc">A decision builder which tries to assign values to variables as close as possible to target values fi...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l00169">routing.cc:169</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a89152c6d7ca6a92ff106fe602c706816"><div class="ttname"><a href="namespaceoperations__research.html#a89152c6d7ca6a92ff106fe602c706816">operations_research::AutomaticFirstSolutionStrategy</a></div><div class="ttdeci">FirstSolutionStrategy::Value AutomaticFirstSolutionStrategy(bool has_pickup_deliveries, bool has_node_precedences, bool has_single_vehicle_node)</div><div class="ttdoc">Returns the best value for the automatic first solution strategy, based on the given model parameters...</div><div class="ttdef"><b>Definition:</b> <a href="routing__search_8cc_source.html#l00168">routing_search.cc:168</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a8c36f70ade4fbfc1c3c4055ee6e4a857"><div class="ttname"><a href="namespaceoperations__research.html#a8c36f70ade4fbfc1c3c4055ee6e4a857">operations_research::ThoroughHash</a></div><div class="ttdeci">uint64_t ThoroughHash(const char *bytes, size_t len)</div><div class="ttdef"><b>Definition:</b> <a href="thorough__hash_8h_source.html#l00033">thorough_hash.h:33</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_a9e48359348ad94d97e6c44ffd52b33e3"><div class="ttname"><a href="namespaceoperations__research.html#a9e48359348ad94d97e6c44ffd52b33e3">operations_research::One</a></div><div class="ttdeci">int64_t One()</div><div class="ttdoc">This method returns 1.</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solver_8h_source.html#l03149">constraint_solver.h:3149</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_aa0787bf78fb09d1e30f2451b5a68d4b8"><div class="ttname"><a href="namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8">operations_research::DimensionSchedulingStatus</a></div><div class="ttdeci">DimensionSchedulingStatus</div><div class="ttdef"><b>Definition:</b> <a href="routing__lp__scheduling_8h_source.html#l00149">routing_lp_scheduling.h:149</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_aa0787bf78fb09d1e30f2451b5a68d4b8a6faaca695f728b47f47dd389f31e4a93"><div class="ttname"><a href="namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8a6faaca695f728b47f47dd389f31e4a93">operations_research::DimensionSchedulingStatus::INFEASIBLE</a></div><div class="ttdeci">@ INFEASIBLE</div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_aa0787bf78fb09d1e30f2451b5a68d4b8af00c8dbdd6e1f11bdae06be94277d293"><div class="ttname"><a href="namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8af00c8dbdd6e1f11bdae06be94277d293">operations_research::DimensionSchedulingStatus::OPTIMAL</a></div><div class="ttdeci">@ OPTIMAL</div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_aa0787bf78fb09d1e30f2451b5a68d4b8af8cfb2115ef7ab822bca8edd1edac285"><div class="ttname"><a href="namespaceoperations__research.html#aa0787bf78fb09d1e30f2451b5a68d4b8af8cfb2115ef7ab822bca8edd1edac285">operations_research::DimensionSchedulingStatus::RELAXED_OPTIMAL_ONLY</a></div><div class="ttdeci">@ RELAXED_OPTIMAL_ONLY</div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_aa213d8f884283e0d72712243cbbefa7c"><div class="ttname"><a href="namespaceoperations__research.html#aa213d8f884283e0d72712243cbbefa7c">operations_research::MakeConstraintDemon0</a></div><div class="ttdeci">Demon * MakeConstraintDemon0(Solver *const s, T *const ct, void(T::*method)(), const std::string &name)</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solveri_8h_source.html#l00518">constraint_solveri.h:518</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_aa2ef113e19924b88159b114a929b3358"><div class="ttname"><a href="namespaceoperations__research.html#aa2ef113e19924b88159b114a929b3358">operations_research::MakeMaxActiveVehiclesFilter</a></div><div class="ttdeci">IntVarLocalSearchFilter * MakeMaxActiveVehiclesFilter(const RoutingModel &routing_model)</div><div class="ttdoc">Returns a filter ensuring that max active vehicles constraints are enforced.</div><div class="ttdef"><b>Definition:</b> <a href="routing__filters_8cc_source.html#l00122">routing_filters.cc:122</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_aa64bf49d041052c7cb3f40f7496d7534"><div class="ttname"><a href="namespaceoperations__research.html#aa64bf49d041052c7cb3f40f7496d7534">operations_research::CapProd</a></div><div class="ttdeci">int64_t CapProd(int64_t x, int64_t y)</div><div class="ttdef"><b>Definition:</b> <a href="saturated__arithmetic_8h_source.html#l00233">saturated_arithmetic.h:233</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_aae02b84a58c3008fb747c0f6917bfe6c"><div class="ttname"><a href="namespaceoperations__research.html#aae02b84a58c3008fb747c0f6917bfe6c">operations_research::RoutingTransitCallback1</a></div><div class="ttdeci">std::function< int64_t(int64_t)> RoutingTransitCallback1</div><div class="ttdef"><b>Definition:</b> <a href="routing__types_8h_source.html#l00042">routing_types.h:42</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_aae315ffb47820060e3fa070260434118"><div class="ttname"><a href="namespaceoperations__research.html#aae315ffb47820060e3fa070260434118">operations_research::FillPathEvaluation</a></div><div class="ttdeci">void FillPathEvaluation(const std::vector< int64_t > &path, const RoutingModel::TransitCallback2 &evaluator, std::vector< int64_t > *values)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l05810">routing.cc:5810</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_ab13458305fa2eb87238ff66066eecd5da7149f32738efcef1bf4db3d635d804b0"><div class="ttname"><a href="namespaceoperations__research.html#ab13458305fa2eb87238ff66066eecd5da7149f32738efcef1bf4db3d635d804b0">operations_research::BOOL_TRUE</a></div><div class="ttdeci">@ BOOL_TRUE</div><div class="ttdef"><b>Definition:</b> <a href="optional__boolean_8pb_8h_source.html#l00062">optional_boolean.pb.h:62</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_ab13458305fa2eb87238ff66066eecd5daaced7f53e0be47857c07ad25642579c2"><div class="ttname"><a href="namespaceoperations__research.html#ab13458305fa2eb87238ff66066eecd5daaced7f53e0be47857c07ad25642579c2">operations_research::BOOL_FALSE</a></div><div class="ttdeci">@ BOOL_FALSE</div><div class="ttdef"><b>Definition:</b> <a href="optional__boolean_8pb_8h_source.html#l00061">optional_boolean.pb.h:61</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_ab59d4ce2b572e1ae576d2aa181433187"><div class="ttname"><a href="namespaceoperations__research.html#ab59d4ce2b572e1ae576d2aa181433187">operations_research::DefaultRoutingSearchParameters</a></div><div class="ttdeci">RoutingSearchParameters DefaultRoutingSearchParameters()</div><div class="ttdef"><b>Definition:</b> <a href="routing__parameters_8cc_source.html#l00047">routing_parameters.cc:47</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_ab5b064a7895b1fc8084546441a57b46a"><div class="ttname"><a href="namespaceoperations__research.html#ab5b064a7895b1fc8084546441a57b46a">operations_research::MakeSweepDecisionBuilder</a></div><div class="ttdeci">DecisionBuilder * MakeSweepDecisionBuilder(RoutingModel *model, bool check_assignment)</div><div class="ttdef"><b>Definition:</b> <a href="routing__search_8cc_source.html#l04035">routing_search.cc:4035</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_ab962de016b1a14868457ac876eadf008"><div class="ttname"><a href="namespaceoperations__research.html#ab962de016b1a14868457ac876eadf008">operations_research::MakeVehicleVarFilter</a></div><div class="ttdeci">IntVarLocalSearchFilter * MakeVehicleVarFilter(const RoutingModel &routing_model)</div><div class="ttdoc">Returns a filter checking that vehicle variable domains are respected.</div><div class="ttdef"><b>Definition:</b> <a href="routing__filters_8cc_source.html#l02543">routing_filters.cc:2543</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_ac316c82f31293db18e25c809592908dd"><div class="ttname"><a href="namespaceoperations__research.html#ac316c82f31293db18e25c809592908dd">operations_research::MakeDelayedConstraintDemon1</a></div><div class="ttdeci">Demon * MakeDelayedConstraintDemon1(Solver *const s, T *const ct, void(T::*method)(P), const std::string &name, P param1)</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solveri_8h_source.html#l00717">constraint_solveri.h:717</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_acb92bdbce12d475f965f6db3c5f5b7b5"><div class="ttname"><a href="namespaceoperations__research.html#acb92bdbce12d475f965f6db3c5f5b7b5">operations_research::MemoryUsage</a></div><div class="ttdeci">std::string MemoryUsage()</div><div class="ttdef"><b>Definition:</b> <a href="stats_8cc_source.html#l00025">stats.cc:25</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_ad03cbd2a51a0688c1fd08d3a7c1754c9"><div class="ttname"><a href="namespaceoperations__research.html#ad03cbd2a51a0688c1fd08d3a7c1754c9">operations_research::MakePickupDeliveryFilter</a></div><div class="ttdeci">IntVarLocalSearchFilter * MakePickupDeliveryFilter(const RoutingModel &routing_model, const RoutingModel::IndexPairs &pairs, const std::vector< RoutingModel::PickupAndDeliveryPolicy > &vehicle_policies)</div><div class="ttdoc">Returns a filter enforcing pickup and delivery constraints for the given pair of nodes and given poli...</div><div class="ttdef"><b>Definition:</b> <a href="routing__filters_8cc_source.html#l02470">routing_filters.cc:2470</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_ada7da4059546f5ef90de0b2f8bada19a"><div class="ttname"><a href="namespaceoperations__research.html#ada7da4059546f5ef90de0b2f8bada19a">operations_research::MakeTypeRegulationsFilter</a></div><div class="ttdeci">IntVarLocalSearchFilter * MakeTypeRegulationsFilter(const RoutingModel &routing_model)</div><div class="ttdoc">Returns a filter ensuring type regulation constraints are enforced.</div><div class="ttdef"><b>Definition:</b> <a href="routing__filters_8cc_source.html#l00830">routing_filters.cc:830</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_adc5e06b587829ed7c5e02c1d95293378"><div class="ttname"><a href="namespaceoperations__research.html#adc5e06b587829ed7c5e02c1d95293378">operations_research::HasUnaryDimension</a></div><div class="ttdeci">bool HasUnaryDimension(const std::vector< RoutingDimension * > &dimensions)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l04292">routing.cc:4292</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_adf85b9c9e168660e5f36d735d88f3955"><div class="ttname"><a href="namespaceoperations__research.html#adf85b9c9e168660e5f36d735d88f3955">operations_research::kUnassigned</a></div><div class="ttdeci">static const int kUnassigned</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l00702">routing.cc:702</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_ae0190f4a9c848c207d0bff97f625fcd1"><div class="ttname"><a href="namespaceoperations__research.html#ae0190f4a9c848c207d0bff97f625fcd1">operations_research::MakeConstraintDemon1</a></div><div class="ttdeci">Demon * MakeConstraintDemon1(Solver *const s, T *const ct, void(T::*method)(P), const std::string &name, P param1)</div><div class="ttdef"><b>Definition:</b> <a href="constraint__solveri_8h_source.html#l00559">constraint_solveri.h:559</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_ae1de0a1f7cf121d53ee230f794ce51f5"><div class="ttname"><a href="namespaceoperations__research.html#ae1de0a1f7cf121d53ee230f794ce51f5">operations_research::MakePathStateFilter</a></div><div class="ttdeci">LocalSearchFilter * MakePathStateFilter(Solver *solver, std::unique_ptr< PathState > path_state, const std::vector< IntVar * > &nexts)</div><div class="ttdef"><b>Definition:</b> <a href="local__search_8cc_source.html#l02960">local_search.cc:2960</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_ae2219dbffeee11e9bca17cc1e8217747"><div class="ttname"><a href="namespaceoperations__research.html#ae2219dbffeee11e9bca17cc1e8217747">operations_research::AppendLightWeightDimensionFilters</a></div><div class="ttdeci">void AppendLightWeightDimensionFilters(const PathState *path_state, const std::vector< RoutingDimension * > &dimensions, std::vector< LocalSearchFilterManager::FilterEvent > *filters)</div><div class="ttdoc">Appends dimension-based filters to the given list of filters using a path state.</div><div class="ttdef"><b>Definition:</b> <a href="routing__filters_8cc_source.html#l02145">routing_filters.cc:2145</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_aeb15e4444582a925522843bb414de9c3"><div class="ttname"><a href="namespaceoperations__research.html#aeb15e4444582a925522843bb414de9c3">operations_research::MakeNodeDisjunctionFilter</a></div><div class="ttdeci">IntVarLocalSearchFilter * MakeNodeDisjunctionFilter(const RoutingModel &routing_model)</div><div class="ttdoc">Returns a filter ensuring that node disjunction constraints are enforced.</div><div class="ttdef"><b>Definition:</b> <a href="routing__filters_8cc_source.html#l00295">routing_filters.cc:295</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_aecf320bda6e95d1edaf3a546673e3e6b"><div class="ttname"><a href="namespaceoperations__research.html#aecf320bda6e95d1edaf3a546673e3e6b">operations_research::ArcIndex</a></div><div class="ttdeci">int32_t ArcIndex</div><div class="ttdef"><b>Definition:</b> <a href="ebert__graph_8h_source.html#l00202">ebert_graph.h:202</a></div></div>
|
|
<div class="ttc" id="anamespaceoperations__research_html_aee97ac67f280d35acdef2c5d461a85c3"><div class="ttname"><a href="namespaceoperations__research.html#aee97ac67f280d35acdef2c5d461a85c3">operations_research::CostValue</a></div><div class="ttdeci">int64_t CostValue</div><div class="ttdef"><b>Definition:</b> <a href="ebert__graph_8h_source.html#l00204">ebert_graph.h:204</a></div></div>
|
|
<div class="ttc" id="anamespacestd_html"><div class="ttname"><a href="namespacestd.html">std</a></div><div class="ttdoc">STL namespace.</div></div>
|
|
<div class="ttc" id="anamespaceutil__time_html_a801584734c5b3898f94cf932202b2eb7"><div class="ttname"><a href="namespaceutil__time.html#a801584734c5b3898f94cf932202b2eb7">util_time::DecodeGoogleApiProto</a></div><div class="ttdeci">inline ::absl::StatusOr< absl::Duration > DecodeGoogleApiProto(const google::protobuf::Duration &proto)</div><div class="ttdef"><b>Definition:</b> <a href="protoutil_8h_source.html#l00042">protoutil.h:42</a></div></div>
|
|
<div class="ttc" id="aoptional__boolean_8pb_8h_html"><div class="ttname"><a href="optional__boolean_8pb_8h.html">optional_boolean.pb.h</a></div></div>
|
|
<div class="ttc" id="apack_8cc_html_a750b5d744c39a06bfb13e6eb010e35d0"><div class="ttname"><a href="pack_8cc.html#a750b5d744c39a06bfb13e6eb010e35d0">index</a></div><div class="ttdeci">int index</div><div class="ttdef"><b>Definition:</b> <a href="pack_8cc_source.html#l00509">pack.cc:509</a></div></div>
|
|
<div class="ttc" id="aparser_8yy_8cc_html_a5a634cf4429798b1c921a81de8250051"><div class="ttname"><a href="parser_8yy_8cc.html#a5a634cf4429798b1c921a81de8250051">input</a></div><div class="ttdeci">static int input(yyscan_t yyscanner)</div></div>
|
|
<div class="ttc" id="apiecewise__linear__function_8h_html"><div class="ttname"><a href="piecewise__linear__function_8h.html">piecewise_linear_function.h</a></div></div>
|
|
<div class="ttc" id="aprotoutil_8h_html"><div class="ttname"><a href="protoutil_8h.html">protoutil.h</a></div></div>
|
|
<div class="ttc" id="arange__query__function_8h_html"><div class="ttname"><a href="range__query__function_8h.html">range_query_function.h</a></div></div>
|
|
<div class="ttc" id="aresource_8cc_html_a29fb0dd9484d890b12b280c41c150e20"><div class="ttname"><a href="resource_8cc.html#a29fb0dd9484d890b12b280c41c150e20">demand</a></div><div class="ttdeci">int64_t demand</div><div class="ttdef"><b>Definition:</b> <a href="resource_8cc_source.html#l00125">resource.cc:125</a></div></div>
|
|
<div class="ttc" id="aresource_8cc_html_af92a8383a05fdf586a52263d358f5ada"><div class="ttname"><a href="resource_8cc.html#af92a8383a05fdf586a52263d358f5ada">interval</a></div><div class="ttdeci">IntervalVar * interval</div><div class="ttdef"><b>Definition:</b> <a href="resource_8cc_source.html#l00100">resource.cc:100</a></div></div>
|
|
<div class="ttc" id="arouting_8cc_html_a29befb522070fbb60d7eac99962701e8"><div class="ttname"><a href="routing_8cc.html#a29befb522070fbb60d7eac99962701e8">CP_ROUTING_PUSH_OPERATOR</a></div><div class="ttdeci">#define CP_ROUTING_PUSH_OPERATOR(operator_type, operator_method, operators)</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l04150">routing.cc:4150</a></div></div>
|
|
<div class="ttc" id="arouting_8h_html"><div class="ttname"><a href="routing_8h.html">routing.h</a></div></div>
|
|
<div class="ttc" id="arouting__enums_8pb_8h_html"><div class="ttname"><a href="routing__enums_8pb_8h.html">routing_enums.pb.h</a></div></div>
|
|
<div class="ttc" id="arouting__filters_8cc_html_a8e4ee19dee0e00541dbe9bbc83d806ba"><div class="ttname"><a href="routing__filters_8cc.html#a8e4ee19dee0e00541dbe9bbc83d806ba">coefficient</a></div><div class="ttdeci">int64_t coefficient</div><div class="ttdef"><b>Definition:</b> <a href="routing__filters_8cc_source.html#l00985">routing_filters.cc:985</a></div></div>
|
|
<div class="ttc" id="arouting__filters_8h_html"><div class="ttname"><a href="routing__filters_8h.html">routing_filters.h</a></div></div>
|
|
<div class="ttc" id="arouting__flow_8cc_html_a2acb49f4df5288066c43610bede123ec"><div class="ttname"><a href="routing__flow_8cc.html#a2acb49f4df5288066c43610bede123ec">capacity</a></div><div class="ttdeci">int64_t capacity</div><div class="ttdef"><b>Definition:</b> <a href="routing__flow_8cc_source.html#l00151">routing_flow.cc:151</a></div></div>
|
|
<div class="ttc" id="arouting__flow_8cc_html_a64e7efc5529154ba56903e75f5300990"><div class="ttname"><a href="routing__flow_8cc.html#a64e7efc5529154ba56903e75f5300990">tail</a></div><div class="ttdeci">int64_t tail</div><div class="ttdef"><b>Definition:</b> <a href="routing__flow_8cc_source.html#l00149">routing_flow.cc:149</a></div></div>
|
|
<div class="ttc" id="arouting__flow_8cc_html_a75d7b5e4cab1e156cc7a2c5eba1e16f1"><div class="ttname"><a href="routing__flow_8cc.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">cost</a></div><div class="ttdeci">int64_t cost</div><div class="ttdef"><b>Definition:</b> <a href="routing__flow_8cc_source.html#l00152">routing_flow.cc:152</a></div></div>
|
|
<div class="ttc" id="arouting__flow_8cc_html_afca32f65388659a4b0956496169488b4"><div class="ttname"><a href="routing__flow_8cc.html#afca32f65388659a4b0956496169488b4">head</a></div><div class="ttdeci">int64_t head</div><div class="ttdef"><b>Definition:</b> <a href="routing__flow_8cc_source.html#l00150">routing_flow.cc:150</a></div></div>
|
|
<div class="ttc" id="arouting__index__manager_8h_html"><div class="ttname"><a href="routing__index__manager_8h.html">routing_index_manager.h</a></div></div>
|
|
<div class="ttc" id="arouting__lp__scheduling_8h_html"><div class="ttname"><a href="routing__lp__scheduling_8h.html">routing_lp_scheduling.h</a></div></div>
|
|
<div class="ttc" id="arouting__neighborhoods_8h_html"><div class="ttname"><a href="routing__neighborhoods_8h.html">routing_neighborhoods.h</a></div></div>
|
|
<div class="ttc" id="arouting__parameters_8h_html"><div class="ttname"><a href="routing__parameters_8h.html">routing_parameters.h</a></div></div>
|
|
<div class="ttc" id="arouting__parameters_8pb_8h_html"><div class="ttname"><a href="routing__parameters_8pb_8h.html">routing_parameters.pb.h</a></div></div>
|
|
<div class="ttc" id="arouting__search_8cc_html_a1a01a2753d74fedd87264d8bd34a12df"><div class="ttname"><a href="routing__search_8cc.html#a1a01a2753d74fedd87264d8bd34a12df">vehicle_class</a></div><div class="ttdeci">int vehicle_class</div><div class="ttdef"><b>Definition:</b> <a href="routing__search_8cc_source.html#l03504">routing_search.cc:3504</a></div></div>
|
|
<div class="ttc" id="arouting__search_8cc_html_a79b8e036dca6911e3295a47d99f21f43"><div class="ttname"><a href="routing__search_8cc.html#a79b8e036dca6911e3295a47d99f21f43">distance</a></div><div class="ttdeci">double distance</div><div class="ttdef"><b>Definition:</b> <a href="routing__search_8cc_source.html#l03426">routing_search.cc:3426</a></div></div>
|
|
<div class="ttc" id="arouting__search_8h_html"><div class="ttname"><a href="routing__search_8h.html">routing_search.h</a></div></div>
|
|
<div class="ttc" id="arouting__types_8h_html"><div class="ttname"><a href="routing__types_8h.html">routing_types.h</a></div></div>
|
|
<div class="ttc" id="asat_2lp__utils_8cc_html_a742ae1554f2decd63d35be3e6ff4f58d"><div class="ttname"><a href="sat_2lp__utils_8cc.html#a742ae1554f2decd63d35be3e6ff4f58d">var_indices</a></div><div class="ttdeci">std::vector< int > var_indices</div><div class="ttdef"><b>Definition:</b> <a href="sat_2lp__utils_8cc_source.html#l00495">sat/lp_utils.cc:495</a></div></div>
|
|
<div class="ttc" id="asaturated__arithmetic_8h_html"><div class="ttname"><a href="saturated__arithmetic_8h.html">saturated_arithmetic.h</a></div></div>
|
|
<div class="ttc" id="asched__constraints_8cc_html_a0d94a083ebe1975ac196611f87a4e0a2"><div class="ttname"><a href="sched__constraints_8cc.html#a0d94a083ebe1975ac196611f87a4e0a2">start_max</a></div><div class="ttdeci">Rev< int64_t > start_max</div><div class="ttdef"><b>Definition:</b> <a href="sched__constraints_8cc_source.html#l00244">sched_constraints.cc:244</a></div></div>
|
|
<div class="ttc" id="asched__constraints_8cc_html_a368fa95d42fa4962a75cedd9df656694"><div class="ttname"><a href="sched__constraints_8cc.html#a368fa95d42fa4962a75cedd9df656694">end_max</a></div><div class="ttdeci">Rev< int64_t > end_max</div><div class="ttdef"><b>Definition:</b> <a href="sched__constraints_8cc_source.html#l00246">sched_constraints.cc:246</a></div></div>
|
|
<div class="ttc" id="asched__constraints_8cc_html_a826c744af066625acb241b17ae3e2be9"><div class="ttname"><a href="sched__constraints_8cc.html#a826c744af066625acb241b17ae3e2be9">start_min</a></div><div class="ttdeci">Rev< int64_t > start_min</div><div class="ttdef"><b>Definition:</b> <a href="sched__constraints_8cc_source.html#l00243">sched_constraints.cc:243</a></div></div>
|
|
<div class="ttc" id="asched__constraints_8cc_html_ad3f96403731a9e915dad229813609e74"><div class="ttname"><a href="sched__constraints_8cc.html#ad3f96403731a9e915dad229813609e74">end_min</a></div><div class="ttdeci">Rev< int64_t > end_min</div><div class="ttdef"><b>Definition:</b> <a href="sched__constraints_8cc_source.html#l00245">sched_constraints.cc:245</a></div></div>
|
|
<div class="ttc" id="asolver__parameters_8pb_8h_html"><div class="ttname"><a href="solver__parameters_8pb_8h.html">solver_parameters.pb.h</a></div></div>
|
|
<div class="ttc" id="asorted__interval__list_8h_html"><div class="ttname"><a href="sorted__interval__list_8h.html">sorted_interval_list.h</a></div></div>
|
|
<div class="ttc" id="astats_8h_html"><div class="ttname"><a href="stats_8h.html">stats.h</a></div></div>
|
|
<div class="ttc" id="astl__util_8h_html"><div class="ttname"><a href="stl__util_8h.html">stl_util.h</a></div></div>
|
|
<div class="ttc" id="astrong__vector_8h_html"><div class="ttname"><a href="strong__vector_8h.html">strong_vector.h</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1_routing_dimension_1_1_node_precedence_html"><div class="ttname"><a href="structoperations__research_1_1_routing_dimension_1_1_node_precedence.html">operations_research::RoutingDimension::NodePrecedence</a></div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02786">routing.h:2786</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1_routing_model_1_1_cost_class_html"><div class="ttname"><a href="structoperations__research_1_1_routing_model_1_1_cost_class.html">operations_research::RoutingModel::CostClass</a></div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00269">routing.h:269</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1_routing_model_1_1_cost_class_html_aecd5ad315b3f45eef0d567ad99008eaf"><div class="ttname"><a href="structoperations__research_1_1_routing_model_1_1_cost_class.html#aecd5ad315b3f45eef0d567ad99008eaf">operations_research::RoutingModel::CostClass::LessThan</a></div><div class="ttdeci">static bool LessThan(const CostClass &a, const CostClass &b)</div><div class="ttdoc">Comparator for STL containers and algorithms.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00311">routing.h:311</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1_routing_model_1_1_state_dependent_transit_html"><div class="ttname"><a href="structoperations__research_1_1_routing_model_1_1_state_dependent_transit.html">operations_research::RoutingModel::StateDependentTransit</a></div><div class="ttdoc">What follows is relevant for models with time/state dependent transits.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00260">routing.h:260</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1_routing_model_1_1_vehicle_class_html"><div class="ttname"><a href="structoperations__research_1_1_routing_model_1_1_vehicle_class.html">operations_research::RoutingModel::VehicleClass</a></div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l00320">routing.h:320</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1_routing_model_1_1_vehicle_class_html_ad42f0b03bf2ec344fa3ab98832a020f6"><div class="ttname"><a href="structoperations__research_1_1_routing_model_1_1_vehicle_class.html#ad42f0b03bf2ec344fa3ab98832a020f6">operations_research::RoutingModel::VehicleClass::LessThan</a></div><div class="ttdeci">static bool LessThan(const VehicleClass &a, const VehicleClass &b)</div><div class="ttdoc">Comparator for STL containers and algorithms.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8cc_source.html#l01470">routing.cc:1470</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1_simple_bound_costs_1_1_bound_cost_html"><div class="ttname"><a href="structoperations__research_1_1_simple_bound_costs_1_1_bound_cost.html">operations_research::SimpleBoundCosts::BoundCost</a></div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02457">routing.h:2457</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1_simple_bound_costs_1_1_bound_cost_html_a75d7b5e4cab1e156cc7a2c5eba1e16f1"><div class="ttname"><a href="structoperations__research_1_1_simple_bound_costs_1_1_bound_cost.html#a75d7b5e4cab1e156cc7a2c5eba1e16f1">operations_research::SimpleBoundCosts::BoundCost::cost</a></div><div class="ttdeci">int64_t cost</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02459">routing.h:2459</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence_html"><div class="ttname"><a href="structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html">operations_research::TypeRegulationsChecker::TypePolicyOccurrence</a></div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02299">routing.h:2299</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence_html_a7acae15ab204f3f24e65ad1d10729bb9"><div class="ttname"><a href="structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html#a7acae15ab204f3f24e65ad1d10729bb9">operations_research::TypeRegulationsChecker::TypePolicyOccurrence::position_of_last_type_on_vehicle_up_to_visit</a></div><div class="ttdeci">int position_of_last_type_on_vehicle_up_to_visit</div><div class="ttdoc">Position of the last node of policy TYPE_ON_VEHICLE_UP_TO_VISIT visited on the route.</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02314">routing.h:2314</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence_html_aa0bf1d67fe0a2224b3ce02286a032c3e"><div class="ttname"><a href="structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html#aa0bf1d67fe0a2224b3ce02286a032c3e">operations_research::TypeRegulationsChecker::TypePolicyOccurrence::num_type_added_to_vehicle</a></div><div class="ttdeci">int num_type_added_to_vehicle</div><div class="ttdoc">Number of TYPE_ADDED_TO_VEHICLE and TYPE_SIMULTANEOUSLY_ADDED_AND_REMOVED node type policies seen on ...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02303">routing.h:2303</a></div></div>
|
|
<div class="ttc" id="astructoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence_html_abb92435061d2042b268fb2041c8e2754"><div class="ttname"><a href="structoperations__research_1_1_type_regulations_checker_1_1_type_policy_occurrence.html#abb92435061d2042b268fb2041c8e2754">operations_research::TypeRegulationsChecker::TypePolicyOccurrence::num_type_removed_from_vehicle</a></div><div class="ttdeci">int num_type_removed_from_vehicle</div><div class="ttdoc">Number of ADDED_TYPE_REMOVED_FROM_VEHICLE (effectively removing a type from the route) and TYPE_SIMUL...</div><div class="ttdef"><b>Definition:</b> <a href="routing_8h_source.html#l02309">routing.h:2309</a></div></div>
|
|
<div class="ttc" id="athorough__hash_8h_html"><div class="ttname"><a href="thorough__hash_8h.html">thorough_hash.h</a></div></div>
|
|
</div><!-- fragment --></div><!-- contents -->
|
|
</div><!-- doc-content -->
|
|
<!-- HTML footer for doxygen 1.8.18-->
|
|
<!-- start footer part -->
|
|
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
|
|
<ul>
|
|
<li class="navelem"><a class="el" href="dir_a7cc1eeded8f693d0da6c729bc88c45a.html">ortools</a></li><li class="navelem"><a class="el" href="dir_afbb39f66221aac28bbdefd1dca2b2b0.html">constraint_solver</a></li><li class="navelem"><a class="el" href="routing_8cc.html">routing.cc</a></li>
|
|
<li class="footer">Generated by
|
|
<a href="http://www.doxygen.org/index.html">
|
|
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.9.2 </li>
|
|
</ul>
|
|
</div>
|
|
</body>
|
|
</html>
|