@cocacola-lover/knight_path_finder
Version:
Iterative path finding Algorithms for knight on a chessboard
88 lines • 4.03 kB
JavaScript
import ChessPointer from "./chess_pointer.js";
import { SearchResult } from "./interfaces.js";
import OrderedLinkedList from "./ordered_linked_list.js";
var BasicPointer = ChessPointer.BasicPointer;
var PathFindingIterators;
(function (PathFindingIterators) {
function baseSearchIterator({ start, end, orderFunction }) {
start.at().distanceFromStart = 0;
let queue = new OrderedLinkedList(orderFunction, [start]);
const explored = new Set();
const iterate = () => {
if (queue.isEmpty())
return { result: SearchResult.TargetNotFound };
let pointer;
while (true) {
if (queue.pickIn() === undefined)
return { result: SearchResult.TargetNotFound };
if (BasicPointer.areSame(queue.pickIn(), end))
return { result: SearchResult.TargetFound };
pointer = queue.shift();
if (explored.has(pointer.toString())) {
continue;
}
else {
break;
}
}
explored.add(pointer.toString());
const neighbours = pointer.getPassableNeighbours();
for (let i = 0; i < neighbours.length; i++) {
const neighbour = neighbours[i];
if (neighbour.at().distanceFromStart !== undefined &&
neighbour.at().distanceFromStart < (pointer.at().distanceFromStart + 1))
continue;
neighbour.at().distanceFromStart = pointer.at().distanceFromStart + 1;
neighbour.at().shortestPath = pointer;
}
let checkIfEndFound = false;
(neighbours.filter((neighbour) => !explored.has(neighbour.toString())))
.forEach((neighbour) => {
if (BasicPointer.areSame(neighbour, end)) {
queue = new OrderedLinkedList(orderFunction, [end]);
checkIfEndFound = true;
}
if (!checkIfEndFound)
queue.add(neighbour);
});
return { result: SearchResult.SearchContinues, from: pointer.at().shortestPath, to: pointer };
};
return iterate;
}
function deepFirstSearchIterator(start, end) {
return baseSearchIterator({ start, end, orderFunction: (a, b) => {
return -1;
} });
}
PathFindingIterators.deepFirstSearchIterator = deepFirstSearchIterator;
function dijkstraSearchIterator(start, end) {
return baseSearchIterator({ start, end, orderFunction: (a, b) => {
const aweight = a.at().weight;
const bweight = b.at().weight;
if (bweight === aweight)
return 1;
return aweight - bweight;
} });
}
PathFindingIterators.dijkstraSearchIterator = dijkstraSearchIterator;
function greedySearchIterator(start, end) {
return baseSearchIterator({ start, end, orderFunction: (a, b) => {
const getDistanse = (a, b) => {
return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
};
return getDistanse(a, end) - getDistanse(b, end);
} });
}
PathFindingIterators.greedySearchIterator = greedySearchIterator;
function aStarSearchIterator(start, end) {
return baseSearchIterator({ start, end, orderFunction: (a, b) => {
const getDistanse = (a, b) => {
return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
};
return (getDistanse(a, end) + getDistanse(a, start)) - (getDistanse(b, end) + getDistanse(b, start));
} });
}
PathFindingIterators.aStarSearchIterator = aStarSearchIterator;
})(PathFindingIterators || (PathFindingIterators = {}));
export default PathFindingIterators;
//# sourceMappingURL=searchAlgorithms.js.map