def clone(self):
        """Returns a deep copy of self

        Function clones:
        
        * route
        * allocation
        * nodes
        
        Returns
        -------
        type
            Deep copy of self
        """

        new_solution = self.__class__(self._problem, len(self._routes))

        # Clone routes
        for index, r in enumerate(self._routes):
            new_route = new_solution._routes[index]
            for node in r.nodes():
                # Insere new node on new route
                new_node = new_solution._nodes[node]
                new_route.allocate([new_node])

        return new_solution