81 lines
2.5 KiB
Python
81 lines
2.5 KiB
Python
import pandas as pd
|
|
|
|
from typing import List
|
|
from landmarks_manager import LandmarkManager
|
|
from fastapi.encoders import jsonable_encoder
|
|
|
|
from optimizer import solve_optimization
|
|
# from refiner import refine_optimization
|
|
from structs.landmarks import Landmark
|
|
from structs.landmarktype import LandmarkType
|
|
from structs.preferences import Preferences, Preference
|
|
|
|
|
|
# Helper function to create a .txt file with results
|
|
def write_data(L: List[Landmark], file_name: str):
|
|
|
|
data = pd.DataFrame()
|
|
i = 0
|
|
|
|
for landmark in L :
|
|
data[i] = jsonable_encoder(landmark)
|
|
i += 1
|
|
|
|
data.to_json(file_name, indent = 2, force_ascii=False)
|
|
|
|
def main(coordinates: tuple[float, float]) -> List[Landmark]:
|
|
|
|
manager = LandmarkManager()
|
|
|
|
preferences = Preferences(
|
|
sightseeing=Preference(
|
|
name='sightseeing',
|
|
type=LandmarkType(landmark_type='sightseeing'),
|
|
score = 5
|
|
),
|
|
nature=Preference(
|
|
name='nature',
|
|
type=LandmarkType(landmark_type='nature'),
|
|
score = 5
|
|
),
|
|
shopping=Preference(
|
|
name='shopping',
|
|
type=LandmarkType(landmark_type='shopping'),
|
|
score = 5
|
|
)
|
|
)
|
|
|
|
|
|
# Create start and finish
|
|
start = Landmark(name='start', type=LandmarkType(landmark_type='start'), location=coordinates, osm_type='start', osm_id=0, attractiveness=0, must_do=True, n_tags = 0)
|
|
finish = Landmark(name='finish', type=LandmarkType(landmark_type='finish'), location=coordinates, osm_type='finish', osm_id=0, attractiveness=0, must_do=True, n_tags = 0)
|
|
|
|
# Generate the landmarks from the start location
|
|
landmarks, landmarks_short = manager.get_landmark_lists(preferences=preferences, center_coordinates=start.location)
|
|
print([l.name for l in landmarks_short])
|
|
|
|
#write_data(landmarks, "landmarks.txt")
|
|
|
|
# Insert start and finish to the landmarks list
|
|
landmarks_short.insert(0, start)
|
|
landmarks_short.append(finish)
|
|
|
|
# TODO use these parameters in another way
|
|
max_walking_time = 3 # hours
|
|
detour = 30 # minutes
|
|
|
|
# First stage optimization
|
|
base_tour = solve_optimization(landmarks_short, max_walking_time*60, True)
|
|
|
|
# Second stage optimization
|
|
# refined_tour = refine_optimization(landmarks, base_tour, max_walking_time*60+detour, True)
|
|
|
|
return base_tour
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
start = (48.847132, 2.312359) # Café Chez César
|
|
# start = (47.377859, 8.540585) # Zurich HB
|
|
main(start)
|