def test_calculate_cost_calculator_with_one_cars(): solution = Solution(vehicle_routes=np.array([[2, 1, 0], [0, 0, 0]])) node_distances = NodeDistances( distances=np.array([[0, 1, 2], [3, 0, 5], [6, 7, 0]])) calculator = SolutionRestrictionsCalculator(node_distances=node_distances, vehicle_allowed_distances=None) cost = calculator.calculate_cost(solution=solution) assert 12 == cost, "All only one route should sum 12"
def test_get_vehicle_consumed_distance(): solution = Solution(vehicle_routes=np.array([[2, 1, 3, 0], [0, 0, 0, 0]])) node_distances = NodeDistances(distances=np.array( [[0, 7, 3, 1], [2, 0, 4, 6], [3, 6, 0, 9], [5, 10, 15, 0]])) calculator = SolutionRestrictionsCalculator(node_distances=node_distances, vehicle_allowed_distances=None) cost = calculator.get_vehicle_consumed_distance(solution=solution, vehicle=0) assert 20 == cost, "All only one route should sum 20"
def test_update_cost_solution_when_2_routes_change(): solution1=Solution(vehicle_routes=np.array([[2, 0 , 0, 0],[1,3, 0,0],[0,0,0,0]])) solution2=Solution(vehicle_routes=np.array([[2, 0 , 0,0],[1, 0, 0,0],[3,0,0,0]])) node_distances=NodeDistances(distances=np.array([[0, 1, 2,20],[3, 0, 5,21],[6, 7, 0,22],[9,1,1,0]])) vehicle_allowed_distances=VehicleAllowedDistances(distances=[14, 20, 15]) calculator=SolutionRestrictionsCalculator(node_distances=node_distances,vehicle_allowed_distances=vehicle_allowed_distances) cost=Neighborhood(solution_restrictions_calculator=calculator). \ _update_solution_cost(old_solution=solution1,new_solution=solution2,vehicles_involved=[1,2]) assert cost==41 , "Update cost should be 41"
def test_remaining_distance_for_vehicle_returns_negative(): solution = Solution(vehicle_routes=np.array([[2, 1, 0], [0, 0, 0]])) node_distances = NodeDistances( distances=np.array([[0, 1, 2], [3, 0, 5], [6, 7, 0]])) vehicle_allowed_distances = VehicleAllowedDistances(distances=[10, 7, 0]) calculator = SolutionRestrictionsCalculator( node_distances=node_distances, vehicle_allowed_distances=vehicle_allowed_distances) remaining_distance = calculator.get_vehicle_remaining_distance( solution=solution, vehicle=0) assert -2 == remaining_distance, "-2 should be the remaining distance"
def test_init_one2one_all_customes_are_visited(init_random_seed): init_random_seed node_distances=NodeDistances(distances=np.array([[0, 1, 1, 1],[1, 0, 1,1],[1, 1, 0,1],[1,1,1,0]])) vehicle_distances=VehicleAllowedDistances(distances=np.array([2, 2,2])) initializer=SolutionInitializer(node_distances=node_distances,vehicle_allowed_distances=vehicle_distances) solution=initializer.init_one_node_to_one_vehicle() vehicle_routes=solution.vehicle_routes num_node1=np.where(vehicle_routes==1)[0] num_node2=np.where(vehicle_routes==2)[0] num_node3=np.where(vehicle_routes==3)[0] assert len(num_node1)==1, "Node 1 should be only once" assert len(num_node2)==1, "Node 2 should be only once" assert len(num_node3)==1, "Node 3 should be only once"
def execute_single_instance_once(self,path_to_node_distances:str, path_to_max_vehicle_distances:str, metaheuristic:str)->(): """ Execute a single instance of a problem, just only once. The result is a tuple containing: (solution, elapsed_time) """ node_distances=NodeDistances(distances=Reader.read_distances_between_nodes_in_file(path_to_file=path_to_node_distances)) vehicle_allowed_distances=VehicleAllowedDistances(distances=Reader.read_vehicle_allowed_distances_in_file(path_to_file=path_to_max_vehicle_distances)) solution_restrictions_calculator=SolutionRestrictionsCalculator(node_distances=node_distances, vehicle_allowed_distances=vehicle_allowed_distances) metaheu_obj=MetaheuristicFactory.create_metaheuristic(metaheuristic=metaheuristic, solution_restrictions_calculator=solution_restrictions_calculator, \ init=self.init, search_type=self.search_type, number_iterations=self.number_iterations, memory_size=self.memory_size, max_running_secs=self.max_running_secs) tic=time.time() solution=metaheu_obj.run() tac=time.time() elapsed_time=tac-tic return (solution,elapsed_time)