@@ -3,8 +3,10 @@ jupytext:
33 text_representation :
44 extension : .md
55 format_name : myst
6+ format_version : 0.13
7+ jupytext_version : 1.16.7
68kernelspec :
7- display_name : Python 3
9+ display_name : Python 3 (ipykernel)
810 language : python
911 name : python3
1012---
@@ -44,7 +46,7 @@ Dynamic programming is an extremely powerful optimization technique that we appl
4446
4547The only scientific library we'll need in what follows is NumPy:
4648
47- ``` {code-cell} python3
49+ ``` {code-cell} ipython3
4850import numpy as np
4951```
5052
195197
196198For example, for the simple graph above, we set
197199
198- ``` {code-cell} python3
200+ ``` {code-cell} ipython3
199201from numpy import inf
200202
201203Q = np.array([[inf, 1, 5, 3, inf, inf, inf],
@@ -216,7 +218,7 @@ For the sequence of approximations $\{J_n\}$ of the cost-to-go functions, we can
216218
217219Let's try with this example and see how we go:
218220
219- ``` {code-cell} python3
221+ ``` {code-cell} ipython3
220222nodes = range(7) # Nodes = 0, 1, ..., 6
221223J = np.zeros_like(nodes, dtype=int) # Initial guess
222224next_J = np.empty_like(nodes, dtype=int) # Stores updated guess
@@ -249,7 +251,7 @@ But, importantly, we now have a methodology for tackling large graphs.
249251:label: short_path_ex1
250252```
251253
252- The text below describes a weighted directed graph.
254+ The file data below describes a weighted directed graph.
253255
254256The line ` node0, node1 0.04, node8 11.11, node14 72.21 ` means that from node0 we can go to
255257
@@ -268,108 +270,16 @@ You will be dealing with floating point numbers now, rather than
268270integers, so consider replacing `np.equal()` with `np.allclose()`.
269271```
270272
271- ``` {code-cell} python3
272- %%file graph.txt
273- node0, node1 0.04, node8 11.11, node14 72.21
274- node1, node46 1247.25, node6 20.59, node13 64.94
275- node2, node66 54.18, node31 166.80, node45 1561.45
276- node3, node20 133.65, node6 2.06, node11 42.43
277- node4, node75 3706.67, node5 0.73, node7 1.02
278- node5, node45 1382.97, node7 3.33, node11 34.54
279- node6, node31 63.17, node9 0.72, node10 13.10
280- node7, node50 478.14, node9 3.15, node10 5.85
281- node8, node69 577.91, node11 7.45, node12 3.18
282- node9, node70 2454.28, node13 4.42, node20 16.53
283- node10, node89 5352.79, node12 1.87, node16 25.16
284- node11, node94 4961.32, node18 37.55, node20 65.08
285- node12, node84 3914.62, node24 34.32, node28 170.04
286- node13, node60 2135.95, node38 236.33, node40 475.33
287- node14, node67 1878.96, node16 2.70, node24 38.65
288- node15, node91 3597.11, node17 1.01, node18 2.57
289- node16, node36 392.92, node19 3.49, node38 278.71
290- node17, node76 783.29, node22 24.78, node23 26.45
291- node18, node91 3363.17, node23 16.23, node28 55.84
292- node19, node26 20.09, node20 0.24, node28 70.54
293- node20, node98 3523.33, node24 9.81, node33 145.80
294- node21, node56 626.04, node28 36.65, node31 27.06
295- node22, node72 1447.22, node39 136.32, node40 124.22
296- node23, node52 336.73, node26 2.66, node33 22.37
297- node24, node66 875.19, node26 1.80, node28 14.25
298- node25, node70 1343.63, node32 36.58, node35 45.55
299- node26, node47 135.78, node27 0.01, node42 122.00
300- node27, node65 480.55, node35 48.10, node43 246.24
301- node28, node82 2538.18, node34 21.79, node36 15.52
302- node29, node64 635.52, node32 4.22, node33 12.61
303- node30, node98 2616.03, node33 5.61, node35 13.95
304- node31, node98 3350.98, node36 20.44, node44 125.88
305- node32, node97 2613.92, node34 3.33, node35 1.46
306- node33, node81 1854.73, node41 3.23, node47 111.54
307- node34, node73 1075.38, node42 51.52, node48 129.45
308- node35, node52 17.57, node41 2.09, node50 78.81
309- node36, node71 1171.60, node54 101.08, node57 260.46
310- node37, node75 269.97, node38 0.36, node46 80.49
311- node38, node93 2767.85, node40 1.79, node42 8.78
312- node39, node50 39.88, node40 0.95, node41 1.34
313- node40, node75 548.68, node47 28.57, node54 53.46
314- node41, node53 18.23, node46 0.28, node54 162.24
315- node42, node59 141.86, node47 10.08, node72 437.49
316- node43, node98 2984.83, node54 95.06, node60 116.23
317- node44, node91 807.39, node46 1.56, node47 2.14
318- node45, node58 79.93, node47 3.68, node49 15.51
319- node46, node52 22.68, node57 27.50, node67 65.48
320- node47, node50 2.82, node56 49.31, node61 172.64
321- node48, node99 2564.12, node59 34.52, node60 66.44
322- node49, node78 53.79, node50 0.51, node56 10.89
323- node50, node85 251.76, node53 1.38, node55 20.10
324- node51, node98 2110.67, node59 23.67, node60 73.79
325- node52, node94 1471.80, node64 102.41, node66 123.03
326- node53, node72 22.85, node56 4.33, node67 88.35
327- node54, node88 967.59, node59 24.30, node73 238.61
328- node55, node84 86.09, node57 2.13, node64 60.80
329- node56, node76 197.03, node57 0.02, node61 11.06
330- node57, node86 701.09, node58 0.46, node60 7.01
331- node58, node83 556.70, node64 29.85, node65 34.32
332- node59, node90 820.66, node60 0.72, node71 0.67
333- node60, node76 48.03, node65 4.76, node67 1.63
334- node61, node98 1057.59, node63 0.95, node64 4.88
335- node62, node91 132.23, node64 2.94, node76 38.43
336- node63, node66 4.43, node72 70.08, node75 56.34
337- node64, node80 47.73, node65 0.30, node76 11.98
338- node65, node94 594.93, node66 0.64, node73 33.23
339- node66, node98 395.63, node68 2.66, node73 37.53
340- node67, node82 153.53, node68 0.09, node70 0.98
341- node68, node94 232.10, node70 3.35, node71 1.66
342- node69, node99 247.80, node70 0.06, node73 8.99
343- node70, node76 27.18, node72 1.50, node73 8.37
344- node71, node89 104.50, node74 8.86, node91 284.64
345- node72, node76 15.32, node84 102.77, node92 133.06
346- node73, node83 52.22, node76 1.40, node90 243.00
347- node74, node81 1.07, node76 0.52, node78 8.08
348- node75, node92 68.53, node76 0.81, node77 1.19
349- node76, node85 13.18, node77 0.45, node78 2.36
350- node77, node80 8.94, node78 0.98, node86 64.32
351- node78, node98 355.90, node81 2.59
352- node79, node81 0.09, node85 1.45, node91 22.35
353- node80, node92 121.87, node88 28.78, node98 264.34
354- node81, node94 99.78, node89 39.52, node92 99.89
355- node82, node91 47.44, node88 28.05, node93 11.99
356- node83, node94 114.95, node86 8.75, node88 5.78
357- node84, node89 19.14, node94 30.41, node98 121.05
358- node85, node97 94.51, node87 2.66, node89 4.90
359- node86, node97 85.09
360- node87, node88 0.21, node91 11.14, node92 21.23
361- node88, node93 1.31, node91 6.83, node98 6.12
362- node89, node97 36.97, node99 82.12
363- node90, node96 23.53, node94 10.47, node99 50.99
364- node91, node97 22.17
365- node92, node96 10.83, node97 11.24, node99 34.68
366- node93, node94 0.19, node97 6.71, node99 32.77
367- node94, node98 5.91, node96 2.03
368- node95, node98 6.17, node99 0.27
369- node96, node98 3.32, node97 0.43, node99 5.87
370- node97, node98 0.30
371- node98, node99 0.33
372- node99,
273+ ``` {code-cell} ipython3
274+ import requests
275+
276+ file_url = "https://raw.githubusercontent.com/QuantEcon/lecture-python-intro/main/lectures/graph.txt"
277+ graph_file_response = requests.get(file_url)
278+ ```
279+
280+ ``` {code-cell} ipython3
281+ graph_file_data = str(graph_file_response.content, 'utf-8')
282+ print(graph_file_data)
373283```
374284
375285``` {exercise-end}
@@ -381,27 +291,30 @@ node99,
381291
382292First let's write a function that reads in the graph data above and builds a distance matrix.
383293
384- ``` {code-cell} python3
294+ ``` {code-cell} ipython3
385295num_nodes = 100
386296destination_node = 99
387297
388- def map_graph_to_distance_matrix(in_file ):
298+ def map_graph_to_distance_matrix(in_file_data ):
389299
390300 # First let's set of the distance matrix Q with inf everywhere
391301 Q = np.full((num_nodes, num_nodes), np.inf)
392302
393303 # Now we read in the data and modify Q
394- with open(in_file) as infile:
395- for line in infile:
396- elements = line.split(',')
397- node = elements.pop(0)
398- node = int(node[4:]) # convert node description to integer
399- if node != destination_node:
400- for element in elements:
401- destination, cost = element.split()
402- destination = int(destination[4:])
403- Q[node, destination] = float(cost)
404- Q[destination_node, destination_node] = 0
304+ lines = in_file_data.split('\n')
305+ for line_ in lines:
306+ line = line_.strip()
307+ if line == '':
308+ continue
309+ elements = line.split(',')
310+ node = elements.pop(0)
311+ node = int(node[4:]) # convert node description to integer
312+ if node != destination_node:
313+ for element in elements:
314+ destination, cost = element.split()
315+ destination = int(destination[4:])
316+ Q[node, destination] = float(cost)
317+ Q[destination_node, destination_node] = 0
405318 return Q
406319```
407320
@@ -414,7 +327,7 @@ We'll use the algorithm described above.
414327
415328The minimization step is vectorized to make it faster.
416329
417- ``` {code-cell} python3
330+ ``` {code-cell} ipython3
418331def bellman(J, Q):
419332 return np.min(Q + J, axis=1)
420333
@@ -442,7 +355,7 @@ dealing with floating point numbers now.
442355Finally, here's a function that uses the cost-to-go function to obtain the
443356optimal path (and its cost).
444357
445- ``` {code-cell} python3
358+ ``` {code-cell} ipython3
446359def print_best_path(J, Q):
447360 sum_costs = 0
448361 current_node = 0
@@ -459,17 +372,17 @@ def print_best_path(J, Q):
459372
460373Okay, now we have the necessary functions, let's call them to do the job we were assigned.
461374
462- ``` {code-cell} python3
463- Q = map_graph_to_distance_matrix('graph.txt' )
375+ ``` {code-cell} ipython3
376+ Q = map_graph_to_distance_matrix(graph_file_data )
464377J = compute_cost_to_go(Q)
465378print_best_path(J, Q)
466379```
467380
468381The total cost of the path should agree with $J[ 0] $ so let's check this.
469382
470- ``` {code-cell} python3
383+ ``` {code-cell} ipython3
471384J[0]
472385```
473386
474387``` {solution-end}
475- ```
388+ ```
0 commit comments