This homework is to be prepared in teams of two students. Find your partner on http://moodle.uni-graz.at/. Download hw_5.tar.gz and extract it. Then add your homework solutions to the files contained in the directory. Rename the directory according to the rules in the syllabus before submitting it as compressed archive. Don't forget to add the correct subject to the email when submitting.
Properly document the files you hand in to receive full credit. Each module (file) and function needs a docstring. The purpose of each function needs to be summarized as a single sentence and then, if required, your intent and the behavior of the function can be described in more detail.
Furthermore - provide doctests for all functions but main()
.
Each of the modules
needs to include a main()
function which calls the other functions and prints
appropriate output to stdout
.
main()
itself must be called by the ifmain pattern at the end of the file.
read_json(filename)
that takes the name
of a JSON file and returns all data as a dictionary. In this dictionary,
the value containing the customers should be a list of dictionaries. Use
the same keys as in the input file.calc_distance_matrix(node_list)
that
returns a matrix of euclidean distances between all given nodes. The first
index to the matrix must refer to the row, the second to the column.
All nodes'
ids must correspond to the row/ column relevant to that node. The expected
argument is a list that contains all nodes as dictionaries (the depot and
all customers). The function needs to assert that the lowest id is 0, that
all ids are unique and that they are consecutive (0, 1, 2, ...).calc_polar_coordinates(depot, node_list)
that
returns a list with polar
coordinates of the depot and all nodes with respect to the
depot. This first entry has to be the depot having the coordinates (0, 0) followed by
all nodes in the same order as in the input list. For every list entry use the named
tuple Node
consisting of the node id and the polar coordinates saved
as a named tuple PolarCoordinate
.order(p)
having as argument the output
of the function calc_polar_coordinates(.)
and returning a list of nodes
ordered by the angle "r"
.solve_vrp(.)
that takes a dictionary with all
required data as returned by the function
in the first task. solve_vrp(.)
must return a list of routes
(that is, a list of customer lists where each customer still is a dictionary).
Pay extra attention to the source code documentation of this function
(the code can only say what you do, not why you do it).print_routes(.)
that takes a list of routes with customer
dictionaries and prints the routes to stdout. The output format must be one
route (truck) per line with all the customer ids on the route. The output
should resemble the following
[0, 28, 12, 79, 3, 24, 80, 0] [0, 11, 19, 49, 48, 0] ...and end with a final newline. Use as many additional functions as you deem useful.