mirror of
https://github.com/myfatemi04/wheelshare-frontend.git
synced 2025-04-21 11:20:17 -04:00
add function for estimating the optimal path
This commit is contained in:
parent
bac9a9aa27
commit
6bcea029d5
67
src/lib/estimateoptimalpath.ts
Normal file
67
src/lib/estimateoptimalpath.ts
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
import latlongdist from './latlongdist';
|
||||||
|
|
||||||
|
export type Location = {
|
||||||
|
latitude: number;
|
||||||
|
longitude: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type Path = {
|
||||||
|
from: Location;
|
||||||
|
to: Location;
|
||||||
|
waypoints: Location[];
|
||||||
|
};
|
||||||
|
|
||||||
|
function getDistance(...locations: Location[]): number {
|
||||||
|
let distance = 0;
|
||||||
|
for (let i = 0; i < locations.length - 1; i++) {
|
||||||
|
const from = locations[i];
|
||||||
|
const to = locations[i + 1];
|
||||||
|
distance += latlongdist(
|
||||||
|
from.latitude,
|
||||||
|
from.longitude,
|
||||||
|
to.latitude,
|
||||||
|
to.longitude
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return distance;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function estimateOptimalPath(path: Path): {
|
||||||
|
path: Path;
|
||||||
|
distance: number;
|
||||||
|
} {
|
||||||
|
const { from, to, waypoints } = path;
|
||||||
|
let sequence = [from, to];
|
||||||
|
|
||||||
|
// Calculates all possible paths from the start to the end of the given path
|
||||||
|
// and returns the one with the minimum distance
|
||||||
|
for (let waypoint of waypoints) {
|
||||||
|
// Iterate over all possible insertion points for the waypoint
|
||||||
|
let minDistance = Infinity;
|
||||||
|
let insertionPoint = 1;
|
||||||
|
for (let i = 0; i < sequence.length - 1; i++) {
|
||||||
|
const [start, end] = sequence.slice(i, i + 2);
|
||||||
|
|
||||||
|
const distance = getDistance(start, waypoint, end);
|
||||||
|
if (distance < minDistance) {
|
||||||
|
minDistance = distance;
|
||||||
|
insertionPoint = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sequence = sequence
|
||||||
|
.slice(0, insertionPoint)
|
||||||
|
.concat([waypoint])
|
||||||
|
.concat(sequence.slice(insertionPoint));
|
||||||
|
}
|
||||||
|
|
||||||
|
const newWaypoints = sequence.slice(1, sequence.length - 1);
|
||||||
|
return {
|
||||||
|
path: {
|
||||||
|
from,
|
||||||
|
to,
|
||||||
|
waypoints: newWaypoints,
|
||||||
|
},
|
||||||
|
distance: getDistance(from, ...sequence, to),
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user