Skip to content

Instantly share code, notes, and snippets.

@trinhvanhuy
Created May 9, 2018 12:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save trinhvanhuy/465dfdb24821b1fb8a6fd9619125503d to your computer and use it in GitHub Desktop.
Save trinhvanhuy/465dfdb24821b1fb8a6fd9619125503d to your computer and use it in GitHub Desktop.
Test Gofer
// All the mission that aren't being taken
let missionsQueue = [];
let currentTime = 0;
// Init list 50 masssageurs
let massageurs = [];
for (let i = 1; i <= 50; i++) {
massageurs.push({
index: i.toString(),
realIndex: i - 1,
availableAt: 0,
x: 0,
y: 0
});
}
// calculate distance between 2 GPS points
let calculateDistance = (lat1, lon1, lat2, lon2) => {
let radlat1 = Math.PI * lat1 / 180;
let radlat2 = Math.PI * lat2 / 180;
let theta = lon1 - lon2;
let radtheta = Math.PI * theta / 180;
let dist =
Math.sin(radlat1) * Math.sin(radlat2) +
Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
dist = Math.acos(dist);
dist = dist * 180 / Math.PI;
dist = dist * 60 * 1.1515;
return (dist = dist * 1.609344);
};
function attributeMissions(missions) {
let results = {};
missionsQueue = missionsQueue.concat(missions);
for (let i = missionsQueue.length - 1; i >= 0; i--) {
let massageurNeedToGo = {
timeTogo: 0,
rdv: null,
massageur: null
};
// Get all massageurs available
let massageurAvailable = massageurs.filter(
x => x.availableAt <= currentTime
);
for (let j = 0; j < massageurAvailable.length; j++) {
let distance = calculateDistance(
missionsQueue[i].x,
missionsQueue[i].y,
massageurAvailable[j].x,
massageurAvailable[j].y
);
// Get time needed to go to the RDV
let timeTogo = distance / 15;
if (
massageurNeedToGo.timeTogo === 0 ||
massageurNeedToGo.timeTogo >= timeTogo
) {
massageurNeedToGo.timeTogo = timeTogo;
massageurNeedToGo.rdv = missionsQueue[i];
massageurNeedToGo.massageur = massageurAvailable[j];
}
}
if (
massageurNeedToGo.massageur !== null &&
(massageurNeedToGo.timeTogo + currentTime <= missionsQueue[i].start &&
massageurNeedToGo.timeTogo + currentTime >= missionsQueue[i].start - 5)
) {
results[massageurNeedToGo.massageur.index] = {
x: missionsQueue[i].x,
y: missionsQueue[i].y
};
massageurs[massageurNeedToGo.massageur.realIndex].availableAt =
missionsQueue[i].start + missionsQueue[i].length;
massageurs[massageurNeedToGo.massageur.realIndex].x = missionsQueue[i].x;
massageurs[massageurNeedToGo.massageur.realIndex].y = missionsQueue[i].y;
// remove mission from queue
missionsQueue.splice(i, 1);
}
}
currentTime += 5;
return results;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment