Created
May 9, 2018 12:38
-
-
Save trinhvanhuy/465dfdb24821b1fb8a6fd9619125503d to your computer and use it in GitHub Desktop.
Test Gofer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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