def compute_savings_list(self, graph):
        """Compute Clarke and Wright savings list

        A saving list is a matrix containing the saving amount S between i and j

        S is calculated by S = d(0,i) + d(0,j) - d(i,j) (CLARKE; WRIGHT, 1964)
        
        Args
        ----
        graph: :networkx:`NetworkX Graph Obj< >`
            A NetworkX graaph is used.
        
        Returns
        -------
        :any:`list` of `Node`
            List of nodes sorted by its savings
        """

        savings_list = {}

        for i, j in graph.edges():
            # t = (i, j)
            if repr(i) < repr(j):
                t = (i, j)
            else:
                t = (j, i)

            if i == graph.depot() or j == graph.depot():
                continue

            savings_list[t] = graph.distance(graph.depot(), i) + graph.distance(graph.depot(), j) - graph.distance(i, j)

        sorted_savings_list = sorted(list(savings_list.items()), key=operator.itemgetter(1), reverse=True)

        return [nodes for nodes, saving in sorted_savings_list]
Compute Clarke and Wright savings list

        A saving list is a matrix containing the saving amount S between i and j

        S is calculated by S = d(0,i) + d(0,j) - d(i,j) (CLARKE; WRIGHT, 1964)
        
        Args
        ----
        graph: :networkx:`NetworkX Graph Obj< >`
            A NetworkX graaph is used.
        
        Returns
        -------
        :any:`list` of `Node`
            List of nodes sorted by its savings