Lines Matching refs:n

16     "Licensed under the Apache License, Version 2.0 (the \"License\");\n",
17 "you may not use this file except in compliance with the License.\n",
18 "You may obtain a copy of the License at\n",
19 "\n",
20 " http://www.apache.org/licenses/LICENSE-2.0\n",
21 "\n",
22 "Unless required by applicable law or agreed to in writing, software\n",
23 "distributed under the License is distributed on an \"AS IS\" BASIS,\n",
24 "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
25 "See the License for the specific language governing permissions and\n",
26 "limitations under the License.\n"
42 "<table align=\"left\">\n",
43 "<td>\n",
44 …aw.githubusercontent.com/google/or-tools/master/tools/colab_32px.png\"/>Run in Google Colab</a>\n",
45 "</td>\n",
46 "<td>\n",
47 …githubusercontent.com/google/or-tools/master/tools/github_32px.png\"/>View source on GitHub</a>\n",
48 "</td>\n",
77 "#!/usr/bin/env python3\n",
78 "# Copyright 2010-2021 Google LLC\n",
79 "# Licensed under the Apache License, Version 2.0 (the \"License\");\n",
80 "# you may not use this file except in compliance with the License.\n",
81 "# You may obtain a copy of the License at\n",
82 "#\n",
83 "# http://www.apache.org/licenses/LICENSE-2.0\n",
84 "#\n",
85 "# Unless required by applicable law or agreed to in writing, software\n",
86 "# distributed under the License is distributed on an \"AS IS\" BASIS,\n",
87 "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
88 "# See the License for the specific language governing permissions and\n",
89 "# limitations under the License.\n",
90 "\"\"\"This model implements a bus driver scheduling problem.\n",
91 "\n",
92 "Constraints:\n",
93 "- max driving time per driver <= 9h\n",
94 "- max working time per driver <= 12h\n",
95 "- min working time per driver >= 6.5h (soft)\n",
96 "- 30 min break after each 4h of driving time per driver\n",
97 "- 10 min preparation time before the first shift\n",
98 "- 15 min cleaning time after the last shift\n",
99 "- 2 min waiting time after each shift for passenger boarding and alighting\n",
100 "\"\"\"\n",
101 "\n",
102 "import collections\n",
103 "import math\n",
104 "\n",
105 "from absl import app\n",
106 "from absl import flags\n",
107 "from google.protobuf import text_format\n",
108 "from ortools.sat.python import cp_model\n",
109 "\n",
110 "FLAGS = flags.FLAGS\n",
111 "\n",
112 "flags.DEFINE_string('output_proto', '',\n",
113 " 'Output file to write the cp_model proto to.')\n",
114 "flags.DEFINE_string('params', 'num_search_workers:8,log_search_progress:true',\n",
115 " 'Sat solver parameters.')\n",
116 "flags.DEFINE_integer('instance', 1, 'Instance to select (1, 2, 3).', 1, 3)\n",
117 "\n",
118 "SAMPLE_SHIFTS_SMALL = [\n",
119 " #\n",
120 " # column description:\n",
121 " # - shift id\n",
122 " # - shift start time as hh:mm string (for logging and readability purposes)\n",
123 " # - shift end time as hh:mm string (for logging and readability purposes)\n",
124 " # - shift start minute\n",
125 " # - shift end minute\n",
126 " # - shift duration in minutes\n",
127 " #\n",
128 " [0, '05:18', '06:00', 318, 360, 42],\n",
129 " [1, '05:26', '06:08', 326, 368, 42],\n",
130 " [2, '05:40', '05:56', 340, 356, 16],\n",
131 " [3, '06:06', '06:51', 366, 411, 45],\n",
132 " [4, '06:40', '07:52', 400, 472, 72],\n",
133 " [5, '06:42', '07:13', 402, 433, 31],\n",
134 " [6, '06:48', '08:15', 408, 495, 87],\n",
135 " [7, '06:59', '08:07', 419, 487, 68],\n",
136 " [8, '07:20', '07:36', 440, 456, 16],\n",
137 " [9, '07:35', '08:22', 455, 502, 47],\n",
138 " [10, '07:50', '08:55', 470, 535, 65],\n",
139 " [11, '08:00', '09:05', 480, 545, 65],\n",
140 " [12, '08:00', '08:35', 480, 515, 35],\n",
141 " [13, '08:11', '09:41', 491, 581, 90],\n",
142 " [14, '08:28', '08:50', 508, 530, 22],\n",
143 " [15, '08:35', '08:45', 515, 525, 10],\n",
144 " [16, '08:40', '08:50', 520, 530, 10],\n",
145 " [17, '09:03', '10:28', 543, 628, 85],\n",
146 " [18, '09:23', '09:49', 563, 589, 26],\n",
147 " [19, '09:30', '09:40', 570, 580, 10],\n",
148 " [20, '09:57', '10:20', 597, 620, 23],\n",
149 " [21, '10:09', '11:03', 609, 663, 54],\n",
150 " [22, '10:20', '10:30', 620, 630, 10],\n",
151 " [23, '11:00', '11:10', 660, 670, 10],\n",
152 " [24, '11:45', '12:24', 705, 744, 39],\n",
153 " [25, '12:18', '13:00', 738, 780, 42],\n",
154 " [26, '13:18', '14:44', 798, 884, 86],\n",
155 " [27, '13:53', '14:49', 833, 889, 56],\n",
156 " [28, '14:03', '14:50', 843, 890, 47],\n",
157 " [29, '14:28', '15:15', 868, 915, 47],\n",
158 " [30, '14:30', '15:41', 870, 941, 71],\n",
159 " [31, '14:48', '15:35', 888, 935, 47],\n",
160 " [32, '15:03', '15:50', 903, 950, 47],\n",
161 " [33, '15:28', '16:54', 928, 1014, 86],\n",
162 " [34, '15:38', '16:25', 938, 985, 47],\n",
163 " [35, '15:40', '15:56', 940, 956, 16],\n",
164 " [36, '15:58', '16:45', 958, 1005, 47],\n",
165 " [37, '16:04', '17:30', 964, 1050, 86],\n",
166 " [38, '16:28', '17:15', 988, 1035, 47],\n",
167 " [39, '16:36', '17:21', 996, 1041, 45],\n",
168 " [40, '16:50', '17:00', 1010, 1020, 10],\n",
169 " [41, '16:54', '18:20', 1014, 1100, 86],\n",
170 " [42, '17:01', '17:13', 1021, 1033, 12],\n",
171 " [43, '17:19', '18:31', 1039, 1111, 72],\n",
172 " [44, '17:23', '18:10', 1043, 1090, 47],\n",
173 " [45, '17:34', '18:15', 1054, 1095, 41],\n",
174 " [46, '18:04', '19:29', 1084, 1169, 85],\n",
175 " [47, '18:34', '19:58', 1114, 1198, 84],\n",
176 " [48, '19:56', '20:34', 1196, 1234, 38],\n",
177 " [49, '20:05', '20:48', 1205, 1248, 43]\n",
178 "] # yapf:disable\n",
179 "\n",
180 "SAMPLE_SHIFTS_MEDIUM = [\n",
181 " [0, '04:30', '04:53', 270, 293, 23],\n",
182 " [1, '04:46', '04:56', 286, 296, 10],\n",
183 " [2, '04:52', '05:56', 292, 356, 64],\n",
184 " [3, '04:53', '05:23', 293, 323, 30],\n",
185 " [4, '05:07', '05:44', 307, 344, 37],\n",
186 " [5, '05:10', '06:06', 310, 366, 56],\n",
187 " [6, '05:18', '06:03', 318, 363, 45],\n",
188 " [7, '05:30', '05:40', 330, 340, 10],\n",
189 " [8, '05:30', '05:40', 330, 340, 10],\n",
190 " [9, '05:33', '06:15', 333, 375, 42],\n",
191 " [10, '05:40', '05:50', 340, 350, 10],\n",
192 " [11, '05:43', '06:08', 343, 368, 25],\n",
193 " [12, '05:54', '07:20', 354, 440, 86],\n",
194 " [13, '06:04', '06:37', 364, 397, 33],\n",
195 " [14, '06:13', '06:58', 373, 418, 45],\n",
196 " [15, '06:14', '07:40', 374, 460, 86],\n",
197 " [16, '06:15', '07:15', 375, 435, 60],\n",
198 " [17, '06:16', '06:26', 376, 386, 10],\n",
199 " [18, '06:17', '06:34', 377, 394, 17],\n",
200 " [19, '06:20', '06:36', 380, 396, 16],\n",
201 " [20, '06:22', '07:06', 382, 426, 44],\n",
202 " [21, '06:24', '07:50', 384, 470, 86],\n",
203 " [22, '06:27', '06:44', 387, 404, 17],\n",
204 " [23, '06:30', '06:40', 390, 400, 10],\n",
205 " [24, '06:31', '06:43', 391, 403, 12],\n",
206 " [25, '06:33', '07:53', 393, 473, 80],\n",
207 " [26, '06:34', '07:09', 394, 429, 35],\n",
208 " [27, '06:40', '06:56', 400, 416, 16],\n",
209 " [28, '06:44', '07:17', 404, 437, 33],\n",
210 " [29, '06:46', '06:58', 406, 418, 12],\n",
211 " [30, '06:49', '07:43', 409, 463, 54],\n",
212 " [31, '06:50', '07:05', 410, 425, 15],\n",
213 " [32, '06:52', '07:36', 412, 456, 44],\n",
214 " [33, '06:54', '07:27', 414, 447, 33],\n",
215 " [34, '06:56', '08:23', 416, 503, 87],\n",
216 " [35, '07:04', '07:44', 424, 464, 40],\n",
217 " [36, '07:11', '08:36', 431, 516, 85],\n",
218 " [37, '07:17', '07:35', 437, 455, 18],\n",
219 " [38, '07:22', '08:06', 442, 486, 44],\n",
220 " [39, '07:27', '08:15', 447, 495, 48],\n",
221 " [40, '07:35', '07:45', 455, 465, 10],\n",
222 " [41, '07:43', '08:08', 463, 488, 25],\n",
223 " [42, '07:50', '08:37', 470, 517, 47],\n",
224 " [43, '07:58', '08:45', 478, 525, 47],\n",
225 " [44, '08:00', '08:35', 480, 515, 35],\n",
226 " [45, '08:06', '08:51', 486, 531, 45],\n",
227 " [46, '08:10', '08:45', 490, 525, 35],\n",
228 " [47, '08:15', '08:30', 495, 510, 15],\n",
229 " [48, '08:16', '09:00', 496, 540, 44],\n",
230 " [49, '08:18', '09:16', 498, 556, 58],\n",
231 " [50, '08:20', '08:36', 500, 516, 16],\n",
232 " [51, '08:27', '09:07', 507, 547, 40],\n",
233 " [52, '08:30', '08:45', 510, 525, 15],\n",
234 " [53, '08:35', '09:15', 515, 555, 40],\n",
235 " [54, '08:46', '09:30', 526, 570, 44],\n",
236 " [55, '08:51', '09:17', 531, 557, 26],\n",
237 " [56, '08:55', '09:15', 535, 555, 20],\n",
238 " [57, '08:58', '09:38', 538, 578, 40],\n",
239 " [58, '09:00', '09:35', 540, 575, 35],\n",
240 " [59, '09:00', '09:16', 540, 556, 16],\n",
241 " [60, '09:20', '09:36', 560, 576, 16],\n",
242 " [61, '09:31', '09:43', 571, 583, 12],\n",
243 " [62, '09:33', '10:15', 573, 615, 42],\n",
244 " [63, '09:54', '10:05', 594, 605, 11],\n",
245 " [64, '10:11', '10:38', 611, 638, 27],\n",
246 " [65, '10:18', '11:00', 618, 660, 42],\n",
247 " [66, '10:21', '10:47', 621, 647, 26],\n",
248 " [67, '10:25', '11:04', 625, 664, 39],\n",
249 " [68, '10:26', '11:08', 626, 668, 42],\n",
250 " [69, '10:44', '12:11', 644, 731, 87],\n",
251 " [70, '11:00', '11:16', 660, 676, 16],\n",
252 " [71, '11:15', '11:54', 675, 714, 39],\n",
253 " [72, '11:16', '11:28', 676, 688, 12],\n",
254 " [73, '11:20', '11:30', 680, 690, 10],\n",
255 " [74, '11:21', '11:47', 681, 707, 26],\n",
256 " [75, '11:25', '12:04', 685, 724, 39],\n",
257 " [76, '11:34', '11:45', 694, 705, 11],\n",
258 " [77, '11:35', '12:14', 695, 734, 39],\n",
259 " [78, '11:41', '12:23', 701, 743, 42],\n",
260 " [79, '11:44', '12:35', 704, 755, 51],\n",
261 " [80, '11:46', '11:58', 706, 718, 12],\n",
262 " [81, '12:00', '12:10', 720, 730, 10],\n",
263 " [82, '12:04', '12:15', 724, 735, 11],\n",
264 " [83, '12:04', '13:04', 724, 784, 60],\n",
265 " [84, '12:11', '12:38', 731, 758, 27],\n",
266 " [85, '12:15', '12:54', 735, 774, 39],\n",
267 " [86, '12:25', '13:10', 745, 790, 45],\n",
268 " [87, '12:30', '12:40', 750, 760, 10],\n",
269 " [88, '12:34', '13:58', 754, 838, 84],\n",
270 " [89, '12:38', '13:25', 758, 805, 47],\n",
271 " [90, '12:48', '13:35', 768, 815, 47],\n",
272 " [91, '13:00', '13:16', 780, 796, 16],\n",
273 " [92, '13:05', '13:44', 785, 824, 39],\n",
274 " [93, '13:08', '13:55', 788, 835, 47],\n",
275 " [94, '13:14', '14:38', 794, 878, 84],\n",
276 " [95, '13:23', '13:49', 803, 829, 26],\n",
277 " [96, '13:25', '14:04', 805, 844, 39],\n",
278 " [97, '13:28', '14:54', 808, 894, 86],\n",
279 " [98, '13:31', '13:43', 811, 823, 12],\n",
280 " [99, '13:34', '14:58', 814, 898, 84],\n",
281 " [100, '13:38', '14:25', 818, 865, 47],\n",
282 " [101, '13:38', '15:04', 818, 904, 86],\n",
283 " [102, '13:39', '14:33', 819, 873, 54],\n",
284 " [103, '13:40', '13:50', 820, 830, 10],\n",
285 " [104, '13:43', '14:10', 823, 850, 27],\n",
286 " [105, '13:48', '14:35', 828, 875, 47],\n",
287 " [106, '13:48', '14:35', 828, 875, 47],\n",
288 " [107, '13:53', '14:40', 833, 880, 47],\n",
289 " [108, '13:58', '15:24', 838, 924, 86],\n",
290 " [109, '13:58', '14:25', 838, 865, 27],\n",
291 " [110, '14:00', '14:16', 840, 856, 16],\n",
292 " [111, '14:13', '15:00', 853, 900, 47],\n",
293 " [112, '14:20', '15:31', 860, 931, 71],\n",
294 " [113, '14:25', '15:02', 865, 902, 37],\n",
295 " [114, '14:34', '14:45', 874, 885, 11],\n",
296 " [115, '14:40', '15:51', 880, 951, 71],\n",
297 " [116, '14:40', '14:56', 880, 896, 16],\n",
298 " [117, '14:46', '14:58', 886, 898, 12],\n",
299 " [118, '14:49', '15:43', 889, 943, 54],\n",
300 " [119, '14:52', '15:21', 892, 921, 29],\n",
301 " [120, '14:58', '16:24', 898, 984, 86],\n",
302 " [121, '14:59', '15:53', 899, 953, 54],\n",
303 " [122, '15:00', '15:10', 900, 910, 10],\n",
304 " [123, '15:00', '15:35', 900, 935, 35],\n",
305 " [124, '15:08', '15:45', 908, 945, 37],\n",
306 " [125, '15:12', '15:36', 912, 936, 24],\n",
307 " [126, '15:18', '16:05', 918, 965, 47],\n",
308 " [127, '15:24', '16:05', 924, 965, 41],\n",
309 " [128, '15:31', '15:43', 931, 943, 12],\n",
310 " [129, '15:35', '15:54', 935, 954, 19],\n",
311 " [130, '15:36', '16:21', 936, 981, 45],\n",
312 " [131, '15:39', '16:33', 939, 993, 54],\n",
313 " [132, '15:48', '16:35', 948, 995, 47],\n",
314 " [133, '15:50', '17:01', 950, 1021, 71],\n",
315 " [134, '16:03', '16:50', 963, 1010, 47],\n",
316 " [135, '16:18', '17:44', 978, 1064, 86],\n",
317 " [136, '16:24', '17:05', 984, 1025, 41],\n",
318 " [137, '16:28', '17:15', 988, 1035, 47],\n",
319 " [138, '16:34', '17:15', 994, 1035, 41],\n",
320 " [139, '16:38', '17:25', 998, 1045, 47],\n",
321 " [140, '16:40', '16:56', 1000, 1016, 16],\n",
322 " [141, '16:45', '17:04', 1005, 1024, 19],\n",
323 " [142, '16:52', '17:36', 1012, 1056, 44],\n",
324 " [143, '16:58', '17:45', 1018, 1065, 47],\n",
325 " [144, '17:04', '18:30', 1024, 1110, 86],\n",
326 " [145, '17:04', '17:45', 1024, 1065, 41],\n",
327 " [146, '17:09', '18:03', 1029, 1083, 54],\n",
328 " [147, '17:18', '18:44', 1038, 1124, 86],\n",
329 " [148, '17:28', '18:15', 1048, 1095, 47],\n",
330 " [149, '17:29', '18:41', 1049, 1121, 72],\n",
331 " [150, '17:36', '18:21', 1056, 1101, 45],\n",
332 " [151, '17:38', '18:25', 1058, 1105, 47],\n",
333 " [152, '17:40', '17:56', 1060, 1076, 16],\n",
334 " [153, '17:45', '18:04', 1065, 1084, 19],\n",
335 " [154, '17:46', '17:58', 1066, 1078, 12],\n",
336 " [155, '17:48', '18:35', 1068, 1115, 47],\n",
337 " [156, '17:49', '18:43', 1069, 1123, 54],\n",
338 " [157, '17:55', '18:14', 1075, 1094, 19],\n",
339 " [158, '17:58', '18:45', 1078, 1125, 47],\n",
340 " [159, '18:00', '19:11', 1080, 1151, 71],\n",
341 " [160, '18:04', '18:45', 1084, 1125, 41],\n",
342 " [161, '18:09', '19:03', 1089, 1143, 54],\n",
343 " [162, '18:13', '19:00', 1093, 1140, 47],\n",
344 " [163, '18:13', '18:40', 1093, 1120, 27],\n",
345 " [164, '18:19', '19:13', 1099, 1153, 54],\n",
346 " [165, '18:28', '19:25', 1108, 1165, 57],\n",
347 " [166, '18:48', '19:28', 1128, 1168, 40],\n",
348 " [167, '19:03', '19:45', 1143, 1185, 42],\n",
349 " [168, '19:20', '19:36', 1160, 1176, 16],\n",
350 " [169, '19:21', '19:31', 1161, 1171, 10],\n",
351 " [170, '19:25', '20:04', 1165, 1204, 39],\n",
352 " [171, '19:26', '20:08', 1166, 1208, 42],\n",
353 " [172, '19:30', '19:40', 1170, 1180, 10],\n",
354 " [173, '19:44', '20:33', 1184, 1233, 49],\n",
355 " [174, '19:48', '21:09', 1188, 1269, 81],\n",
356 " [175, '19:53', '21:02', 1193, 1262, 69],\n",
357 " [176, '20:04', '20:29', 1204, 1229, 25],\n",
358 " [177, '20:17', '21:03', 1217, 1263, 46],\n",
359 " [178, '20:20', '20:57', 1220, 1257, 37],\n",
360 " [179, '20:29', '21:18', 1229, 1278, 49],\n",
361 " [180, '20:35', '21:54', 1235, 1314, 79],\n",
362 " [181, '20:40', '20:50', 1240, 1250, 10],\n",
363 " [182, '20:47', '21:42', 1247, 1302, 55],\n",
364 " [183, '21:00', '21:10', 1260, 1270, 10],\n",
365 " [184, '21:07', '21:44', 1267, 1304, 37],\n",
366 " [185, '21:14', '22:03', 1274, 1323, 49],\n",
367 " [186, '21:39', '21:55', 1299, 1315, 16],\n",
368 " [187, '21:40', '22:17', 1300, 1337, 37],\n",
369 " [188, '21:40', '21:50', 1300, 1310, 10],\n",
370 " [189, '21:48', '22:03', 1308, 1323, 15],\n",
371 " [190, '22:17', '23:03', 1337, 1383, 46],\n",
372 " [191, '22:43', '23:08', 1363, 1388, 25],\n",
373 " [192, '23:35', '01:05', 1415, 1505, 90],\n",
374 " [193, '23:46', '00:01', 1426, 1441, 15],\n",
375 " [194, '23:47', '00:33', 1427, 1473, 46],\n",
376 " [195, '23:52', '00:24', 1432, 1464, 32],\n",
377 " [196, '23:58', '00:38', 1438, 1478, 40],\n",
378 " [197, '00:02', '00:12', 1442, 1452, 10],\n",
379 " [198, '00:07', '00:39', 1447, 1479, 32],\n",
380 " [199, '00:25', '01:12', 1465, 1512, 47]\n",
381 "] # yapf:disable\n",
382 "\n",
383 "SAMPLE_SHIFTS_LARGE = [\n",
384 " [0, '04:18', '05:00', 258, 300, 42],\n",
385 " [1, '04:27', '05:08', 267, 308, 41],\n",
386 " [2, '04:29', '05:26', 269, 326, 57],\n",
387 " [3, '04:29', '04:55', 269, 295, 26],\n",
388 " [4, '04:30', '04:53', 270, 293, 23],\n",
389 " [5, '04:30', '04:51', 270, 291, 21],\n",
390 " [6, '04:31', '04:53', 271, 293, 22],\n",
391 " [7, '04:33', '05:15', 273, 315, 42],\n",
392 " [8, '04:34', '04:44', 274, 284, 10],\n",
393 " [9, '04:34', '05:03', 274, 303, 29],\n",
394 " [10, '04:35', '04:50', 275, 290, 15],\n",
395 " [11, '04:36', '04:46', 276, 286, 10],\n",
396 " [12, '04:37', '05:18', 277, 318, 41],\n",
397 " [13, '04:41', '05:13', 281, 313, 32],\n",
398 " [14, '04:42', '05:23', 282, 323, 41],\n",
399 " [15, '04:43', '04:53', 283, 293, 10],\n",
400 " [16, '04:44', '05:45', 284, 345, 61],\n",
401 " [17, '04:45', '05:11', 285, 311, 26],\n",
402 " [18, '04:46', '05:01', 286, 301, 15],\n",
403 " [19, '04:46', '04:56', 286, 296, 10],\n",
404 " [20, '04:47', '05:14', 287, 314, 27],\n",
405 " [21, '04:48', '05:30', 288, 330, 42],\n",
406 " [22, '04:49', '05:41', 289, 341, 52],\n",
407 " [23, '04:49', '05:18', 289, 318, 29],\n",
408 " [24, '04:50', '05:33', 290, 333, 43],\n",
409 " [25, '04:52', '05:56', 292, 356, 64],\n",
410 " [26, '04:52', '05:07', 292, 307, 15],\n",
411 " [27, '04:53', '05:19', 293, 319, 26],\n",
412 " [28, '04:53', '05:23', 293, 323, 30],\n",
413 " [29, '04:55', '05:27', 295, 327, 32],\n",
414 " [30, '04:57', '05:38', 297, 338, 41],\n",
415 " [31, '05:00', '06:00', 300, 360, 60],\n",
416 " [32, '05:00', '05:54', 300, 354, 54],\n",
417 " [33, '05:01', '05:33', 301, 333, 32],\n",
418 " [34, '05:01', '05:26', 301, 326, 25],\n",
419 " [35, '05:02', '05:29', 302, 329, 27],\n",
420 " [36, '05:02', '05:12', 302, 312, 10],\n",
421 " [37, '05:03', '05:45', 303, 345, 42],\n",
422 " [38, '05:03', '05:18', 303, 318, 15],\n",
423 " [39, '05:03', '06:28', 303, 388, 85],\n",
424 " [40, '05:03', '05:13', 303, 313, 10],\n",
425 " [41, '05:04', '06:24', 304, 384, 80],\n",
426 " [42, '05:07', '05:44', 307, 344, 37],\n",
427 " [43, '05:08', '05:48', 308, 348, 40],\n",
428 " [44, '05:10', '06:06', 310, 366, 56],\n",
429 " [45, '05:11', '05:37', 311, 337, 26],\n",
430 " [46, '05:11', '05:53', 311, 353, 42],\n",
431 " [47, '05:13', '06:15', 313, 375, 62],\n",
432 " [48, '05:13', '05:38', 313, 338, 25],\n",
433 " [49, '05:16', '05:44', 316, 344, 28],\n",
434 " [50, '05:17', '05:27', 317, 327, 10],\n",
435 " [51, '05:18', '06:40', 318, 400, 82],\n",
436 " [52, '05:18', '06:03', 318, 363, 45],\n",
437 " [53, '05:18', '06:11', 318, 371, 53],\n",
438 " [54, '05:18', '06:00', 318, 360, 42],\n",
439 " [55, '05:19', '06:34', 319, 394, 75],\n",
440 " [56, '05:20', '06:17', 320, 377, 57],\n",
441 " [57, '05:22', '05:59', 322, 359, 37],\n",
442 " [58, '05:24', '05:48', 324, 348, 24],\n",
443 " [59, '05:25', '05:40', 325, 340, 15],\n",
444 " [60, '05:26', '06:08', 326, 368, 42],\n",
445 " [61, '05:27', '06:30', 327, 390, 63],\n",
446 " [62, '05:27', '05:54', 327, 354, 27],\n",
447 " [63, '05:28', '05:53', 328, 353, 25],\n",
448 " [64, '05:29', '05:44', 329, 344, 15],\n",
449 " [65, '05:30', '05:40', 330, 340, 10],\n",
450 " [66, '05:30', '05:40', 330, 340, 10],\n",
451 " [67, '05:30', '05:40', 330, 340, 10],\n",
452 " [68, '05:32', '06:53', 332, 413, 81],\n",
453 " [69, '05:33', '07:00', 333, 420, 87],\n",
454 " [70, '05:33', '06:15', 333, 375, 42],\n",
455 " [71, '05:33', '05:47', 333, 347, 14],\n",
456 " [72, '05:37', '06:13', 337, 373, 36],\n",
457 " [73, '05:37', '06:05', 337, 365, 28],\n",
458 " [74, '05:38', '06:33', 338, 393, 55],\n",
459 " [75, '05:38', '06:04', 338, 364, 26],\n",
460 " [76, '05:38', '06:18', 338, 378, 40],\n",
461 " [77, '05:39', '05:54', 339, 354, 15],\n",
462 " [78, '05:40', '05:56', 340, 356, 16],\n",
463 " [79, '05:40', '06:41', 340, 401, 61],\n",
464 " [80, '05:40', '05:50', 340, 350, 10],\n",
465 " [81, '05:41', '06:23', 341, 383, 42],\n",
466 " [82, '05:41', '06:01', 341, 361, 20],\n",
467 " [83, '05:43', '06:08', 343, 368, 25],\n",
468 " [84, '05:44', '07:10', 344, 430, 86],\n",
469 " [85, '05:44', '05:55', 344, 355, 11],\n",
470 " [86, '05:45', '06:44', 345, 404, 59],\n",
471 " [87, '05:47', '06:17', 347, 377, 30],\n",
472 " [88, '05:48', '07:08', 348, 428, 80],\n",
473 " [89, '05:48', '06:30', 348, 390, 42],\n",
474 " [90, '05:50', '06:50', 350, 410, 60],\n",
475 " [91, '05:50', '06:00', 350, 360, 10],\n",
476 " [92, '05:50', '06:00', 350, 360, 10],\n",
477 " [93, '05:50', '06:51', 350, 411, 61],\n",
478 " [94, '05:52', '06:33', 352, 393, 41],\n",
479 " [95, '05:52', '06:36', 352, 396, 44],\n",
480 " [96, '05:52', '06:23', 352, 383, 31],\n",
481 " [97, '05:54', '06:14', 354, 374, 20],\n",
482 " [98, '05:54', '07:20', 354, 440, 86],\n",
483 " [99, '05:55', '06:40', 355, 400, 45],\n",
484 " [100, '05:55', '06:27', 355, 387, 32],\n",
485 " [101, '05:56', '06:35', 356, 395, 39],\n",
486 " [102, '05:56', '06:06', 356, 366, 10],\n",
487 " [103, '05:57', '06:21', 357, 381, 24],\n",
488 " [104, '05:58', '07:23', 358, 443, 85],\n",
489 " [105, '05:58', '06:23', 358, 383, 25],\n",
490 " [106, '05:58', '06:08', 358, 368, 10],\n",
491 " [107, '05:58', '06:43', 358, 403, 45],\n",
492 " [108, '06:00', '06:10', 360, 370, 10],\n",
493 " [109, '06:00', '06:16', 360, 376, 16],\n",
494 " [110, '06:00', '07:01', 360, 421, 61],\n",
495 " [111, '06:01', '07:00', 361, 420, 59],\n",
496 " [112, '06:01', '06:13', 361, 373, 12],\n",
497 " [113, '06:01', '06:45', 361, 405, 44],\n",
498 " [114, '06:03', '06:50', 363, 410, 47],\n",
499 " [115, '06:04', '06:37', 364, 397, 33],\n",
500 " [116, '06:04', '07:30', 364, 450, 86],\n",
501 " [117, '06:05', '06:24', 365, 384, 19],\n",
502 " [118, '06:06', '06:51', 366, 411, 45],\n",
503 " [119, '06:07', '06:43', 367, 403, 36],\n",
504 " [120, '06:08', '07:30', 368, 450, 82],\n",
505 " [121, '06:10', '06:20', 370, 380, 10],\n",
506 " [122, '06:10', '07:17', 370, 437, 67],\n",
507 " [123, '06:11', '06:54', 371, 414, 43],\n",
508 " [124, '06:11', '06:21', 371, 381, 10],\n",
509 " [125, '06:13', '06:38', 373, 398, 25],\n",
510 " [126, '06:13', '06:58', 373, 418, 45],\n",
511 " [127, '06:13', '06:53', 373, 413, 40],\n",
512 " [128, '06:14', '07:03', 374, 423, 49],\n",
513 " [129, '06:14', '06:47', 374, 407, 33],\n",
514 " [130, '06:14', '07:40', 374, 460, 86],\n",
515 " [131, '06:15', '07:15', 375, 435, 60],\n",
516 " [132, '06:16', '06:28', 376, 388, 12],\n",
517 " [133, '06:16', '06:26', 376, 386, 10],\n",
518 " [134, '06:17', '06:34', 377, 394, 17],\n",
519 " [135, '06:18', '07:06', 378, 426, 48],\n",
520 " [136, '06:18', '07:38', 378, 458, 80],\n",
521 " [137, '06:18', '07:02', 378, 422, 44],\n",
522 " [138, '06:19', '06:53', 379, 413, 34],\n",
523 " [139, '06:20', '07:25', 380, 445, 65],\n",
524 " [140, '06:20', '06:36', 380, 396, 16],\n",
525 " [141, '06:20', '06:30', 380, 390, 10],\n",
526 " [142, '06:20', '06:30', 380, 390, 10],\n",
527 " [143, '06:21', '06:49', 381, 409, 28],\n",
528 " [144, '06:22', '07:06', 382, 426, 44],\n",
529 " [145, '06:24', '07:50', 384, 470, 86],\n",
530 " [146, '06:24', '06:57', 384, 417, 33],\n",
531 " [147, '06:26', '07:45', 386, 465, 79],\n",
532 " [148, '06:26', '07:10', 386, 430, 44],\n",
533 " [149, '06:27', '06:44', 387, 404, 17],\n",
534 " [150, '06:28', '06:53', 388, 413, 25],\n",
535 " [151, '06:28', '07:14', 388, 434, 46],\n",
536 " [152, '06:29', '07:03', 389, 423, 34],\n",
537 " [153, '06:30', '06:40', 390, 400, 10],\n",
538 " [154, '06:30', '07:37', 390, 457, 67],\n",
539 " [155, '06:31', '06:43', 391, 403, 12],\n",
540 " [156, '06:33', '07:14', 393, 434, 41],\n",
541 " [157, '06:33', '07:53', 393, 473, 80],\n",
542 " [158, '06:34', '08:16', 394, 496, 102],\n",
543 " [159, '06:34', '07:09', 394, 429, 35],\n",
544 " [160, '06:34', '07:07', 394, 427, 33],\n",
545 " [161, '06:36', '07:21', 396, 441, 45],\n",
546 " [162, '06:37', '07:22', 397, 442, 45],\n",
547 " [163, '06:37', '06:54', 397, 414, 17],\n",
548 " [164, '06:38', '07:30', 398, 450, 52],\n",
549 " [165, '06:38', '07:18', 398, 438, 40],\n",
550 " [166, '06:39', '07:33', 399, 453, 54],\n",
551 " [167, '06:40', '07:52', 400, 472, 72],\n",
552 " [168, '06:40', '06:50', 400, 410, 10],\n",
553 " [169, '06:40', '07:22', 400, 442, 42],\n",
554 " [170, '06:40', '06:56', 400, 416, 16],\n",
555 " [171, '06:41', '08:00', 401, 480, 79],\n",
556 " [172, '06:42', '07:26', 402, 446, 44],\n",
557 " [173, '06:42', '07:13', 402, 433, 31],\n",
558 " [174, '06:43', '07:08', 403, 428, 25],\n",
559 " [175, '06:43', '07:30', 403, 450, 47],\n",
560 " [176, '06:43', '07:23', 403, 443, 40],\n",
561 " [177, '06:44', '07:17', 404, 437, 33],\n",
562 " [178, '06:44', '08:13', 404, 493, 89],\n",
563 " [179, '06:46', '07:01', 406, 421, 15],\n",
564 " [180, '06:46', '06:58', 406, 418, 12],\n",
565 " [181, '06:47', '07:04', 407, 424, 17],\n",
566 " [182, '06:48', '08:15', 408, 495, 87],\n",
567 " [183, '06:48', '07:34', 408, 454, 46],\n",
568 " [184, '06:48', '07:37', 408, 457, 49],\n",
569 " [185, '06:49', '07:43', 409, 463, 54],\n",
570 " [186, '06:50', '08:00', 410, 480, 70],\n",
571 " [187, '06:50', '07:00', 410, 420, 10],\n",
572 " [188, '06:50', '07:05', 410, 425, 15],\n",
573 " [189, '06:51', '07:18', 411, 438, 27],\n",
574 " [190, '06:52', '07:36', 412, 456, 44],\n",
575 " [191, '06:53', '07:37', 413, 457, 44],\n",
576 " [192, '06:54', '08:20', 414, 500, 86],\n",
577 " [193, '06:54', '07:27', 414, 447, 33],\n",
578 " [194, '06:54', '07:20', 414, 440, 26],\n",
579 " [195, '06:56', '08:23', 416, 503, 87],\n",
580 " [196, '06:57', '07:12', 417, 432, 15],\n",
581 " [197, '06:57', '07:58', 417, 478, 61],\n",
582 " [198, '06:57', '07:45', 417, 465, 48],\n",
583 " [199, '06:57', '07:40', 417, 460, 43],\n",
584 " [200, '06:58', '07:23', 418, 443, 25],\n",
585 " [201, '06:59', '07:53', 419, 473, 54],\n",
586 " [202, '06:59', '08:07', 419, 487, 68],\n",
587 " [203, '07:00', '07:10', 420, 430, 10],\n",
588 " [204, '07:00', '07:16', 420, 436, 16],\n",
589 " [205, '07:01', '08:30', 421, 510, 89],\n",
590 " [206, '07:01', '07:13', 421, 433, 12],\n",
591 " [207, '07:01', '07:43', 421, 463, 42],\n",
592 " [208, '07:03', '08:30', 423, 510, 87],\n",
593 " [209, '07:04', '07:37', 424, 457, 33],\n",
594 " [210, '07:04', '07:44', 424, 464, 40],\n",
595 " [211, '07:05', '07:52', 425, 472, 47],\n",
596 " [212, '07:05', '08:05', 425, 485, 60],\n",
597 " [213, '07:05', '07:46', 425, 466, 41],\n",
598 " [214, '07:06', '07:51', 426, 471, 45],\n",
599 " [215, '07:07', '08:08', 427, 488, 61],\n",
600 " [216, '07:07', '07:52', 427, 472, 45],\n",
601 " [217, '07:07', '08:16', 427, 496, 69],\n",
602 " [218, '07:07', '07:27', 427, 447, 20],\n",
603 " [219, '07:09', '07:50', 429, 470, 41],\n",
604 " [220, '07:09', '08:40', 429, 520, 91],\n",
605 " [221, '07:09', '08:03', 429, 483, 54],\n",
606 " [222, '07:10', '07:20', 430, 440, 10],\n",
607 " [223, '07:11', '08:36', 431, 516, 85],\n",
608 " [224, '07:12', '08:00', 432, 480, 48],\n",
609 " [225, '07:12', '07:47', 432, 467, 35],\n",
610 " [226, '07:13', '07:54', 433, 474, 41],\n",
611 " [227, '07:13', '07:38', 433, 458, 25],\n",
612 " [228, '07:14', '07:59', 434, 479, 45],\n",
613 " [229, '07:16', '08:50', 436, 530, 94],\n",
614 " [230, '07:16', '07:28', 436, 448, 12],\n",
615 " [231, '07:17', '07:35', 437, 455, 18],\n",
616 " [232, '07:17', '07:58', 437, 478, 41],\n",
617 " [233, '07:18', '08:06', 438, 486, 48],\n",
618 " [234, '07:18', '08:44', 438, 524, 86],\n",
619 " [235, '07:19', '08:13', 439, 493, 54],\n",
620 " [236, '07:20', '08:02', 440, 482, 42],\n",
621 " [237, '07:20', '08:07', 440, 487, 47],\n",
622 " [238, '07:20', '07:30', 440, 450, 10],\n",
623 " [239, '07:20', '07:57', 440, 477, 37],\n",
624 " [240, '07:20', '07:36', 440, 456, 16],\n",
625 " [241, '07:21', '07:48', 441, 468, 27],\n",
626 " [242, '07:22', '08:06', 442, 486, 44],\n",
627 " [243, '07:22', '08:25', 442, 505, 63],\n",
628 " [244, '07:24', '08:27', 444, 507, 63],\n",
629 " [245, '07:24', '08:05', 444, 485, 41],\n",
630 " [246, '07:26', '08:23', 446, 503, 57],\n",
631 " [247, '07:26', '08:52', 446, 532, 86],\n",
632 " [248, '07:27', '08:07', 447, 487, 40],\n",
633 " [249, '07:27', '07:42', 447, 462, 15],\n",
634 " [250, '07:27', '08:15', 447, 495, 48],\n",
635 " [251, '07:28', '07:53', 448, 473, 25],\n",
636 " [252, '07:28', '08:09', 448, 489, 41],\n",
637 " [253, '07:28', '07:38', 448, 458, 10],\n",
638 " [254, '07:30', '08:35', 450, 515, 65],\n",
639 " [255, '07:31', '07:43', 451, 463, 12],\n",
640 " [256, '07:32', '08:13', 452, 493, 41],\n",
641 " [257, '07:34', '09:00', 454, 540, 86],\n",
642 " [258, '07:34', '08:33', 454, 513, 59],\n",
643 " [259, '07:34', '09:04', 454, 544, 90],\n",
644 " [260, '07:35', '08:22', 455, 502, 47],\n",
645 " [261, '07:35', '07:45', 455, 465, 10],\n",
646 " [262, '07:35', '08:16', 455, 496, 41],\n",
647 " [263, '07:36', '08:17', 456, 497, 41],\n",
648 " [264, '07:36', '08:36', 456, 516, 60],\n",
649 " [265, '07:37', '07:50', 457, 470, 13],\n",
650 " [266, '07:40', '07:56', 460, 476, 16],\n",
651 " [267, '07:40', '08:20', 460, 500, 40],\n",
652 " [268, '07:40', '08:45', 460, 525, 65],\n",
653 " [269, '07:41', '08:39', 461, 519, 58],\n",
654 " [270, '07:41', '07:51', 461, 471, 10],\n",
655 " [271, '07:42', '08:30', 462, 510, 48],\n",
656 " [272, '07:42', '08:21', 462, 501, 39],\n",
657 " [273, '07:43', '08:08', 463, 488, 25],\n",
658 " [274, '07:43', '08:24', 463, 504, 41],\n",
659 " [275, '07:44', '09:10', 464, 550, 86],\n",
660 " [276, '07:44', '08:43', 464, 523, 59],\n",
661 " [277, '07:46', '08:28', 466, 508, 42],\n",
662 " [278, '07:46', '07:58', 466, 478, 12],\n",
663 " [279, '07:47', '08:00', 467, 480, 13],\n",
664 " [280, '07:48', '09:14', 468, 554, 86],\n",
665 " [281, '07:49', '08:32', 469, 512, 43],\n",
666 " [282, '07:50', '08:55', 470, 535, 65],\n",
667 " [283, '07:50', '08:00', 470, 480, 10],\n",
668 " [284, '07:50', '08:37', 470, 517, 47],\n",
669 " [285, '07:50', '08:26', 470, 506, 36],\n",
670 " [286, '07:51', '08:18', 471, 498, 27],\n",
671 " [287, '07:52', '08:21', 472, 501, 29],\n",
672 " [288, '07:53', '08:35', 473, 515, 42],\n",
673 " [289, '07:54', '09:19', 474, 559, 85],\n",
674 " [290, '07:55', '08:53', 475, 533, 58],\n",
675 " [291, '07:56', '08:54', 476, 534, 58],\n",
676 " [292, '07:57', '08:39', 477, 519, 42],\n",
677 " [293, '07:57', '08:10', 477, 490, 13],\n",
678 " [294, '07:58', '08:45', 478, 525, 47],\n",
679 " [295, '07:58', '08:23', 478, 503, 25],\n",
680 " [296, '08:00', '08:10', 480, 490, 10],\n",
681 " [297, '08:00', '09:05', 480, 545, 65],\n",
682 " [298, '08:00', '08:16', 480, 496, 16],\n",
683 " [299, '08:00', '08:35', 480, 515, 35],\n",
684 " [300, '08:01', '08:13', 481, 493, 12],\n",
685 " [301, '08:01', '08:43', 481, 523, 42],\n",
686 " [302, '08:03', '09:26', 483, 566, 83],\n",
687 " [303, '08:04', '09:29', 484, 569, 85],\n",
688 " [304, '08:05', '08:21', 485, 501, 16],\n",
689 " [305, '08:05', '08:47', 485, 527, 42],\n",
690 " [306, '08:06', '08:51', 486, 531, 45],\n",
691 " [307, '08:06', '09:03', 486, 543, 57],\n",
692 " [308, '08:07', '08:20', 487, 500, 13],\n",
693 " [309, '08:08', '08:55', 488, 535, 47],\n",
694 " [310, '08:08', '08:50', 488, 530, 42],\n",
695 " [311, '08:10', '08:45', 490, 525, 35],\n",
696 " [312, '08:10', '09:15', 490, 555, 65],\n",
697 " [313, '08:10', '08:20', 490, 500, 10],\n",
698 " [314, '08:11', '09:41', 491, 581, 90],\n",
699 " [315, '08:12', '08:55', 492, 535, 43],\n",
700 " [316, '08:13', '08:38', 493, 518, 25],\n",
701 " [317, '08:14', '09:38', 494, 578, 84],\n",
702 " [318, '08:15', '08:30', 495, 510, 15],\n",
703 " [319, '08:16', '08:30', 496, 510, 14],\n",
704 " [320, '08:16', '08:28', 496, 508, 12],\n",
705 " [321, '08:16', '09:00', 496, 540, 44],\n",
706 " [322, '08:17', '09:13', 497, 553, 56],\n",
707 " [323, '08:18', '09:16', 498, 556, 58],\n",
708 " [324, '08:18', '09:05', 498, 545, 47],\n",
709 " [325, '08:20', '08:36', 500, 516, 16],\n",
710 " [326, '08:20', '08:55', 500, 535, 35],\n",
711 " [327, '08:20', '09:05', 500, 545, 45],\n",
712 " [328, '08:20', '08:30', 500, 510, 10],\n",
713 " [329, '08:20', '09:25', 500, 565, 65],\n",
714 " [330, '08:21', '08:38', 501, 518, 17],\n",
715 " [331, '08:21', '08:47', 501, 527, 26],\n",
716 " [332, '08:22', '08:45', 502, 525, 23],\n",
717 " [333, '08:23', '09:10', 503, 550, 47],\n",
718 " [334, '08:24', '09:48', 504, 588, 84],\n",
719 " [335, '08:26', '08:46', 506, 526, 20],\n",
720 " [336, '08:27', '09:07', 507, 547, 40],\n",
721 " [337, '08:28', '08:50', 508, 530, 22],\n",
722 " [338, '08:28', '09:56', 508, 596, 88],\n",
723 " [339, '08:28', '09:23', 508, 563, 55],\n",
724 " [340, '08:29', '09:20', 509, 560, 51],\n",
725 " [341, '08:30', '09:05', 510, 545, 35],\n",
726 " [342, '08:30', '08:45', 510, 525, 15],\n",
727 " [343, '08:30', '08:40', 510, 520, 10],\n",
728 " [344, '08:30', '09:35', 510, 575, 65],\n",
729 " [345, '08:31', '08:43', 511, 523, 12],\n",
730 " [346, '08:31', '09:13', 511, 553, 42],\n",
731 " [347, '08:34', '09:58', 514, 598, 84],\n",
732 " [348, '08:35', '08:55', 515, 535, 20],\n",
733 " [349, '08:35', '09:15', 515, 555, 40],\n",
734 " [350, '08:35', '08:45', 515, 525, 10],\n",
735 " [351, '08:36', '08:46', 516, 526, 10],\n",
736 " [352, '08:36', '09:00', 516, 540, 24],\n",
737 " [353, '08:38', '09:20', 518, 560, 42],\n",
738 " [354, '08:38', '09:35', 518, 575, 57],\n",
739 " [355, '08:38', '09:14', 518, 554, 36],\n",
740 " [356, '08:39', '09:33', 519, 573, 54],\n",
741 " [357, '08:40', '09:45', 520, 585, 65],\n",
742 " [358, '08:40', '08:50', 520, 530, 10],\n",
743 " [359, '08:40', '08:56', 520, 536, 16],\n",
744 " [360, '08:42', '09:25', 522, 565, 43],\n",
745 " [361, '08:43', '09:08', 523, 548, 25],\n",
746 " [362, '08:44', '09:35', 524, 575, 51],\n",
747 " [363, '08:45', '09:00', 525, 540, 15],\n",
748 " [364, '08:45', '09:05', 525, 545, 20],\n",
749 " [365, '08:46', '09:24', 526, 564, 38],\n",
750 " [366, '08:46', '08:58', 526, 538, 12],\n",
751 " [367, '08:46', '09:30', 526, 570, 44],\n",
752 " [368, '08:48', '10:11', 528, 611, 83],\n",
753 " [369, '08:48', '10:13', 528, 613, 85],\n",
754 " [370, '08:49', '09:43', 529, 583, 54],\n",
755 " [371, '08:50', '09:30', 530, 570, 40],\n",
756 " [372, '08:50', '10:00', 530, 600, 70],\n",
757 " [373, '08:50', '09:00', 530, 540, 10],\n",
758 " [374, '08:51', '09:17', 531, 557, 26],\n",
759 " [375, '08:53', '09:20', 533, 560, 27],\n",
760 " [376, '08:53', '09:35', 533, 575, 42],\n",
761 " [377, '08:55', '09:34', 535, 574, 39],\n",
762 " [378, '08:55', '09:15', 535, 555, 20],\n",
763 " [379, '08:58', '09:38', 538, 578, 40],\n",
764 " [380, '08:58', '10:26', 538, 626, 88],\n",
765 " [381, '08:59', '09:53', 539, 593, 54],\n",
766 " [382, '08:59', '09:50', 539, 590, 51],\n",
767 " [383, '09:00', '09:35', 540, 575, 35],\n",
768 " [384, '09:00', '09:16', 540, 556, 16],\n",
769 " [385, '09:00', '09:10', 540, 550, 10],\n",
770 " [386, '09:00', '09:16', 540, 556, 16],\n",
771 " [387, '09:01', '09:13', 541, 553, 12],\n",
772 " [388, '09:03', '09:45', 543, 585, 42],\n",
773 " [389, '09:03', '10:28', 543, 628, 85],\n",
774 " [390, '09:05', '09:44', 545, 584, 39],\n",
775 " [391, '09:05', '09:25', 545, 565, 20],\n",
776 " [392, '09:08', '09:53', 548, 593, 45],\n",
777 " [393, '09:08', '10:04', 548, 604, 56],\n",
778 " [394, '09:09', '10:03', 549, 603, 54],\n",
779 " [395, '09:10', '10:15', 550, 615, 65],\n",
780 " [396, '09:10', '09:20', 550, 560, 10],\n",
781 " [397, '09:11', '09:38', 551, 578, 27],\n",
782 " [398, '09:13', '10:00', 553, 600, 47],\n",
783 " [399, '09:14', '09:39', 554, 579, 25],\n",
784 " [400, '09:14', '10:05', 554, 605, 51],\n",
785 " [401, '09:15', '09:54', 555, 594, 39],\n",
786 " [402, '09:16', '09:28', 556, 568, 12],\n",
787 " [403, '09:18', '10:43', 558, 643, 85],\n",
788 " [404, '09:18', '10:41', 558, 641, 83],\n",
789 " [405, '09:18', '09:58', 558, 598, 40],\n",
790 " [406, '09:19', '10:13', 559, 613, 54],\n",
791 " [407, '09:20', '09:30', 560, 570, 10],\n",
792 " [408, '09:20', '09:36', 560, 576, 16],\n",
793 " [409, '09:21', '09:47', 561, 587, 26],\n",
794 " [410, '09:23', '10:30', 563, 630, 67],\n",
795 " [411, '09:23', '10:05', 563, 605, 42],\n",
796 " [412, '09:23', '09:49', 563, 589, 26],\n",
797 " [413, '09:24', '09:35', 564, 575, 11],\n",
798 " [414, '09:25', '09:35', 565, 575, 10],\n",
799 " [415, '09:25', '10:04', 565, 604, 39],\n",
800 " [416, '09:28', '10:08', 568, 608, 40],\n",
801 " [417, '09:29', '09:45', 569, 585, 16],\n",
802 " [418, '09:29', '10:20', 569, 620, 51],\n",
803 " [419, '09:29', '10:56', 569, 656, 87],\n",
804 " [420, '09:29', '10:23', 569, 623, 54],\n",
805 " [421, '09:30', '09:40', 570, 580, 10],\n",
806 " [422, '09:31', '09:43', 571, 583, 12],\n",
807 " [423, '09:33', '10:58', 573, 658, 85],\n",
808 " [424, '09:33', '10:15', 573, 615, 42],\n",
809 " [425, '09:34', '09:45', 574, 585, 11],\n",
810 " [426, '09:35', '10:14', 575, 614, 39],\n",
811 " [427, '09:38', '10:45', 578, 645, 67],\n",
812 " [428, '09:39', '10:33', 579, 633, 54],\n",
813 " [429, '09:40', '09:56', 580, 596, 16],\n",
814 " [430, '09:40', '09:50', 580, 590, 10],\n",
815 " [431, '09:41', '10:08', 581, 608, 27],\n",
816 " [432, '09:41', '10:23', 581, 623, 42],\n",
817 " [433, '09:44', '10:35', 584, 635, 51],\n",
818 " [434, '09:44', '11:11', 584, 671, 87],\n",
819 " [435, '09:44', '09:55', 584, 595, 11],\n",
820 " [436, '09:45', '10:24', 585, 624, 39],\n",
821 " [437, '09:46', '09:58', 586, 598, 12],\n",
822 " [438, '09:48', '10:30', 588, 630, 42],\n",
823 " [439, '09:48', '11:13', 588, 673, 85],\n",
824 " [440, '09:48', '10:04', 588, 604, 16],\n",
825 " [441, '09:49', '10:43', 589, 643, 54],\n",
826 " [442, '09:50', '10:00', 590, 600, 10],\n",
827 " [443, '09:51', '10:17', 591, 617, 26],\n",
828 " [444, '09:53', '10:49', 593, 649, 56],\n",
829 " [445, '09:53', '11:00', 593, 660, 67],\n",
830 " [446, '09:54', '10:05', 594, 605, 11],\n",
831 " [447, '09:55', '10:34', 595, 634, 39],\n",
832 " [448, '09:56', '10:38', 596, 638, 42],\n",
833 " [449, '09:57', '10:20', 597, 620, 23],\n",
834 " [450, '09:59', '11:26', 599, 686, 87],\n",
835 " [451, '09:59', '10:50', 599, 650, 51],\n",
836 " [452, '09:59', '10:53', 599, 653, 54],\n",
837 " [453, '10:00', '10:16', 600, 616, 16],\n",
838 " [454, '10:00', '10:10', 600, 610, 10],\n",
839 " [455, '10:01', '10:13', 601, 613, 12],\n",
840 " [456, '10:03', '11:28', 603, 688, 85],\n",
841 " [457, '10:03', '10:45', 603, 645, 42],\n",
842 " [458, '10:04', '10:15', 604, 615, 11],\n",
843 " [459, '10:05', '10:44', 605, 644, 39],\n",
844 " [460, '10:08', '11:15', 608, 675, 67],\n",
845 " [461, '10:09', '11:03', 609, 663, 54],\n",
846 " [462, '10:10', '10:20', 610, 620, 10],\n",
847 " [463, '10:11', '10:38', 611, 638, 27],\n",
848 " [464, '10:11', '10:53', 611, 653, 42],\n",
849 " [465, '10:14', '11:05', 614, 665, 51],\n",
850 " [466, '10:14', '11:41', 614, 701, 87],\n",
851 " [467, '10:14', '10:25', 614, 625, 11],\n",
852 " [468, '10:15', '10:54', 615, 654, 39],\n",
853 " [469, '10:16', '10:28', 616, 628, 12],\n",
854 " [470, '10:18', '11:43', 618, 703, 85],\n",
855 " [471, '10:18', '11:00', 618, 660, 42],\n",
856 " [472, '10:19', '11:13', 619, 673, 54],\n",
857 " [473, '10:20', '10:30', 620, 630, 10],\n",
858 " [474, '10:20', '10:36', 620, 636, 16],\n",
859 " [475, '10:21', '10:47', 621, 647, 26],\n",
860 " [476, '10:23', '11:30', 623, 690, 67],\n",
861 " [477, '10:23', '10:45', 623, 645, 22],\n",
862 " [478, '10:24', '10:35', 624, 635, 11],\n",
863 " [479, '10:25', '11:04', 625, 664, 39],\n",
864 " [480, '10:26', '11:08', 626, 668, 42],\n",
865 " [481, '10:29', '11:20', 629, 680, 51],\n",
866 " [482, '10:29', '11:23', 629, 683, 54],\n",
867 " [483, '10:29', '11:56', 629, 716, 87],\n",
868 " [484, '10:30', '10:40', 630, 640, 10],\n",
869 " [485, '10:31', '10:43', 631, 643, 12],\n",
870 " [486, '10:33', '11:15', 633, 675, 42],\n",
871 " [487, '10:33', '11:58', 633, 718, 85],\n",
872 " [488, '10:34', '10:45', 634, 645, 11],\n",
873 " [489, '10:35', '11:14', 635, 674, 39],\n",
874 " [490, '10:38', '11:45', 638, 705, 67],\n",
875 " [491, '10:39', '11:33', 639, 693, 54],\n",
876 " [492, '10:40', '10:50', 640, 650, 10],\n",
877 " [493, '10:40', '10:56', 640, 656, 16],\n",
878 " [494, '10:41', '11:23', 641, 683, 42],\n",
879 " [495, '10:41', '11:08', 641, 668, 27],\n",
880 " [496, '10:44', '12:11', 644, 731, 87],\n",
881 " [497, '10:44', '11:35', 644, 695, 51],\n",
882 " [498, '10:44', '10:55', 644, 655, 11],\n",
883 " [499, '10:45', '11:24', 645, 684, 39],\n",
884 " [500, '10:46', '10:58', 646, 658, 12],\n",
885 " [501, '10:48', '12:13', 648, 733, 85],\n",
886 " [502, '10:48', '11:30', 648, 690, 42],\n",
887 " [503, '10:49', '11:43', 649, 703, 54],\n",
888 " [504, '10:50', '11:00', 650, 660, 10],\n",
889 " [505, '10:51', '11:17', 651, 677, 26],\n",
890 " [506, '10:53', '12:00', 653, 720, 67],\n",
891 " [507, '10:53', '11:20', 653, 680, 27],\n",
892 " [508, '10:54', '11:05', 654, 665, 11],\n",
893 " [509, '10:55', '11:34', 655, 694, 39],\n",
894 " [510, '10:56', '11:38', 656, 698, 42],\n",
895 " [511, '10:59', '11:14', 659, 674, 15],\n",
896 " [512, '10:59', '12:26', 659, 746, 87],\n",
897 " [513, '10:59', '11:53', 659, 713, 54],\n",
898 " [514, '10:59', '11:50', 659, 710, 51],\n",
899 " [515, '11:00', '11:16', 660, 676, 16],\n",
900 " [516, '11:00', '11:10', 660, 670, 10],\n",
901 " [517, '11:01', '11:13', 661, 673, 12],\n",
902 " [518, '11:03', '11:45', 663, 705, 42],\n",
903 " [519, '11:03', '12:28', 663, 748, 85],\n",
904 " [520, '11:04', '11:15', 664, 675, 11],\n",
905 " [521, '11:05', '11:44', 665, 704, 39],\n",
906 " [522, '11:08', '12:15', 668, 735, 67],\n",
907 " [523, '11:09', '12:03', 669, 723, 54],\n",
908 " [524, '11:10', '11:20', 670, 680, 10],\n",
909 " [525, '11:11', '11:38', 671, 698, 27],\n",
910 " [526, '11:11', '11:53', 671, 713, 42],\n",
911 " [527, '11:14', '11:25', 674, 685, 11],\n",
912 " [528, '11:14', '12:05', 674, 725, 51],\n",
913 " [529, '11:14', '12:38', 674, 758, 84],\n",
914 " [530, '11:14', '12:41', 674, 761, 87],\n",
915 " [531, '11:15', '11:54', 675, 714, 39],\n",
916 " [532, '11:16', '11:28', 676, 688, 12],\n",
917 " [533, '11:18', '12:00', 678, 720, 42],\n",
918 " [534, '11:19', '12:13', 679, 733, 54],\n",
919 " [535, '11:20', '11:30', 680, 690, 10],\n",
920 " [536, '11:20', '11:36', 680, 696, 16],\n",
921 " [537, '11:21', '11:47', 681, 707, 26],\n",
922 " [538, '11:23', '12:30', 683, 750, 67],\n",
923 " [539, '11:23', '11:49', 683, 709, 26],\n",
924 " [540, '11:24', '12:48', 684, 768, 84],\n",
925 " [541, '11:24', '11:35', 684, 695, 11],\n",
926 " [542, '11:25', '12:04', 685, 724, 39],\n",
927 " [543, '11:26', '12:08', 686, 728, 42],\n",
928 " [544, '11:29', '11:44', 689, 704, 15],\n",
929 " [545, '11:29', '12:23', 689, 743, 54],\n",
930 " [546, '11:29', '12:20', 689, 740, 51],\n",
931 " [547, '11:29', '12:54', 689, 774, 85],\n",
932 " [548, '11:30', '11:40', 690, 700, 10],\n",
933 " [549, '11:31', '11:43', 691, 703, 12],\n",
934 " [550, '11:33', '12:15', 693, 735, 42],\n",
935 " [551, '11:34', '12:58', 694, 778, 84],\n",
936 " [552, '11:34', '11:45', 694, 705, 11],\n",
937 " [553, '11:35', '12:14', 695, 734, 39],\n",
938 " [554, '11:38', '12:45', 698, 765, 67],\n",
939 " [555, '11:39', '12:33', 699, 753, 54],\n",
940 " [556, '11:40', '11:56', 700, 716, 16],\n",
941 " [557, '11:40', '11:50', 700, 710, 10],\n",
942 " [558, '11:41', '12:08', 701, 728, 27],\n",
943 " [559, '11:41', '12:23', 701, 743, 42],\n",
944 " [560, '11:44', '11:55', 704, 715, 11],\n",
945 " [561, '11:44', '13:14', 704, 794, 90],\n",
946 " [562, '11:44', '13:08', 704, 788, 84],\n",
947 " [563, '11:44', '12:35', 704, 755, 51],\n",
948 " [564, '11:45', '12:24', 705, 744, 39],\n",
949 " [565, '11:46', '11:58', 706, 718, 12],\n",
950 " [566, '11:48', '12:30', 708, 750, 42],\n",
951 " [567, '11:49', '12:43', 709, 763, 54],\n",
952 " [568, '11:50', '12:00', 710, 720, 10],\n",
953 " [569, '11:51', '12:17', 711, 737, 26],\n",
954 " [570, '11:53', '12:49', 713, 769, 56],\n",
955 " [571, '11:53', '13:00', 713, 780, 67],\n",
956 " [572, '11:54', '13:18', 714, 798, 84],\n",
957 " [573, '11:54', '12:05', 714, 725, 11],\n",
958 " [574, '11:55', '12:40', 715, 760, 45],\n",
959 " [575, '11:55', '12:34', 715, 754, 39],\n",
960 " [576, '11:56', '12:35', 716, 755, 39],\n",
961 " [577, '11:57', '12:20', 717, 740, 23],\n",
962 " [578, '11:58', '12:29', 718, 749, 31],\n",
963 " [579, '11:59', '12:50', 719, 770, 51],\n",
964 " [580, '11:59', '12:53', 719, 773, 54],\n",
965 " [581, '11:59', '13:24', 719, 804, 85],\n",
966 " [582, '11:59', '12:14', 719, 734, 15],\n",
967 " [583, '12:00', '12:16', 720, 736, 16],\n",
968 " [584, '12:00', '12:10', 720, 730, 10],\n",
969 " [585, '12:01', '12:45', 721, 765, 44],\n",
970 " [586, '12:01', '12:13', 721, 733, 12],\n",
971 " [587, '12:03', '12:50', 723, 770, 47],\n",
972 " [588, '12:04', '12:15', 724, 735, 11],\n",
973 " [589, '12:04', '13:04', 724, 784, 60],\n",
974 " [590, '12:04', '13:28', 724, 808, 84],\n",
975 " [591, '12:05', '12:44', 725, 764, 39],\n",
976 " [592, '12:08', '13:11', 728, 791, 63],\n",
977 " [593, '12:08', '12:39', 728, 759, 31],\n",
978 " [594, '12:09', '13:03', 729, 783, 54],\n",
979 " [595, '12:10', '12:20', 730, 740, 10],\n",
980 " [596, '12:11', '12:55', 731, 775, 44],\n",
981 " [597, '12:11', '12:38', 731, 758, 27],\n",
982 " [598, '12:14', '13:05', 734, 785, 51],\n",
983 " [599, '12:14', '12:25', 734, 745, 11],\n",
984 " [600, '12:14', '13:44', 734, 824, 90],\n",
985 " [601, '12:14', '13:38', 734, 818, 84],\n",
986 " [602, '12:15', '12:54', 735, 774, 39],\n",
987 " [603, '12:16', '12:28', 736, 748, 12],\n",
988 " [604, '12:18', '13:00', 738, 780, 42],\n",
989 " [605, '12:19', '13:13', 739, 793, 54],\n",
990 " [606, '12:20', '12:30', 740, 750, 10],\n",
991 " [607, '12:20', '13:31', 740, 811, 71],\n",
992 " [608, '12:20', '12:30', 740, 750, 10],\n",
993 " [609, '12:20', '12:36', 740, 756, 16],\n",
994 " [610, '12:21', '12:47', 741, 767, 26],\n",
995 " [611, '12:23', '12:45', 743, 765, 22],\n",
996 " [612, '12:24', '12:35', 744, 755, 11],\n",
997 " [613, '12:24', '13:48', 744, 828, 84],\n",
998 " [614, '12:25', '13:10', 745, 790, 45],\n",
999 " [615, '12:25', '13:04', 745, 784, 39],\n",
1000 " [616, '12:26', '13:05', 746, 785, 39],\n",
1001 " [617, '12:28', '13:54', 748, 834, 86],\n",
1002 " [618, '12:28', '12:38', 748, 758, 10],\n",
1003 " [619, '12:28', '13:15', 748, 795, 47],\n",
1004 " [620, '12:29', '13:23', 749, 803, 54],\n",
1005 " [621, '12:30', '13:41', 750, 821, 71],\n",
1006 " [622, '12:30', '12:40', 750, 760, 10],\n",
1007 " [623, '12:31', '13:15', 751, 795, 44],\n",
1008 " [624, '12:31', '12:43', 751, 763, 12],\n",
1009 " [625, '12:33', '12:48', 753, 768, 15],\n",
1010 " [626, '12:33', '13:20', 753, 800, 47],\n",
1011 " [627, '12:34', '13:58', 754, 838, 84],\n",
1012 " [628, '12:34', '13:34', 754, 814, 60],\n",
1013 " [629, '12:34', '12:45', 754, 765, 11],\n",
1014 " [630, '12:35', '13:14', 755, 794, 39],\n",
1015 " [631, '12:38', '13:25', 758, 805, 47],\n",
1016 " [632, '12:38', '13:25', 758, 805, 47],\n",
1017 " [633, '12:38', '14:04', 758, 844, 86],\n",
1018 " [634, '12:39', '13:33', 759, 813, 54],\n",
1019 " [635, '12:40', '13:51', 760, 831, 71],\n",
1020 " [636, '12:40', '12:50', 760, 770, 10],\n",
1021 " [637, '12:40', '12:56', 760, 776, 16],\n",
1022 " [638, '12:41', '13:08', 761, 788, 27],\n",
1023 " [639, '12:43', '13:30', 763, 810, 47],\n",
1024 " [640, '12:44', '12:55', 764, 775, 11],\n",
1025 " [641, '12:44', '14:08', 764, 848, 84],\n",
1026 " [642, '12:45', '13:24', 765, 804, 39],\n",
1027 " [643, '12:46', '12:58', 766, 778, 12],\n",
1028 " [644, '12:46', '13:21', 766, 801, 35],\n",
1029 " [645, '12:48', '14:14', 768, 854, 86],\n",
1030 " [646, '12:48', '13:35', 768, 815, 47],\n",
1031 " [647, '12:48', '12:58', 768, 778, 10],\n",
1032 " [648, '12:48', '13:35', 768, 815, 47],\n",
1033 " [649, '12:49', '13:43', 769, 823, 54],\n",
1034 " [650, '12:50', '14:01', 770, 841, 71],\n",
1035 " [651, '12:50', '13:00', 770, 780, 10],\n",
1036 " [652, '12:50', '13:00', 770, 780, 10],\n",
1037 " [653, '12:51', '13:17', 771, 797, 26],\n",
1038 " [654, '12:53', '13:20', 773, 800, 27],\n",
1039 " [655, '12:53', '13:24', 773, 804, 31],\n",
1040 " [656, '12:53', '13:40', 773, 820, 47],\n",
1041 " [657, '12:54', '14:18', 774, 858, 84],\n",
1042 " [658, '12:54', '13:05', 774, 785, 11],\n",
1043 " [659, '12:55', '13:34', 775, 814, 39],\n",
1044 " [660, '12:58', '14:24', 778, 864, 86],\n",
1045 " [661, '12:58', '13:25', 778, 805, 27],\n",
1046 " [662, '12:58', '13:45', 778, 825, 47],\n",
1047 " [663, '12:58', '13:45', 778, 825, 47],\n",
1048 " [664, '12:59', '13:53', 779, 833, 54],\n",
1049 " [665, '13:00', '13:10', 780, 790, 10],\n",
1050 " [666, '13:00', '13:16', 780, 796, 16],\n",
1051 " [667, '13:00', '14:11', 780, 851, 71],\n",
1052 " [668, '13:01', '13:13', 781, 793, 12],\n",
1053 " [669, '13:03', '13:34', 783, 814, 31],\n",
1054 " [670, '13:03', '13:50', 783, 830, 47],\n",
1055 " [671, '13:04', '13:15', 784, 795, 11],\n",
1056 " [672, '13:04', '14:28', 784, 868, 84],\n",
1057 " [673, '13:05', '13:44', 785, 824, 39],\n",
1058 " [674, '13:08', '13:55', 788, 835, 47],\n",
1059 " [675, '13:08', '14:34', 788, 874, 86],\n",
1060 " [676, '13:08', '13:55', 788, 835, 47],\n",
1061 " [677, '13:09', '14:03', 789, 843, 54],\n",
1062 " [678, '13:10', '13:20', 790, 800, 10],\n",
1063 " [679, '13:10', '14:21', 790, 861, 71],\n",
1064 " [680, '13:13', '14:00', 793, 840, 47],\n",
1065 " [681, '13:13', '13:40', 793, 820, 27],\n",
1066 " [682, '13:14', '14:38', 794, 878, 84],\n",
1067 " [683, '13:14', '13:25', 794, 805, 11],\n",
1068 " [684, '13:15', '13:54', 795, 834, 39],\n",
1069 " [685, '13:16', '13:28', 796, 808, 12],\n",
1070 " [686, '13:18', '14:05', 798, 845, 47],\n",
1071 " [687, '13:18', '14:44', 798, 884, 86],\n",
1072 " [688, '13:18', '14:05', 798, 845, 47],\n",
1073 " [689, '13:19', '14:13', 799, 853, 54],\n",
1074 " [690, '13:20', '13:36', 800, 816, 16],\n",
1075 " [691, '13:20', '14:31', 800, 871, 71],\n",
1076 " [692, '13:20', '13:30', 800, 810, 10],\n",
1077 " [693, '13:21', '13:47', 801, 827, 26],\n",
1078 " [694, '13:23', '14:10', 803, 850, 47],\n",
1079 " [695, '13:23', '13:49', 803, 829, 26],\n",
1080 " [696, '13:24', '14:48', 804, 888, 84],\n",
1081 " [697, '13:24', '13:35', 804, 815, 11],\n",
1082 " [698, '13:25', '14:04', 805, 844, 39],\n",
1083 " [699, '13:28', '14:15', 808, 855, 47],\n",
1084 " [700, '13:28', '14:54', 808, 894, 86],\n",
1085 " [701, '13:28', '13:55', 808, 835, 27],\n",
1086 " [702, '13:28', '14:15', 808, 855, 47],\n",
1087 " [703, '13:29', '14:23', 809, 863, 54],\n",
1088 " [704, '13:30', '13:40', 810, 820, 10],\n",
1089 " [705, '13:30', '14:41', 810, 881, 71],\n",
1090 " [706, '13:31', '13:43', 811, 823, 12],\n",
1091 " [707, '13:33', '14:20', 813, 860, 47],\n",
1092 " [708, '13:34', '14:58', 814, 898, 84],\n",
1093 " [709, '13:34', '13:45', 814, 825, 11],\n",
1094 " [710, '13:35', '14:14', 815, 854, 39],\n",
1095 " [711, '13:38', '14:25', 818, 865, 47],\n",
1096 " [712, '13:38', '14:25', 818, 865, 47],\n",
1097 " [713, '13:38', '15:04', 818, 904, 86],\n",
1098 " [714, '13:39', '14:33', 819, 873, 54],\n",
1099 " [715, '13:40', '13:50', 820, 830, 10],\n",
1100 " [716, '13:40', '13:56', 820, 836, 16],\n",
1101 " [717, '13:40', '14:51', 820, 891, 71],\n",
1102 " [718, '13:43', '14:30', 823, 870, 47],\n",
1103 " [719, '13:43', '14:10', 823, 850, 27],\n",
1104 " [720, '13:44', '15:09', 824, 909, 85],\n",
1105 " [721, '13:44', '13:55', 824, 835, 11],\n",
1106 " [722, '13:45', '14:24', 825, 864, 39],\n",
1107 " [723, '13:46', '13:58', 826, 838, 12],\n",
1108 " [724, '13:48', '14:35', 828, 875, 47],\n",
1109 " [725, '13:48', '15:14', 828, 914, 86],\n",
1110 " [726, '13:48', '14:35', 828, 875, 47],\n",
1111 " [727, '13:49', '14:43', 829, 883, 54],\n",
1112 " [728, '13:50', '14:00', 830, 840, 10],\n",
1113 " [729, '13:50', '15:01', 830, 901, 71],\n",
1114 " [730, '13:51', '14:17', 831, 857, 26],\n",
1115 " [731, '13:53', '14:40', 833, 880, 47],\n",
1116 " [732, '13:53', '14:49', 833, 889, 56],\n",
1117 " [733, '13:54', '14:05', 834, 845, 11],\n",
1118 " [734, '13:54', '15:19', 834, 919, 85],\n",
1119 " [735, '13:55', '14:34', 835, 874, 39],\n",
1120 " [736, '13:57', '14:20', 837, 860, 23],\n",
1121 " [737, '13:58', '15:24', 838, 924, 86],\n",
1122 " [738, '13:58', '14:45', 838, 885, 47],\n",
1123 " [739, '13:58', '14:45', 838, 885, 47],\n",
1124 " [740, '13:58', '14:25', 838, 865, 27],\n",
1125 " [741, '13:59', '14:53', 839, 893, 54],\n",
1126 " [742, '14:00', '14:16', 840, 856, 16],\n",
1127 " [743, '14:00', '14:10', 840, 850, 10],\n",
1128 " [744, '14:00', '15:11', 840, 911, 71],\n",
1129 " [745, '14:01', '14:13', 841, 853, 12],\n",
1130 " [746, '14:03', '14:50', 843, 890, 47],\n",
1131 " [747, '14:04', '14:15', 844, 855, 11],\n",
1132 " [748, '14:04', '15:29', 844, 929, 85],\n",
1133 " [749, '14:05', '14:44', 845, 884, 39],\n",
1134 " [750, '14:08', '14:55', 848, 895, 47],\n",
1135 " [751, '14:08', '14:55', 848, 895, 47],\n",
1136 " [752, '14:08', '15:34', 848, 934, 86],\n",
1137 " [753, '14:09', '15:03', 849, 903, 54],\n",
1138 " [754, '14:10', '15:21', 850, 921, 71],\n",
1139 " [755, '14:10', '14:20', 850, 860, 10],\n",
1140 " [756, '14:13', '15:00', 853, 900, 47],\n",
1141 " [757, '14:13', '14:40', 853, 880, 27],\n",
1142 " [758, '14:14', '15:40', 854, 940, 86],\n",
1143 " [759, '14:14', '14:25', 854, 865, 11],\n",
1144 " [760, '14:15', '14:54', 855, 894, 39],\n",
1145 " [761, '14:16', '14:28', 856, 868, 12],\n",
1146 " [762, '14:18', '15:05', 858, 905, 47],\n",
1147 " [763, '14:18', '15:44', 858, 944, 86],\n",
1148 " [764, '14:18', '15:05', 858, 905, 47],\n",
1149 " [765, '14:19', '15:13', 859, 913, 54],\n",
1150 " [766, '14:20', '15:31', 860, 931, 71],\n",
1151 " [767, '14:20', '14:30', 860, 870, 10],\n",
1152 " [768, '14:20', '14:36', 860, 876, 16],\n",
1153 " [769, '14:21', '14:47', 861, 887, 26],\n",
1154 " [770, '14:23', '15:10', 863, 910, 47],\n",
1155 " [771, '14:23', '14:45', 863, 885, 22],\n",
1156 " [772, '14:24', '15:50', 864, 950, 86],\n",
1157 " [773, '14:24', '14:35', 864, 875, 11],\n",
1158 " [774, '14:25', '15:02', 865, 902, 37],\n",
1159 " [775, '14:26', '14:52', 866, 892, 26],\n",
1160 " [776, '14:28', '15:15', 868, 915, 47],\n",
1161 " [777, '14:28', '14:55', 868, 895, 27],\n",
1162 " [778, '14:28', '15:54', 868, 954, 86],\n",
1163 " [779, '14:28', '15:15', 868, 915, 47],\n",
1164 " [780, '14:29', '15:23', 869, 923, 54],\n",
1165 " [781, '14:30', '15:41', 870, 941, 71],\n",
1166 " [782, '14:30', '14:40', 870, 880, 10],\n",
1167 " [783, '14:31', '14:43', 871, 883, 12],\n",
1168 " [784, '14:33', '15:20', 873, 920, 47],\n",
1169 " [785, '14:34', '16:00', 874, 960, 86],\n",
1170 " [786, '14:34', '14:45', 874, 885, 11],\n",
1171 " [787, '14:35', '15:11', 875, 911, 36],\n",
1172 " [788, '14:38', '15:25', 878, 925, 47],\n",
1173 " [789, '14:38', '15:25', 878, 925, 47],\n",
1174 " [790, '14:38', '16:04', 878, 964, 86],\n",
1175 " [791, '14:39', '15:33', 879, 933, 54],\n",
1176 " [792, '14:40', '14:50', 880, 890, 10],\n",
1177 " [793, '14:40', '15:51', 880, 951, 71],\n",
1178 " [794, '14:40', '14:56', 880, 896, 16],\n",
1179 " [795, '14:43', '15:30', 883, 930, 47],\n",
1180 " [796, '14:43', '15:10', 883, 910, 27],\n",
1181 " [797, '14:44', '15:00', 884, 900, 16],\n",
1182 " [798, '14:44', '16:10', 884, 970, 86],\n",
1183 " [799, '14:45', '15:19', 885, 919, 34],\n",
1184 " [800, '14:46', '14:58', 886, 898, 12],\n",
1185 " [801, '14:48', '15:35', 888, 935, 47],\n",
1186 " [802, '14:48', '15:35', 888, 935, 47],\n",
1187 " [803, '14:48', '17:04', 888, 1024, 136],\n",
1188 " [804, '14:49', '15:43', 889, 943, 54],\n",
1189 " [805, '14:50', '16:01', 890, 961, 71],\n",
1190 " [806, '14:50', '15:00', 890, 900, 10],\n",
1191 " [807, '14:51', '15:17', 891, 917, 26],\n",
1192 " [808, '14:52', '15:27', 892, 927, 35],\n",
1193 " [809, '14:52', '15:21', 892, 921, 29],\n",
1194 " [810, '14:53', '15:40', 893, 940, 47],\n",
1195 " [811, '14:54', '15:08', 894, 908, 14],\n",
1196 " [812, '14:54', '16:20', 894, 980, 86],\n",
1197 " [813, '14:58', '16:24', 898, 984, 86],\n",
1198 " [814, '14:58', '15:45', 898, 945, 47],\n",
1199 " [815, '14:58', '15:25', 898, 925, 27],\n",
1200 " [816, '14:58', '15:45', 898, 945, 47],\n",
1201 " [817, '14:59', '15:53', 899, 953, 54],\n",
1202 " [818, '15:00', '15:10', 900, 910, 10],\n",
1203 " [819, '15:00', '15:35', 900, 935, 35],\n",
1204 " [820, '15:00', '16:11', 900, 971, 71],\n",
1205 " [821, '15:00', '15:16', 900, 916, 16],\n",
1206 " [822, '15:01', '15:13', 901, 913, 12],\n",
1207 " [823, '15:02', '15:16', 902, 916, 14],\n",
1208 " [824, '15:03', '15:50', 903, 950, 47],\n",
1209 " [825, '15:04', '16:30', 904, 990, 86],\n",
1210 " [826, '15:08', '16:34', 908, 994, 86],\n",
1211 " [827, '15:08', '15:55', 908, 955, 47],\n",
1212 " [828, '15:08', '15:55', 908, 955, 47],\n",
1213 " [829, '15:08', '15:45', 908, 945, 37],\n",
1214 " [830, '15:09', '16:14', 909, 974, 65],\n",
1215 " [831, '15:09', '16:03', 909, 963, 54],\n",
1216 " [832, '15:10', '16:21', 910, 981, 71],\n",
1217 " [833, '15:10', '15:20', 910, 920, 10],\n",
1218 " [834, '15:11', '15:24', 911, 924, 13],\n",
1219 " [835, '15:12', '15:36', 912, 936, 24],\n",
1220 " [836, '15:13', '16:00', 913, 960, 47],\n",
1221 " [837, '15:13', '15:40', 913, 940, 27],\n",
1222 " [838, '15:14', '16:40', 914, 1000, 86],\n",
1223 " [839, '15:16', '15:28', 916, 928, 12],\n",
1224 " [840, '15:16', '15:55', 916, 955, 39],\n",
1225 " [841, '15:18', '16:05', 918, 965, 47],\n",
1226 " [842, '15:18', '16:44', 918, 1004, 86],\n",
1227 " [843, '15:18', '16:05', 918, 965, 47],\n",
1228 " [844, '15:19', '16:13', 919, 973, 54],\n",
1229 " [845, '15:19', '15:34', 919, 934, 15],\n",
1230 " [846, '15:20', '15:30', 920, 930, 10],\n",
1231 " [847, '15:20', '16:31', 920, 991, 71],\n",
1232 " [848, '15:20', '15:36', 920, 936, 16],\n",
1233 " [849, '15:21', '15:47', 921, 947, 26],\n",
1234 " [850, '15:21', '16:06', 921, 966, 45],\n",
1235 " [851, '15:23', '16:10', 923, 970, 47],\n",
1236 " [852, '15:24', '16:50', 924, 1010, 86],\n",
1237 " [853, '15:24', '16:05', 924, 965, 41],\n",
1238 " [854, '15:27', '15:51', 927, 951, 24],\n",
1239 " [855, '15:27', '15:44', 927, 944, 17],\n",
1240 " [856, '15:28', '16:15', 928, 975, 47],\n",
1241 " [857, '15:28', '16:54', 928, 1014, 86],\n",
1242 " [858, '15:28', '16:15', 928, 975, 47],\n",
1243 " [859, '15:28', '15:55', 928, 955, 27],\n",
1244 " [860, '15:29', '16:23', 929, 983, 54],\n",
1245 " [861, '15:30', '16:41', 930, 1001, 71],\n",
1246 " [862, '15:30', '15:40', 930, 940, 10],\n",
1247 " [863, '15:31', '15:43', 931, 943, 12],\n",
1248 " [864, '15:33', '16:20', 933, 980, 47],\n",
1249 " [865, '15:34', '17:00', 934, 1020, 86],\n",
1250 " [866, '15:34', '16:15', 934, 975, 41],\n",
1251 " [867, '15:35', '15:54', 935, 954, 19],\n",
1252 " [868, '15:36', '16:21', 936, 981, 45],\n",
1253 " [869, '15:38', '16:25', 938, 985, 47],\n",
1254 " [870, '15:38', '16:25', 938, 985, 47],\n",
1255 " [871, '15:38', '16:39', 938, 999, 61],\n",
1256 " [872, '15:39', '16:33', 939, 993, 54],\n",
1257 " [873, '15:40', '15:50', 940, 950, 10],\n",
1258 " [874, '15:40', '16:51', 940, 1011, 71],\n",
1259 " [875, '15:40', '15:56', 940, 956, 16],\n",
1260 " [876, '15:43', '16:10', 943, 970, 27],\n",
1261 " [877, '15:43', '16:30', 943, 990, 47],\n",
1262 " [878, '15:44', '17:10', 944, 1030, 86],\n",
1263 " [879, '15:44', '16:25', 944, 985, 41],\n",
1264 " [880, '15:45', '16:04', 945, 964, 19],\n",
1265 " [881, '15:46', '15:58', 946, 958, 12],\n",
1266 " [882, '15:48', '16:35', 948, 995, 47],\n",
1267 " [883, '15:48', '16:35', 948, 995, 47],\n",
1268 " [884, '15:48', '17:14', 948, 1034, 86],\n",
1269 " [885, '15:49', '16:43', 949, 1003, 54],\n",
1270 " [886, '15:50', '16:00', 950, 960, 10],\n",
1271 " [887, '15:50', '17:01', 950, 1021, 71],\n",
1272 " [888, '15:51', '16:18', 951, 978, 27],\n",
1273 " [889, '15:52', '16:36', 952, 996, 44],\n",
1274 " [890, '15:53', '16:40', 953, 1000, 47],\n",
1275 " [891, '15:54', '17:20', 954, 1040, 86],\n",
1276 " [892, '15:54', '16:35', 954, 995, 41],\n",
1277 " [893, '15:55', '16:14', 955, 974, 19],\n",
1278 " [894, '15:58', '16:25', 958, 985, 27],\n",
1279 " [895, '15:58', '16:45', 958, 1005, 47],\n",
1280 " [896, '15:58', '16:45', 958, 1005, 47],\n",
1281 " [897, '15:58', '17:24', 958, 1044, 86],\n",
1282 " [898, '15:59', '17:11', 959, 1031, 72],\n",
1283 " [899, '15:59', '16:53', 959, 1013, 54],\n",
1284 " [900, '16:00', '16:10', 960, 970, 10],\n",
1285 " [901, '16:00', '16:16', 960, 976, 16],\n",
1286 " [902, '16:01', '16:13', 961, 973, 12],\n",
1287 " [903, '16:03', '16:50', 963, 1010, 47],\n",
1288 " [904, '16:04', '17:30', 964, 1050, 86],\n",
1289 " [905, '16:04', '16:45', 964, 1005, 41],\n",
1290 " [906, '16:05', '16:24', 965, 984, 19],\n",
1291 " [907, '16:06', '16:51', 966, 1011, 45],\n",
1292 " [908, '16:08', '16:55', 968, 1015, 47],\n",
1293 " [909, '16:08', '17:34', 968, 1054, 86],\n",
1294 " [910, '16:08', '16:55', 968, 1015, 47],\n",
1295 " [911, '16:09', '17:03', 969, 1023, 54],\n",
1296 " [912, '16:09', '17:21', 969, 1041, 72],\n",
1297 " [913, '16:10', '16:20', 970, 980, 10],\n",
1298 " [914, '16:13', '16:40', 973, 1000, 27],\n",
1299 " [915, '16:13', '17:00', 973, 1020, 47],\n",
1300 " [916, '16:14', '16:55', 974, 1015, 41],\n",
1301 " [917, '16:14', '17:40', 974, 1060, 86],\n",
1302 " [918, '16:15', '16:34', 975, 994, 19],\n",
1303 " [919, '16:16', '16:28', 976, 988, 12],\n",
1304 " [920, '16:18', '17:05', 978, 1025, 47],\n",
1305 " [921, '16:18', '17:05', 978, 1025, 47],\n",
1306 " [922, '16:18', '17:44', 978, 1064, 86],\n",
1307 " [923, '16:19', '17:31', 979, 1051, 72],\n",
1308 " [924, '16:19', '17:13', 979, 1033, 54],\n",
1309 " [925, '16:20', '16:30', 980, 990, 10],\n",
1310 " [926, '16:20', '16:36', 980, 996, 16],\n",
1311 " [927, '16:21', '16:48', 981, 1008, 27],\n",
1312 " [928, '16:22', '17:06', 982, 1026, 44],\n",
1313 " [929, '16:23', '17:10', 983, 1030, 47],\n",
1314 " [930, '16:24', '17:05', 984, 1025, 41],\n",
1315 " [931, '16:24', '17:50', 984, 1070, 86],\n",
1316 " [932, '16:25', '16:44', 985, 1004, 19],\n",
1317 " [933, '16:28', '17:15', 988, 1035, 47],\n",
1318 " [934, '16:28', '17:15', 988, 1035, 47],\n",
1319 " [935, '16:28', '16:55', 988, 1015, 27],\n",
1320 " [936, '16:28', '17:54', 988, 1074, 86],\n",
1321 " [937, '16:29', '17:23', 989, 1043, 54],\n",
1322 " [938, '16:29', '17:41', 989, 1061, 72],\n",
1323 " [939, '16:30', '16:40', 990, 1000, 10],\n",
1324 " [940, '16:31', '16:43', 991, 1003, 12],\n",
1325 " [941, '16:33', '17:20', 993, 1040, 47],\n",
1326 " [942, '16:34', '17:15', 994, 1035, 41],\n",
1327 " [943, '16:34', '18:00', 994, 1080, 86],\n",
1328 " [944, '16:35', '16:54', 995, 1014, 19],\n",
1329 " [945, '16:36', '17:21', 996, 1041, 45],\n",
1330 " [946, '16:38', '17:25', 998, 1045, 47],\n",
1331 " [947, '16:38', '17:25', 998, 1045, 47],\n",
1332 " [948, '16:38', '18:04', 998, 1084, 86],\n",
1333 " [949, '16:39', '17:33', 999, 1053, 54],\n",
1334 " [950, '16:39', '17:51', 999, 1071, 72],\n",
1335 " [951, '16:40', '16:56', 1000, 1016, 16],\n",
1336 " [952, '16:40', '16:50', 1000, 1010, 10],\n",
1337 " [953, '16:43', '17:10', 1003, 1030, 27],\n",
1338 " [954, '16:43', '17:30', 1003, 1050, 47],\n",
1339 " [955, '16:44', '17:25', 1004, 1045, 41],\n",
1340 " [956, '16:44', '18:10', 1004, 1090, 86],\n",
1341 " [957, '16:45', '17:04', 1005, 1024, 19],\n",
1342 " [958, '16:46', '16:58', 1006, 1018, 12],\n",
1343 " [959, '16:48', '18:14', 1008, 1094, 86],\n",
1344 " [960, '16:48', '17:35', 1008, 1055, 47],\n",
1345 " [961, '16:48', '17:35', 1008, 1055, 47],\n",
1346 " [962, '16:49', '18:01', 1009, 1081, 72],\n",
1347 " [963, '16:49', '17:43', 1009, 1063, 54],\n",
1348 " [964, '16:50', '17:00', 1010, 1020, 10],\n",
1349 " [965, '16:51', '17:18', 1011, 1038, 27],\n",
1350 " [966, '16:52', '17:36', 1012, 1056, 44],\n",
1351 " [967, '16:53', '17:40', 1013, 1060, 47],\n",
1352 " [968, '16:54', '18:20', 1014, 1100, 86],\n",
1353 " [969, '16:54', '17:35', 1014, 1055, 41],\n",
1354 " [970, '16:55', '17:14', 1015, 1034, 19],\n",
1355 " [971, '16:58', '17:25', 1018, 1045, 27],\n",
1356 " [972, '16:58', '17:45', 1018, 1065, 47],\n",
1357 " [973, '16:58', '17:45', 1018, 1065, 47],\n",
1358 " [974, '16:58', '18:24', 1018, 1104, 86],\n",
1359 " [975, '16:59', '18:11', 1019, 1091, 72],\n",
1360 " [976, '16:59', '17:53', 1019, 1073, 54],\n",
1361 " [977, '17:00', '17:16', 1020, 1036, 16],\n",
1362 " [978, '17:00', '17:10', 1020, 1030, 10],\n",
1363 " [979, '17:01', '17:13', 1021, 1033, 12],\n",
1364 " [980, '17:03', '17:50', 1023, 1070, 47],\n",
1365 " [981, '17:04', '18:30', 1024, 1110, 86],\n",
1366 " [982, '17:04', '17:45', 1024, 1065, 41],\n",
1367 " [983, '17:05', '17:24', 1025, 1044, 19],\n",
1368 " [984, '17:06', '17:51', 1026, 1071, 45],\n",
1369 " [985, '17:08', '17:55', 1028, 1075, 47],\n",
1370 " [986, '17:08', '17:55', 1028, 1075, 47],\n",
1371 " [987, '17:08', '18:34', 1028, 1114, 86],\n",
1372 " [988, '17:09', '18:03', 1029, 1083, 54],\n",
1373 " [989, '17:09', '18:21', 1029, 1101, 72],\n",
1374 " [990, '17:10', '17:20', 1030, 1040, 10],\n",
1375 " [991, '17:13', '17:40', 1033, 1060, 27],\n",
1376 " [992, '17:13', '18:00', 1033, 1080, 47],\n",
1377 " [993, '17:14', '17:55', 1034, 1075, 41],\n",
1378 " [994, '17:14', '18:40', 1034, 1120, 86],\n",
1379 " [995, '17:15', '17:34', 1035, 1054, 19],\n",
1380 " [996, '17:16', '17:28', 1036, 1048, 12],\n",
1381 " [997, '17:18', '18:05', 1038, 1085, 47],\n",
1382 " [998, '17:18', '18:05', 1038, 1085, 47],\n",
1383 " [999, '17:18', '18:44', 1038, 1124, 86],\n",
1384 " [1000, '17:19', '18:31', 1039, 1111, 72],\n",
1385 " [1001, '17:19', '18:13', 1039, 1093, 54],\n",
1386 " [1002, '17:20', '17:36', 1040, 1056, 16],\n",
1387 " [1003, '17:20', '17:30', 1040, 1050, 10],\n",
1388 " [1004, '17:21', '17:47', 1041, 1067, 26],\n",
1389 " [1005, '17:22', '18:06', 1042, 1086, 44],\n",
1390 " [1006, '17:23', '18:10', 1043, 1090, 47],\n",
1391 " [1007, '17:24', '18:50', 1044, 1130, 86],\n",
1392 " [1008, '17:24', '18:05', 1044, 1085, 41],\n",
1393 " [1009, '17:25', '17:44', 1045, 1064, 19],\n",
1394 " [1010, '17:28', '17:55', 1048, 1075, 27],\n",
1395 " [1011, '17:28', '18:15', 1048, 1095, 47],\n",
1396 " [1012, '17:28', '18:15', 1048, 1095, 47],\n",
1397 " [1013, '17:28', '18:54', 1048, 1134, 86],\n",
1398 " [1014, '17:29', '18:41', 1049, 1121, 72],\n",
1399 " [1015, '17:29', '18:23', 1049, 1103, 54],\n",
1400 " [1016, '17:30', '17:40', 1050, 1060, 10],\n",
1401 " [1017, '17:31', '17:43', 1051, 1063, 12],\n",
1402 " [1018, '17:33', '18:20', 1053, 1100, 47],\n",
1403 " [1019, '17:34', '18:15', 1054, 1095, 41],\n",
1404 " [1020, '17:34', '19:00', 1054, 1140, 86],\n",
1405 " [1021, '17:35', '17:54', 1055, 1074, 19],\n",
1406 " [1022, '17:36', '18:21', 1056, 1101, 45],\n",
1407 " [1023, '17:38', '18:25', 1058, 1105, 47],\n",
1408 " [1024, '17:38', '19:04', 1058, 1144, 86],\n",
1409 " [1025, '17:38', '18:25', 1058, 1105, 47],\n",
1410 " [1026, '17:39', '18:51', 1059, 1131, 72],\n",
1411 " [1027, '17:39', '18:33', 1059, 1113, 54],\n",
1412 " [1028, '17:40', '17:56', 1060, 1076, 16],\n",
1413 " [1029, '17:40', '17:50', 1060, 1070, 10],\n",
1414 " [1030, '17:43', '18:10', 1063, 1090, 27],\n",
1415 " [1031, '17:43', '18:30', 1063, 1110, 47],\n",
1416 " [1032, '17:44', '18:25', 1064, 1105, 41],\n",
1417 " [1033, '17:44', '19:14', 1064, 1154, 90],\n",
1418 " [1034, '17:45', '18:04', 1065, 1084, 19],\n",
1419 " [1035, '17:46', '17:58', 1066, 1078, 12],\n",
1420 " [1036, '17:48', '18:35', 1068, 1115, 47],\n",
1421 " [1037, '17:48', '18:35', 1068, 1115, 47],\n",
1422 " [1038, '17:48', '19:14', 1068, 1154, 86],\n",
1423 " [1039, '17:49', '19:01', 1069, 1141, 72],\n",
1424 " [1040, '17:49', '18:43', 1069, 1123, 54],\n",
1425 " [1041, '17:50', '18:00', 1070, 1080, 10],\n",
1426 " [1042, '17:51', '18:17', 1071, 1097, 26],\n",
1427 " [1043, '17:52', '18:36', 1072, 1116, 44],\n",
1428 " [1044, '17:53', '18:40', 1073, 1120, 47],\n",
1429 " [1045, '17:54', '18:35', 1074, 1115, 41],\n",
1430 " [1046, '17:54', '18:57', 1074, 1137, 63],\n",
1431 " [1047, '17:55', '18:14', 1075, 1094, 19],\n",
1432 " [1048, '17:58', '18:45', 1078, 1125, 47],\n",
1433 " [1049, '17:58', '18:45', 1078, 1125, 47],\n",
1434 " [1050, '17:58', '18:25', 1078, 1105, 27],\n",
1435 " [1051, '17:58', '19:26', 1078, 1166, 88],\n",
1436 " [1052, '17:59', '18:53', 1079, 1133, 54],\n",
1437 " [1053, '18:00', '19:11', 1080, 1151, 71],\n",
1438 " [1054, '18:00', '18:10', 1080, 1090, 10],\n",
1439 " [1055, '18:00', '18:16', 1080, 1096, 16],\n",
1440 " [1056, '18:01', '18:13', 1081, 1093, 12],\n",
1441 " [1057, '18:03', '18:50', 1083, 1130, 47],\n",
1442 " [1058, '18:04', '18:45', 1084, 1125, 41],\n",
1443 " [1059, '18:04', '19:29', 1084, 1169, 85],\n",
1444 " [1060, '18:05', '18:24', 1085, 1104, 19],\n",
1445 " [1061, '18:06', '18:51', 1086, 1131, 45],\n",
1446 " [1062, '18:08', '18:55', 1088, 1135, 47],\n",
1447 " [1063, '18:08', '19:06', 1088, 1146, 58],\n",
1448 " [1064, '18:08', '18:55', 1088, 1135, 47],\n",
1449 " [1065, '18:09', '19:03', 1089, 1143, 54],\n",
1450 " [1066, '18:10', '18:20', 1090, 1100, 10],\n",
1451 " [1067, '18:10', '19:21', 1090, 1161, 71],\n",
1452 " [1068, '18:13', '19:00', 1093, 1140, 47],\n",
1453 " [1069, '18:13', '18:40', 1093, 1120, 27],\n",
1454 " [1070, '18:14', '19:43', 1094, 1183, 89],\n",
1455 " [1071, '18:14', '18:55', 1094, 1135, 41],\n",
1456 " [1072, '18:15', '18:34', 1095, 1114, 19],\n",
1457 " [1073, '18:16', '18:28', 1096, 1108, 12],\n",
1458 " [1074, '18:17', '18:27', 1097, 1107, 10],\n",
1459 " [1075, '18:18', '19:41', 1098, 1181, 83],\n",
1460 " [1076, '18:18', '18:58', 1098, 1138, 40],\n",
1461 " [1077, '18:18', '19:05', 1098, 1145, 47],\n",
1462 " [1078, '18:19', '19:13', 1099, 1153, 54],\n",
1463 " [1079, '18:20', '19:31', 1100, 1171, 71],\n",
1464 " [1080, '18:20', '18:36', 1100, 1116, 16],\n",
1465 " [1081, '18:20', '18:30', 1100, 1110, 10],\n",
1466 " [1082, '18:22', '19:05', 1102, 1145, 43],\n",
1467 " [1083, '18:23', '19:05', 1103, 1145, 42],\n",
1468 " [1084, '18:24', '19:27', 1104, 1167, 63],\n",
1469 " [1085, '18:24', '19:05', 1104, 1145, 41],\n",
1470 " [1086, '18:25', '18:44', 1105, 1124, 19],\n",
1471 " [1087, '18:28', '19:25', 1108, 1165, 57],\n",
1472 " [1088, '18:28', '18:55', 1108, 1135, 27],\n",
1473 " [1089, '18:28', '19:08', 1108, 1148, 40],\n",
1474 " [1090, '18:28', '19:15', 1108, 1155, 47],\n",
1475 " [1091, '18:29', '19:23', 1109, 1163, 54],\n",
1476 " [1092, '18:30', '19:05', 1110, 1145, 35],\n",
1477 " [1093, '18:30', '18:40', 1110, 1120, 10],\n",
1478 " [1094, '18:31', '18:43', 1111, 1123, 12],\n",
1479 " [1095, '18:33', '19:15', 1113, 1155, 42],\n",
1480 " [1096, '18:34', '19:58', 1114, 1198, 84],\n",
1481 " [1097, '18:34', '19:14', 1114, 1154, 40],\n",
1482 " [1098, '18:35', '18:55', 1115, 1135, 20],\n",
1483 " [1099, '18:36', '19:20', 1116, 1160, 44],\n",
1484 " [1100, '18:38', '19:25', 1118, 1165, 47],\n",
1485 " [1101, '18:38', '19:23', 1118, 1163, 45],\n",
1486 " [1102, '18:38', '19:56', 1118, 1196, 78],\n",
1487 " [1103, '18:39', '19:33', 1119, 1173, 54],\n",
1488 " [1104, '18:40', '18:50', 1120, 1130, 10],\n",
1489 " [1105, '18:40', '19:45', 1120, 1185, 65],\n",
1490 " [1106, '18:40', '18:56', 1120, 1136, 16],\n",
1491 " [1107, '18:43', '19:10', 1123, 1150, 27],\n",
1492 " [1108, '18:43', '19:30', 1123, 1170, 47],\n",
1493 " [1109, '18:44', '19:24', 1124, 1164, 40],\n",
1494 " [1110, '18:45', '19:05', 1125, 1145, 20],\n",
1495 " [1111, '18:46', '18:58', 1126, 1138, 12],\n",
1496 " [1112, '18:48', '19:35', 1128, 1175, 47],\n",
1497 " [1113, '18:48', '20:12', 1128, 1212, 84],\n",
1498 " [1114, '18:48', '20:11', 1128, 1211, 83],\n",
1499 " [1115, '18:48', '19:28', 1128, 1168, 40],\n",
1500 " [1116, '18:49', '19:43', 1129, 1183, 54],\n",
1501 " [1117, '18:50', '19:00', 1130, 1140, 10],\n",
1502 " [1118, '18:51', '19:01', 1131, 1141, 10],\n",
1503 " [1119, '18:53', '19:35', 1133, 1175, 42],\n",
1504 " [1120, '18:53', '19:15', 1133, 1155, 22],\n",
1505 " [1121, '18:53', '20:00', 1133, 1200, 67],\n",
1506 " [1122, '18:55', '19:15', 1135, 1155, 20],\n",
1507 " [1123, '18:55', '19:34', 1135, 1174, 39],\n",
1508 " [1124, '18:58', '19:38', 1138, 1178, 40],\n",
1509 " [1125, '18:59', '19:53', 1139, 1193, 54],\n",
1510 " [1126, '18:59', '19:50', 1139, 1190, 51],\n",
1511 " [1127, '18:59', '19:53', 1139, 1193, 54],\n",
1512 " [1128, '19:00', '19:16', 1140, 1156, 16],\n",
1513 " [1129, '19:00', '19:10', 1140, 1150, 10],\n",
1514 " [1130, '19:00', '19:16', 1140, 1156, 16],\n",
1515 " [1131, '19:01', '19:13', 1141, 1153, 12],\n",
1516 " [1132, '19:03', '20:26', 1143, 1226, 83],\n",
1517 " [1133, '19:03', '19:45', 1143, 1185, 42],\n",
1518 " [1134, '19:05', '19:44', 1145, 1184, 39],\n",
1519 " [1135, '19:05', '19:25', 1145, 1165, 20],\n",
1520 " [1136, '19:08', '20:15', 1148, 1215, 67],\n",
1521 " [1137, '19:08', '19:35', 1148, 1175, 27],\n",
1522 " [1138, '19:09', '19:49', 1149, 1189, 40],\n",
1523 " [1139, '19:09', '20:03', 1149, 1203, 54],\n",
1524 " [1140, '19:10', '19:20', 1150, 1160, 10],\n",
1525 " [1141, '19:10', '19:20', 1150, 1160, 10],\n",
1526 " [1142, '19:11', '19:53', 1151, 1193, 42],\n",
1527 " [1143, '19:14', '20:26', 1154, 1226, 72],\n",
1528 " [1144, '19:14', '19:35', 1154, 1175, 21],\n",
1529 " [1145, '19:14', '19:24', 1154, 1164, 10],\n",
1530 " [1146, '19:14', '20:05', 1154, 1205, 51],\n",
1531 " [1147, '19:15', '19:30', 1155, 1170, 15],\n",
1532 " [1148, '19:15', '19:54', 1155, 1194, 39],\n",
1533 " [1149, '19:18', '20:39', 1158, 1239, 81],\n",
1534 " [1150, '19:18', '20:00', 1158, 1200, 42],\n",
1535 " [1151, '19:19', '20:14', 1159, 1214, 55],\n",
1536 " [1152, '19:20', '19:30', 1160, 1170, 10],\n",
1537 " [1153, '19:20', '19:36', 1160, 1176, 16],\n",
1538 " [1154, '19:21', '19:31', 1161, 1171, 10],\n",
1539 " [1155, '19:23', '20:30', 1163, 1230, 67],\n",
1540 " [1156, '19:23', '19:35', 1163, 1175, 12],\n",
1541 " [1157, '19:24', '19:45', 1164, 1185, 21],\n",
1542 " [1158, '19:24', '19:45', 1164, 1185, 21],\n",
1543 " [1159, '19:25', '20:04', 1165, 1204, 39],\n",
1544 " [1160, '19:26', '20:08', 1166, 1208, 42],\n",
1545 " [1161, '19:29', '20:02', 1169, 1202, 33],\n",
1546 " [1162, '19:29', '20:18', 1169, 1218, 49],\n",
1547 " [1163, '19:29', '20:41', 1169, 1241, 72],\n",
1548 " [1164, '19:30', '19:40', 1170, 1180, 10],\n",
1549 " [1165, '19:33', '20:54', 1173, 1254, 81],\n",
1550 " [1166, '19:33', '20:17', 1173, 1217, 44],\n",
1551 " [1167, '19:34', '19:55', 1174, 1195, 21],\n",
1552 " [1168, '19:35', '20:14', 1175, 1214, 39],\n",
1553 " [1169, '19:38', '20:05', 1178, 1205, 27],\n",
1554 " [1170, '19:38', '20:45', 1178, 1245, 67],\n",
1555 " [1171, '19:39', '20:12', 1179, 1212, 33],\n",
1556 " [1172, '19:40', '19:50', 1180, 1190, 10],\n",
1557 " [1173, '19:40', '19:56', 1180, 1196, 16],\n",
1558 " [1174, '19:41', '20:27', 1181, 1227, 46],\n",
1559 " [1175, '19:43', '19:55', 1183, 1195, 12],\n",
1560 " [1176, '19:44', '20:05', 1184, 1205, 21],\n",
1561 " [1177, '19:44', '20:33', 1184, 1233, 49],\n",
1562 " [1178, '19:44', '21:00', 1184, 1260, 76],\n",
1563 " [1179, '19:45', '20:24', 1185, 1224, 39],\n",
1564 " [1180, '19:48', '20:37', 1188, 1237, 49],\n",
1565 " [1181, '19:48', '21:09', 1188, 1269, 81],\n",
1566 " [1182, '19:50', '20:00', 1190, 1200, 10],\n",
1567 " [1183, '19:52', '20:29', 1192, 1229, 37],\n",
1568 " [1184, '19:53', '20:08', 1193, 1208, 15],\n",
1569 " [1185, '19:53', '21:02', 1193, 1262, 69],\n",
1570 " [1186, '19:53', '20:20', 1193, 1220, 27],\n",
1571 " [1187, '19:54', '20:19', 1194, 1219, 25],\n",
1572 " [1188, '19:55', '20:34', 1195, 1234, 39],\n",
1573 " [1189, '19:56', '20:34', 1196, 1234, 38],\n",
1574 " [1190, '19:59', '20:48', 1199, 1248, 49],\n",
1575 " [1191, '19:59', '21:20', 1199, 1280, 81],\n",
1576 " [1192, '20:00', '20:16', 1200, 1216, 16],\n",
1577 " [1193, '20:00', '20:10', 1200, 1210, 10],\n",
1578 " [1194, '20:03', '20:42', 1203, 1242, 39],\n",
1579 " [1195, '20:03', '21:24', 1203, 1284, 81],\n",
1580 " [1196, '20:04', '20:29', 1204, 1229, 25],\n",
1581 " [1197, '20:05', '20:48', 1205, 1248, 43],\n",
1582 " [1198, '20:07', '20:44', 1207, 1244, 37],\n",
1583 " [1199, '20:08', '20:40', 1208, 1240, 32],\n",
1584 " [1200, '20:08', '20:35', 1208, 1235, 27],\n",
1585 " [1201, '20:10', '20:20', 1210, 1220, 10],\n",
1586 " [1202, '20:10', '20:22', 1210, 1222, 12],\n",
1587 " [1203, '20:11', '20:47', 1211, 1247, 36],\n",
1588 " [1204, '20:14', '21:04', 1214, 1264, 50],\n",
1589 " [1205, '20:14', '21:03', 1214, 1263, 49],\n",
1590 " [1206, '20:17', '21:03', 1217, 1263, 46],\n",
1591 " [1207, '20:18', '21:39', 1218, 1299, 81],\n",
1592 " [1208, '20:20', '20:30', 1220, 1230, 10],\n",
1593 " [1209, '20:20', '20:57', 1220, 1257, 37],\n",
1594 " [1210, '20:20', '20:36', 1220, 1236, 16],\n",
1595 " [1211, '20:22', '20:59', 1222, 1259, 37],\n",
1596 " [1212, '20:22', '20:42', 1222, 1242, 20],\n",
1597 " [1213, '20:24', '20:49', 1224, 1249, 25],\n",
1598 " [1214, '20:27', '21:22', 1227, 1282, 55],\n",
1599 " [1215, '20:29', '21:18', 1229, 1278, 49],\n",
1600 " [1216, '20:30', '21:07', 1230, 1267, 37],\n",
1601 " [1217, '20:30', '20:40', 1230, 1240, 10],\n",
1602 " [1218, '20:30', '20:40', 1230, 1240, 10],\n",
1603 " [1219, '20:30', '21:40', 1230, 1300, 70],\n",
1604 " [1220, '20:32', '21:18', 1232, 1278, 46],\n",
1605 " [1221, '20:35', '21:54', 1235, 1314, 79],\n",
1606 " [1222, '20:37', '21:14', 1237, 1274, 37],\n",
1607 " [1223, '20:38', '21:08', 1238, 1268, 30],\n",
1608 " [1224, '20:40', '20:50', 1240, 1250, 10],\n",
1609 " [1225, '20:40', '21:17', 1240, 1277, 37],\n",
1610 " [1226, '20:40', '20:56', 1240, 1256, 16],\n",
1611 " [1227, '20:44', '21:33', 1244, 1293, 49],\n",
1612 " [1228, '20:47', '21:33', 1247, 1293, 46],\n",
1613 " [1229, '20:47', '21:42', 1247, 1302, 55],\n",
1614 " [1230, '20:50', '21:00', 1250, 1260, 10],\n",
1615 " [1231, '20:50', '22:00', 1250, 1320, 70],\n",
1616 " [1232, '20:50', '22:09', 1250, 1329, 79],\n",
1617 " [1233, '20:50', '21:27', 1250, 1287, 37],\n",
1618 " [1234, '20:52', '21:29', 1252, 1289, 37],\n",
1619 " [1235, '20:53', '21:20', 1253, 1280, 27],\n",
1620 " [1236, '20:56', '21:11', 1256, 1271, 15],\n",
1621 " [1237, '20:59', '21:48', 1259, 1308, 49],\n",
1622 " [1238, '21:00', '21:10', 1260, 1270, 10],\n",
1623 " [1239, '21:00', '21:37', 1260, 1297, 37],\n",
1624 " [1240, '21:02', '21:48', 1262, 1308, 46],\n",
1625 " [1241, '21:05', '22:24', 1265, 1344, 79],\n",
1626 " [1242, '21:07', '21:44', 1267, 1304, 37],\n",
1627 " [1243, '21:07', '22:02', 1267, 1322, 55],\n",
1628 " [1244, '21:08', '21:38', 1268, 1298, 30],\n",
1629 " [1245, '21:10', '22:25', 1270, 1345, 75],\n",
1630 " [1246, '21:10', '21:20', 1270, 1280, 10],\n",
1631 " [1247, '21:10', '21:47', 1270, 1307, 37],\n",
1632 " [1248, '21:14', '22:03', 1274, 1323, 49],\n",
1633 " [1249, '21:17', '22:03', 1277, 1323, 46],\n",
1634 " [1250, '21:20', '22:18', 1280, 1338, 58],\n",
1635 " [1251, '21:20', '21:57', 1280, 1317, 37],\n",
1636 " [1252, '21:20', '21:30', 1280, 1290, 10],\n",
1637 " [1253, '21:22', '21:59', 1282, 1319, 37],\n",
1638 " [1254, '21:24', '21:49', 1284, 1309, 25],\n",
1639 " [1255, '21:27', '22:21', 1287, 1341, 54],\n",
1640 " [1256, '21:30', '22:07', 1290, 1327, 37],\n",
1641 " [1257, '21:30', '22:20', 1290, 1340, 50],\n",
1642 " [1258, '21:30', '21:40', 1290, 1300, 10],\n",
1643 " [1259, '21:32', '22:18', 1292, 1338, 46],\n",
1644 " [1260, '21:32', '22:01', 1292, 1321, 29],\n",
1645 " [1261, '21:35', '22:54', 1295, 1374, 79],\n",
1646 " [1262, '21:37', '22:14', 1297, 1334, 37],\n",
1647 " [1263, '21:39', '21:55', 1299, 1315, 16],\n",
1648 " [1264, '21:40', '22:17', 1300, 1337, 37],\n",
1649 " [1265, '21:40', '21:50', 1300, 1310, 10],\n",
1650 " [1266, '21:41', '22:08', 1301, 1328, 27],\n",
1651 " [1267, '21:47', '22:16', 1307, 1336, 29],\n",
1652 " [1268, '21:47', '22:51', 1307, 1371, 64],\n",
1653 " [1269, '21:47', '22:33', 1307, 1353, 46],\n",
1654 " [1270, '21:48', '22:03', 1308, 1323, 15],\n",
1655 " [1271, '21:50', '22:55', 1310, 1375, 65],\n",
1656 " [1272, '21:50', '22:27', 1310, 1347, 37],\n",
1657 " [1273, '21:50', '22:00', 1310, 1320, 10],\n",
1658 " [1274, '21:52', '22:29', 1312, 1349, 37],\n",
1659 " [1275, '21:53', '22:19', 1313, 1339, 26],\n",
1660 " [1276, '22:00', '22:38', 1320, 1358, 38],\n",
1661 " [1277, '22:00', '22:10', 1320, 1330, 10],\n",
1662 " [1278, '22:02', '22:12', 1322, 1332, 10],\n",
1663 " [1279, '22:02', '22:48', 1322, 1368, 46],\n",
1664 " [1280, '22:04', '22:31', 1324, 1351, 27],\n",
1665 " [1281, '22:05', '23:24', 1325, 1404, 79],\n",
1666 " [1282, '22:07', '22:44', 1327, 1364, 37],\n",
1667 " [1283, '22:07', '22:39', 1327, 1359, 32],\n",
1668 " [1284, '22:09', '22:25', 1329, 1345, 16],\n",
1669 " [1285, '22:10', '23:25', 1330, 1405, 75],\n",
1670 " [1286, '22:13', '22:38', 1333, 1358, 25],\n",
1671 " [1287, '22:13', '22:53', 1333, 1373, 40],\n",
1672 " [1288, '22:17', '22:27', 1337, 1347, 10],\n",
1673 " [1289, '22:17', '23:03', 1337, 1383, 46],\n",
1674 " [1290, '22:19', '22:46', 1339, 1366, 27],\n",
1675 " [1291, '22:22', '22:59', 1342, 1379, 37],\n",
1676 " [1292, '22:24', '22:48', 1344, 1368, 24],\n",
1677 " [1293, '22:27', '22:52', 1347, 1372, 25],\n",
1678 " [1294, '22:27', '23:21', 1347, 1401, 54],\n",
1679 " [1295, '22:28', '23:08', 1348, 1388, 40],\n",
1680 " [1296, '22:30', '23:17', 1350, 1397, 47],\n",
1681 " [1297, '22:32', '22:42', 1352, 1362, 10],\n",
1682 " [1298, '22:32', '23:11', 1352, 1391, 39],\n",
1683 " [1299, '22:34', '23:01', 1354, 1381, 27],\n",
1684 " [1300, '22:35', '23:54', 1355, 1434, 79],\n",
1685 " [1301, '22:37', '23:14', 1357, 1394, 37],\n",
1686 " [1302, '22:43', '23:23', 1363, 1403, 40],\n",
1687 " [1303, '22:43', '23:08', 1363, 1388, 25],\n",
1688 " [1304, '22:47', '23:33', 1367, 1413, 46],\n",
1689 " [1305, '22:47', '22:57', 1367, 1377, 10],\n",
1690 " [1306, '22:49', '23:16', 1369, 1396, 27],\n",
1691 " [1307, '22:52', '23:29', 1372, 1409, 37],\n",
1692 " [1308, '22:53', '23:15', 1373, 1395, 22],\n",
1693 " [1309, '22:55', '23:55', 1375, 1435, 60],\n",
1694 " [1310, '22:57', '23:51', 1377, 1431, 54],\n",
1695 " [1311, '22:58', '23:38', 1378, 1418, 40],\n",
1696 " [1312, '23:02', '23:41', 1382, 1421, 39],\n",
1697 " [1313, '23:02', '23:12', 1382, 1392, 10],\n",
1698 " [1314, '23:04', '23:31', 1384, 1411, 27],\n",
1699 " [1315, '23:05', '00:24', 1385, 1464, 79],\n",
1700 " [1316, '23:07', '23:44', 1387, 1424, 37],\n",
1701 " [1317, '23:13', '23:53', 1393, 1433, 40],\n",
1702 " [1318, '23:13', '23:38', 1393, 1418, 25],\n",
1703 " [1319, '23:17', '00:03', 1397, 1443, 46],\n",
1704 " [1320, '23:17', '23:27', 1397, 1407, 10],\n",
1705 " [1321, '23:19', '23:46', 1399, 1426, 27],\n",
1706 " [1322, '23:22', '23:59', 1402, 1439, 37],\n",
1707 " [1323, '23:25', '00:25', 1405, 1465, 60],\n",
1708 " [1324, '23:27', '00:21', 1407, 1461, 54],\n",
1709 " [1325, '23:28', '00:08', 1408, 1448, 40],\n",
1710 " [1326, '23:32', '23:42', 1412, 1422, 10],\n",
1711 " [1327, '23:34', '00:01', 1414, 1441, 27],\n",
1712 " [1328, '23:35', '01:05', 1415, 1505, 90],\n",
1713 " [1329, '23:37', '00:09', 1417, 1449, 32],\n",
1714 " [1330, '23:43', '00:23', 1423, 1463, 40],\n",
1715 " [1331, '23:43', '00:08', 1423, 1448, 25],\n",
1716 " [1332, '23:46', '00:01', 1426, 1441, 15],\n",
1717 " [1333, '23:47', '23:57', 1427, 1437, 10],\n",
1718 " [1334, '23:47', '00:33', 1427, 1473, 46],\n",
1719 " [1335, '23:52', '00:24', 1432, 1464, 32],\n",
1720 " [1336, '23:55', '00:49', 1435, 1489, 54],\n",
1721 " [1337, '23:57', '00:57', 1437, 1497, 60],\n",
1722 " [1338, '23:58', '00:38', 1438, 1478, 40],\n",
1723 " [1339, '00:02', '00:12', 1442, 1452, 10],\n",
1724 " [1340, '00:07', '00:39', 1447, 1479, 32],\n",
1725 " [1341, '00:13', '00:38', 1453, 1478, 25],\n",
1726 " [1342, '00:13', '00:51', 1453, 1491, 38],\n",
1727 " [1343, '00:15', '01:14', 1455, 1514, 59],\n",
1728 " [1344, '00:17', '01:23', 1457, 1523, 66],\n",
1729 " [1345, '00:23', '00:33', 1463, 1473, 10],\n",
1730 " [1346, '00:24', '00:40', 1464, 1480, 16],\n",
1731 " [1347, '00:25', '01:12', 1465, 1512, 47],\n",
1732 " [1348, '00:28', '01:07', 1468, 1507, 39],\n",
1733 " [1349, '00:33', '01:05', 1473, 1505, 32],\n",
1734 " [1350, '00:43', '01:21', 1483, 1521, 38],\n",
1735 " [1351, '00:44', '00:54', 1484, 1494, 10],\n",
1736 " [1352, '00:47', '01:09', 1487, 1509, 22],\n",
1737 " [1353, '00:47', '01:26', 1487, 1526, 39],\n",
1738 " [1354, '00:54', '01:04', 1494, 1504, 10],\n",
1739 " [1355, '00:57', '01:07', 1497, 1507, 10]\n",
1740 "] # yapf:disable\n",
1741 "\n",
1742 "# pytype: disable=wrong-arg-types\n",
1743 "\n",
1744 "\n",
1745 "def bus_driver_scheduling(minimize_drivers, max_num_drivers):\n",
1746 " \"\"\"Optimize the bus driver scheduling problem.\n",
1747 "\n",
1748 " This model has two modes.\n",
1749 "\n",
1750 " If minimize_drivers == True, the objective will be to find the minimal\n",
1751 " number of drivers, independently of the working times of each drivers.\n",
1752 "\n",
1753 " Otherwise, will will create max_num_drivers non optional drivers, and\n",
1754 " minimize the sum of working times of these drivers.\n",
1755 "\n",
1756 " Args:\n",
1757 " minimize_drivers: A Boolean parameter specifying the objective of the\n",
1758 " problem. If True, it tries to minimize the number of used drivers. If\n",
1759 " false, it minimizes the sum of working times per workers.\n",
1760 " max_num_drivers: This number specifies the exact number of non optional\n",
1761 " drivers to use. This is only used if 'minimize_drivers' is False.\n",
1762 "\n",
1763 " Returns:\n",
1764 " The objective value of the model.\n",
1765 " \"\"\"\n",
1766 " shifts = None\n",
1767 " if FLAGS.instance == 1:\n",
1768 " shifts = SAMPLE_SHIFTS_SMALL\n",
1769 " elif FLAGS.instance == 2:\n",
1770 " shifts = SAMPLE_SHIFTS_MEDIUM\n",
1771 " elif FLAGS.instance == 3:\n",
1772 " shifts = SAMPLE_SHIFTS_LARGE\n",
1773 "\n",
1774 " num_shifts = len(shifts)\n",
1775 "\n",
1776 " # All durations are in minutes.\n",
1777 " max_driving_time = 540 # 8 hours.\n",
1778 " max_driving_time_without_pauses = 240 # 4 hours\n",
1779 " min_pause_after_4h = 30\n",
1780 " min_delay_between_shifts = 2\n",
1781 " max_working_time = 720\n",
1782 " min_working_time = 390 # 6.5 hours\n",
1783 " setup_time = 10\n",
1784 " cleanup_time = 15\n",
1785 "\n",
1786 " # Computed data.\n",
1787 " total_driving_time = sum(shift[5] for shift in shifts)\n",
1788 " min_num_drivers = int(math.ceil(total_driving_time * 1.0 /\n",
1789 " max_driving_time))\n",
1790 " num_drivers = 2 * min_num_drivers if minimize_drivers else max_num_drivers\n",
1791 " min_start_time = min(shift[3] for shift in shifts)\n",
1792 " max_end_time = max(shift[4] for shift in shifts)\n",
1793 "\n",
1794 " print('Bus driver scheduling')\n",
1795 " print(' num shifts =', num_shifts)\n",
1796 " print(' total driving time =', total_driving_time, 'minutes')\n",
1797 " print(' min num drivers =', min_num_drivers)\n",
1798 " print(' num drivers =', num_drivers)\n",
1799 " print(' min start time =', min_start_time)\n",
1800 " print(' max end time =', max_end_time)\n",
1801 "\n",
1802 " model = cp_model.CpModel()\n",
1803 "\n",
1804 " # For each driver and each shift, we store:\n",
1805 " # - the total driving time including this shift\n",
1806 " # - the acrued driving time since the last 30 minute break\n",
1807 " # Special arcs have the following effect:\n",
1808 " # - 'from source to shift' sets the starting time and accumulate the first\n",
1809 " # shift\n",
1810 " # - 'from shift to end' sets the ending time, and fill the driving_times\n",
1811 " # variable\n",
1812 " # Arcs between two shifts have the following impact\n",
1813 " # - add the duration of the shift to the total driving time\n",
1814 " # - reset the accumulated driving time if the distance between the two\n",
1815 " # shifts is more than 30 minutes, add the duration of the shift to the\n",
1816 " # accumulated driving time since the last break otherwise\n",
1817 "\n",
1818 " # Per (driver, node) info (driving time, performed,\n",
1819 " # driving time since break)\n",
1820 " total_driving = {}\n",
1821 " no_break_driving = {}\n",
1822 " performed = {}\n",
1823 " starting_shifts = {}\n",
1824 "\n",
1825 " # Per driver info (start, end, driving times, is working)\n",
1826 " start_times = []\n",
1827 " end_times = []\n",
1828 " driving_times = []\n",
1829 " working_drivers = []\n",
1830 " working_times = []\n",
1831 "\n",
1832 " # Weighted objective\n",
1833 " delay_literals = []\n",
1834 " delay_weights = []\n",
1835 "\n",
1836 " # Used to propagate more between drivers\n",
1837 " shared_incoming_literals = collections.defaultdict(list)\n",
1838 " shared_outgoing_literals = collections.defaultdict(list)\n",
1839 "\n",
1840 " for d in range(num_drivers):\n",
1841 " start_times.append(\n",
1842 " model.NewIntVar(min_start_time - setup_time, max_end_time,\n",
1843 " 'start_%i' % d))\n",
1844 " end_times.append(\n",
1845 " model.NewIntVar(min_start_time, max_end_time + cleanup_time,\n",
1846 " 'end_%i' % d))\n",
1847 " driving_times.append(\n",
1848 " model.NewIntVar(0, max_driving_time, 'driving_%i' % d))\n",
1849 " working_times.append(\n",
1850 " model.NewIntVar(0, max_working_time, 'working_times_%i' % d))\n",
1851 "\n",
1852 " incoming_literals = collections.defaultdict(list)\n",
1853 " outgoing_literals = collections.defaultdict(list)\n",
1854 " outgoing_source_literals = []\n",
1855 " incoming_sink_literals = []\n",
1856 "\n",
1857 " # Create all the shift variables before iterating on the transitions\n",
1858 " # between these shifts.\n",
1859 " for s in range(num_shifts):\n",
1860 " total_driving[d, s] = model.NewIntVar(0, max_driving_time,\n",
1861 " 'dr_%i_%i' % (d, s))\n",
1862 " no_break_driving[d, s] = model.NewIntVar(\n",
1863 " 0, max_driving_time_without_pauses, 'mdr_%i_%i' % (d, s))\n",
1864 " performed[d, s] = model.NewBoolVar('performed_%i_%i' % (d, s))\n",
1865 "\n",
1866 " for s in range(num_shifts):\n",
1867 " shift = shifts[s]\n",
1868 " duration = shift[5]\n",
1869 "\n",
1870 " # Arc from source to shift.\n",
1871 " # - set the start time of the driver\n",
1872 " # - increase driving time and driving time since break\n",
1873 " source_lit = model.NewBoolVar('%i from source to %i' % (d, s))\n",
1874 " outgoing_source_literals.append(source_lit)\n",
1875 " incoming_literals[s].append(source_lit)\n",
1876 " shared_incoming_literals[s].append(source_lit)\n",
1877 " model.Add(start_times[d] == shift[3] -\n",
1878 " setup_time).OnlyEnforceIf(source_lit)\n",
1879 " model.Add(total_driving[d, s] == duration).OnlyEnforceIf(source_lit)\n",
1880 " model.Add(no_break_driving[d,\n",
1881 " s] == duration).OnlyEnforceIf(source_lit)\n",
1882 " starting_shifts[d, s] = source_lit\n",
1883 "\n",
1884 " # Arc from shift to sink\n",
1885 " # - set the end time of the driver\n",
1886 " # - set the driving times of the driver\n",
1887 " sink_lit = model.NewBoolVar('%i from %i to sink' % (d, s))\n",
1888 " outgoing_literals[s].append(sink_lit)\n",
1889 " shared_outgoing_literals[s].append(sink_lit)\n",
1890 " incoming_sink_literals.append(sink_lit)\n",
1891 " model.Add(end_times[d] == shift[4] +\n",
1892 " cleanup_time).OnlyEnforceIf(sink_lit)\n",
1893 " model.Add(\n",
1894 " driving_times[d] == total_driving[d, s]).OnlyEnforceIf(sink_lit)\n",
1895 "\n",
1896 " # Node not performed\n",
1897 " # - set both driving times to 0\n",
1898 " # - add a looping arc on the node\n",
1899 " model.Add(total_driving[d,\n",
1900 " s] == 0).OnlyEnforceIf(performed[d,\n",
1901 " s].Not())\n",
1902 " model.Add(no_break_driving[d, s] == 0).OnlyEnforceIf(\n",
1903 " performed[d, s].Not())\n",
1904 " incoming_literals[s].append(performed[d, s].Not())\n",
1905 " outgoing_literals[s].append(performed[d, s].Not())\n",
1906 " # Not adding to the shared lists, because, globally, each node will have\n",
1907 " # one incoming literal, and one outgoing literal.\n",
1908 "\n",
1909 " # Node performed:\n",
1910 " # - add upper bound on start_time\n",
1911 " # - add lower bound on end_times\n",
1912 " model.Add(start_times[d] <= shift[3] - setup_time).OnlyEnforceIf(\n",
1913 " performed[d, s])\n",
1914 " model.Add(end_times[d] >= shift[4] + cleanup_time).OnlyEnforceIf(\n",
1915 " performed[d, s])\n",
1916 "\n",
1917 " for o in range(num_shifts):\n",
1918 " other = shifts[o]\n",
1919 " delay = other[3] - shift[4]\n",
1920 " if delay < min_delay_between_shifts:\n",
1921 " continue\n",
1922 " lit = model.NewBoolVar('%i from %i to %i' % (d, s, o))\n",
1923 "\n",
1924 " # Increase driving time\n",
1925 " model.Add(total_driving[d, o] == total_driving[d, s] +\n",
1926 " other[5]).OnlyEnforceIf(lit)\n",
1927 "\n",
1928 " # Increase no_break_driving or reset it to 0 depending on the delay\n",
1929 " if delay >= min_pause_after_4h:\n",
1930 " model.Add(\n",
1931 " no_break_driving[d, o] == other[5]).OnlyEnforceIf(lit)\n",
1932 " else:\n",
1933 " model.Add(no_break_driving[d, o] == no_break_driving[d, s] +\n",
1934 " other[5]).OnlyEnforceIf(lit)\n",
1935 "\n",
1936 " # Add arc\n",
1937 " outgoing_literals[s].append(lit)\n",
1938 " shared_outgoing_literals[s].append(lit)\n",
1939 " incoming_literals[o].append(lit)\n",
1940 " shared_incoming_literals[o].append(lit)\n",
1941 "\n",
1942 " # Cost part\n",
1943 " delay_literals.append(lit)\n",
1944 " delay_weights.append(delay)\n",
1945 "\n",
1946 " model.Add(working_times[d] == end_times[d] - start_times[d])\n",
1947 "\n",
1948 " if minimize_drivers:\n",
1949 " # Driver is not working.\n",
1950 " working = model.NewBoolVar('working_%i' % d)\n",
1951 " model.Add(start_times[d] == min_start_time).OnlyEnforceIf(\n",
1952 " working.Not())\n",
1953 " model.Add(end_times[d] == min_start_time).OnlyEnforceIf(\n",
1954 " working.Not())\n",
1955 " model.Add(driving_times[d] == 0).OnlyEnforceIf(working.Not())\n",
1956 " working_drivers.append(working)\n",
1957 " outgoing_source_literals.append(working.Not())\n",
1958 " incoming_sink_literals.append(working.Not())\n",
1959 " # Conditional working time constraints\n",
1960 " model.Add(\n",
1961 " working_times[d] >= min_working_time).OnlyEnforceIf(working)\n",
1962 " model.Add(working_times[d] == 0).OnlyEnforceIf(working.Not())\n",
1963 " else:\n",
1964 " # Working time constraints\n",
1965 " model.Add(working_times[d] >= min_working_time)\n",
1966 "\n",
1967 " # Create circuit constraint.\n",
1968 " model.Add(sum(outgoing_source_literals) == 1)\n",
1969 " for s in range(num_shifts):\n",
1970 " model.Add(sum(outgoing_literals[s]) == 1)\n",
1971 " model.Add(sum(incoming_literals[s]) == 1)\n",
1972 " model.Add(sum(incoming_sink_literals) == 1)\n",
1973 "\n",
1974 " # Each shift is covered.\n",
1975 " for s in range(num_shifts):\n",
1976 " model.Add(sum(performed[d, s] for d in range(num_drivers)) == 1)\n",
1977 " # Globally, each node has one incoming and one outgoing literal\n",
1978 " model.Add(sum(shared_incoming_literals[s]) == 1)\n",
1979 " model.Add(sum(shared_outgoing_literals[s]) == 1)\n",
1980 "\n",
1981 " # Symmetry breaking\n",
1982 "\n",
1983 " # The first 3 shifts must be performed by 3 different drivers.\n",
1984 " # Let's assign them to the first 3 drivers in sequence\n",
1985 " model.Add(starting_shifts[0, 0] == 1)\n",
1986 " model.Add(starting_shifts[1, 1] == 1)\n",
1987 " model.Add(starting_shifts[2, 2] == 1)\n",
1988 "\n",
1989 " if minimize_drivers:\n",
1990 " # Push non working drivers to the end\n",
1991 " for d in range(num_drivers - 1):\n",
1992 " model.AddImplication(working_drivers[d].Not(),\n",
1993 " working_drivers[d + 1].Not())\n",
1994 "\n",
1995 " # Redundant constraints: sum of driving times = sum of shift driving times\n",
1996 " model.Add(cp_model.LinearExpr.Sum(driving_times) == total_driving_time)\n",
1997 " if not minimize_drivers:\n",
1998 " model.Add(\n",
1999 " cp_model.LinearExpr.Sum(working_times) == total_driving_time +\n",
2000 " num_drivers * (setup_time + cleanup_time) +\n",
2001 " cp_model.LinearExpr.ScalProd(delay_literals, delay_weights))\n",
2002 "\n",
2003 " if minimize_drivers:\n",
2004 " # Minimize the number of working drivers\n",
2005 " model.Minimize(cp_model.LinearExpr.Sum(working_drivers))\n",
2006 " else:\n",
2007 " # Minimize the sum of delays between tasks, which in turns minimize the\n",
2008 " # sum of working times as the total driving time is fixed\n",
2009 " model.Minimize(\n",
2010 " cp_model.LinearExpr.ScalProd(delay_literals, delay_weights))\n",
2011 "\n",
2012 " if not minimize_drivers and FLAGS.output_proto:\n",
2013 " print('Writing proto to %s' % FLAGS.output_proto)\n",
2014 " with open(FLAGS.output_proto, 'w') as text_file:\n",
2015 " text_file.write(str(model))\n",
2016 "\n",
2017 " # Solve model.\n",
2018 " solver = cp_model.CpSolver()\n",
2019 " if FLAGS.params:\n",
2020 " text_format.Parse(FLAGS.params, solver.parameters)\n",
2021 "\n",
2022 " status = solver.Solve(model)\n",
2023 "\n",
2024 " if status != cp_model.OPTIMAL and status != cp_model.FEASIBLE:\n",
2025 " return -1\n",
2026 "\n",
2027 " # Display solution\n",
2028 " if minimize_drivers:\n",
2029 " max_num_drivers = int(solver.ObjectiveValue())\n",
2030 " print('minimal number of drivers =', max_num_drivers)\n",
2031 " return max_num_drivers\n",
2032 "\n",
2033 " for d in range(num_drivers):\n",
2034 " print('Driver %i: ' % (d + 1))\n",
2035 " print(' total driving time =', solver.Value(driving_times[d]))\n",
2036 " print(' working time =',\n",
2037 " solver.Value(working_times[d]) + setup_time + cleanup_time)\n",
2038 "\n",
2039 " first = True\n",
2040 " for s in range(num_shifts):\n",
2041 " shift = shifts[s]\n",
2042 "\n",
2043 " if not solver.BooleanValue(performed[d, s]):\n",
2044 " continue\n",
2045 "\n",
2046 " # Hack to detect if the waiting time between the last shift and\n",
2047 " # this one exceeds 30 minutes. For this, we look at the\n",
2048 " # no_break_driving which was reinitialized in that case.\n",
2049 " if solver.Value(no_break_driving[d, s]) == shift[5] and not first:\n",
2050 " print(' **break**')\n",
2051 " print(' shift ', shift[0], ':', shift[1], '-', shift[2])\n",
2052 " first = False\n",
2053 "\n",
2054 " return int(solver.ObjectiveValue())\n",
2055 "\n",
2056 "\n",
2057 "\"\"\"Optimize the bus driver allocation in two passes.\"\"\"\n",
2058 "print('----------- first pass: minimize the number of drivers')\n",
2059 "num_drivers = bus_driver_scheduling(True, -1)\n",
2060 "if num_drivers == -1:\n",
2061 " print('no solution found, skipping the final step')\n",
2062 "else:\n",
2063 " print('----------- second pass: minimize the sum of working times')\n",
2064 " bus_driver_scheduling(False, num_drivers)\n",
2065 "\n"