Mind.js — это библиотека для построения и анализа графов и сетей в JavaScript. Она предоставляет функционал для создания узлов, ребер, весов и различных алгоритмов поиска, включая поиск в глубину, поиск в ширину и алгоритмы кратчайшего пути. Работа с графами в Mind.js строится вокруг двух ключевых сущностей: Node и Graph.
const { Graph, Node } = require('mindjs');
const graph = new Graph();
const nodeA = new Node('A');
const nodeB = new Node('B');
graph.addNode(nodeA);
graph.addNode(nodeB);
graph.addEdge(nodeA, nodeB, { weight: 5 });
Здесь создаётся граф с двумя узлами и ребром с весом 5, направленным от A к B. Вес ребра используется в алгоритмах поиска кратчайшего пути.
Mind.js реализует несколько базовых алгоритмов обхода графа. Каждый из них оптимизирован под разные задачи.
BFS применяется для нахождения кратчайшего пути по количеству ребер в неориентированных и ориентированных графах без учёта веса. Алгоритм использует очередь и посещает узлы по уровням, начиная с исходного.
const bfsResult = graph.bfs(nodeA, nodeB);
console.log(bfsResult.path); // массив узлов, представляющий путь
Особенности:
DFS исследует граф рекурсивно, продвигаясь как можно глубже по каждому пути. Использует стек для хранения текущего пути.
const dfsResult = graph.dfs(nodeA, nodeB);
console.log(dfsResult.path); // путь от nodeA к nodeB
Особенности:
Для поиска кратчайшего пути с учётом веса ребер применяется алгоритм Дейкстры. Mind.js предоставляет встроенную реализацию, которая автоматически учитывает веса.
const dijkstraResult = graph.dijkstra(nodeA, nodeB);
console.log(dijkstraResult.distance); // минимальное расстояние
console.log(dijkstraResult.path); // массив узлов для минимального пути
Ключевые моменты:
Mind.js различает два типа графов:
const weightedGraph = new Graph({ directed: true, weighted: true });
weightedGraph.addEdge(nodeA, nodeB, { weight: 10 });
directed определяет направленность ребер.weighted указывает, что вес ребер имеет
значение для алгоритмов поиска.Mind.js поддерживает методы для обхода графа и анализа его структуры:
Пример анализа:
const neighborsOfA = graph.neighbors(nodeA);
const degreeOfA = graph.degree(nodeA);
console.log(neighborsOfA, degreeOfA);
Эти методы позволяют быстро получить информацию о связности, плотности и центральности узлов.
const targets = [nodeB, nodeC];
const paths = targets.map(target => graph.dijkstra(nodeA, target).path);
console.log(paths);
const allPaths = graph.findAllPaths(nodeA, nodeB);
console.log(allPaths); // массив массивов узлов
const cycles = graph.findCycles();
const isConnected = graph.isConnected();
console.log(cycles, isConnected);
Mind.js позволяет создавать как простые, так и сложные структуры графов, интегрировать весовые параметры и использовать разнообразные алгоритмы поиска без необходимости вручную реализовывать сложные алгоритмы.