GayathriReddy96874/autonomous-route-optimizer
0
1import pandas as pd2import numpy as np3 4class DataLoader:5 6 def __init__(self, path):7 self.path = path8 self.df = pd.read_csv(path)9 10 # Clean column names11 self.df.columns = [c.strip().lower() for c in self.df.columns]12 13 # Rename if needed14 if "neighborhood" in self.df.columns:15 self.df.rename(columns={"neighborhood": "name"}, inplace=True)16 17 if "latitude" in self.df.columns:18 self.df.rename(columns={"latitude": "lat"}, inplace=True)19 20 if "longitude" in self.df.columns:21 self.df.rename(columns={"longitude": "lon"}, inplace=True)22 23 # Keep only valid Bengaluru coordinates24 self.df = self.df[25 (self.df["lat"].between(12.7, 13.2)) &26 (self.df["lon"].between(77.3, 77.9))27 ].reset_index(drop=True)28 29 # Remove duplicates30 self.df = self.df.drop_duplicates(subset=["name"])31 32 # Add depot manually at center if not present33 if "Depot" not in self.df["name"].values:34 depot = pd.DataFrame([{35 "name": "Depot",36 "lat": 12.9716,37 "lon": 77.594638 }])39 self.df = pd.concat([depot, self.df], ignore_index=True)40 41 # ---------------------------------------------------42 def load_data(self, n):43 subset = self.df.head(n)44 return list(zip(subset["name"], subset["lat"], subset["lon"]))45 46 # ---------------------------------------------------47 def get_distance_matrix(self, locations):48 n = len(locations)49 matrix = np.zeros((n, n))50 51 for i in range(n):52 for j in range(n):53 if i != j:54 lat1, lon1 = locations[i][1], locations[i][2]55 lat2, lon2 = locations[j][1], locations[j][2]56 matrix[i][j] = self.haversine(lat1, lon1, lat2, lon2)57 58 return matrix59 60 # ---------------------------------------------------61 def haversine(self, lat1, lon1, lat2, lon2):62 R = 6371 # Earth radius in km63 lat1, lon1, lat2, lon2 = map(64 np.radians, [lat1, lon1, lat2, lon2]65 )66 67 dlat = lat2 - lat168 dlon = lon2 - lon169 70 a = np.sin(dlat/2)**2 + np.cos(lat1)*np.cos(lat2)*np.sin(dlon/2)**271 c = 2 * np.arcsin(np.sqrt(a))72 73 return R * c