lite-pathfindings
Version:
Simple, intuitive and lightweight pathfinding algorithms
72 lines (57 loc) • 1.29 kB
JavaScript
;
module.exports = {
init: function init(EdgeMap, sDeb) {
var A = EdgeMap;
var S = [];
for (var vertex in A) {
S.push(vertex);
}
var d = [];
S.forEach(function (s) {
d[s] = Number.POSITIVE_INFINITY;
});
d[sDeb] = 0;
var Q = S.concat();
var predecessor = [];
var _loop = function _loop() {
var mini = Number.POSITIVE_INFINITY;
var s1 = -1;
Q.forEach(function (s) {
if (s1 == -1 || d[s] < mini) {
mini = d[s];
s1 = s;
}
});
Q.splice(Q.indexOf(s1), 1);
for (var s2 in A[s1]) {
if (d[s2] > d[s1] + A[s1][s2]) {
d[s2] = d[s1] + A[s1][s2];
predecessor[s2] = s1;
}
}
};
while (Q.length > 0) {
_loop();
}
return predecessor;
},
getPath: function getPath(predecessor, sDeb, sEnd) {
var A = [];
var s = sEnd;
while (s != sDeb) {
A.push(s);
s = predecessor[s];
}
A.push(sDeb);
return A.reverse();
},
getWeight: function getWeight(edgeMap, path) {
var weight = 0;
var vertex = undefined;
path.forEach(function (v) {
if (vertex != undefined) weight += edgeMap[vertex][v];
vertex = v;
});
return weight;
}
};