async function mvrp(
data,
options = {
objective: {
minimise_num_depots: false,
travel_cost: "distance"
}
}
) {
let url = "";
url = `https://api.nextbillion.io/optimization/v2`;
const optimizeRequest = await axios
.post(`${url}` + `?key=${apiKey}`, {
...data,
options
})
.then((res) => res.data);
const mvrpRequestId = optimizeRequest.id;
let attempts = 0;
while (attempts < 50) {
const result = await axios({
url: `${url}/result?id=${mvrpRequestId}&key=${apiKey}`,
method: "GET",
headers: {}
});
if (
result.data &&
result.data.status === "Ok" &&
result.data.message == ""
) {
result.data.id = mvrpRequestId;
let deliveryCount = 0;
result.data.result.routes.forEach((rte, rteidx) => {
rte.steps.forEach((step, index) => {
if (step.id && step.id != 99) {
++deliveryCount;
}
});
});
result.data.kpis = {
totalDistance: `${(result.data.result.summary.distance / 1000).toFixed(
1
)} km`,
totalTime: `${(result.data.result.summary.duration / 60).toFixed(
1
)} mn`,
nbrRoutes: result.data.result.summary.routes,
avgStops: (deliveryCount / result.data.result.summary.routes).toFixed(
1
),
unassigned: result.data.result.summary.unassigned,
frontSeatWeight: result.data.description.split("|")[1]
};
return result.data;
}
attempts++;
await new Promise((resolve) => setTimeout(resolve, 2 * 1000));
}
}