From d1c53e08bbab61bd07e8492395bf9d6bc54ed769 Mon Sep 17 00:00:00 2001 From: Helldragon67 Date: Tue, 10 Sep 2024 17:23:01 +0200 Subject: [PATCH] improved tour length --- .../src/parameters/optimizer_parameters.yaml | 1 + backend/src/tester.py | 1 + backend/src/utils/optimizer.py | 18 ++++++++++-------- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/backend/src/parameters/optimizer_parameters.yaml b/backend/src/parameters/optimizer_parameters.yaml index 77efa02..b9f7b58 100644 --- a/backend/src/parameters/optimizer_parameters.yaml +++ b/backend/src/parameters/optimizer_parameters.yaml @@ -3,3 +3,4 @@ detour_corridor_width: 300 average_walking_speed: 4.8 max_landmarks: 10 max_landmarks_refiner: 20 +overshoot: 1.4 diff --git a/backend/src/tester.py b/backend/src/tester.py index ff81fb7..dd25aa9 100644 --- a/backend/src/tester.py +++ b/backend/src/tester.py @@ -63,6 +63,7 @@ def test(start_coords: tuple[float, float], finish_coords: tuple[float, float] = logger.info("Optimized route : ") for l in linked_tour : logger.info(f"{l}") + logger.info(f"Estimated length of tour : {linked_tour.total_time}") # with open('linked_tour.yaml', 'w') as f: # yaml.dump(linked_tour.asdict(), f) diff --git a/backend/src/utils/optimizer.py b/backend/src/utils/optimizer.py index 38fc375..944bd49 100644 --- a/backend/src/utils/optimizer.py +++ b/backend/src/utils/optimizer.py @@ -17,10 +17,11 @@ class Optimizer: logger = logging.getLogger(__name__) - detour: int = None # accepted max detour time (in minutes) - detour_factor: float # detour factor of straight line vs real distance in cities - average_walking_speed: float # average walking speed of adult - max_landmarks: int # max number of landmarks to visit + detour: int = None # accepted max detour time (in minutes) + detour_factor: float # detour factor of straight line vs real distance in cities + average_walking_speed: float # average walking speed of adult + max_landmarks: int # max number of landmarks to visit + overshoot: float # overshoot to allow maxtime to overflow. Optimizer is a bit restrictive def __init__(self) : @@ -31,6 +32,7 @@ class Optimizer: self.detour_factor = parameters['detour_factor'] self.average_walking_speed = parameters['average_walking_speed'] self.max_landmarks = parameters['max_landmarks'] + self.overshoot = parameters['overshoot'] @@ -167,7 +169,7 @@ class Optimizer: - def init_ub_dist(self, landmarks: list[Landmark], max_steps: int): + def init_ub_dist(self, landmarks: list[Landmark], max_time: int): """ Initialize the objective function coefficients and inequality constraints for the optimization problem. @@ -176,7 +178,7 @@ class Optimizer: Args: landmarks (list[Landmark]): List of landmarks. - max_steps (int): Maximum number of steps allowed. + max_time (int): Maximum time of visit allowed. Returns: Tuple[list[float], list[float], list[int]]: Objective function coefficients, inequality constraint coefficients, and the right-hand side of the inequality constraint. @@ -200,7 +202,7 @@ class Optimizer: A_ub += dist_table c = c*len(landmarks) - return c, A_ub, [max_steps] + return c, A_ub, [max_time*self.overshoot] def respect_number(self, L, max_landmarks: int): @@ -474,7 +476,7 @@ class Optimizer: A, b = self.respect_start_finish(L) # Force start and finish positions A_eq = np.vstack((A_eq, A), dtype=np.int8) b_eq += b - A, b = self.respect_order(L) # Respect order of visit (only works when max_steps is limiting factor) + A, b = self.respect_order(L) # Respect order of visit (only works when max_time is limiting factor) A_eq = np.vstack((A_eq, A), dtype=np.int8) b_eq += b