2017-01-12 12 views
0

Я пытаюсь выделить все узлы и пути при щелчке от узла к корню.Выделите фактический путь в дереве как данные в Cytoscape

Я нашел частичный пример в этой ссылке - How to highlight the path between two nodes in CYTOSCAPE JS.

Код в приведенной ссылке использует алгоритм Дейкстры для нахождения кратчайшего пути. Но мне нужен фактический путь, как указано в данных.

Например, рассмотрим следующие данные:

nodes: [ 
    { data: { id: 'a' } }, 
    { data: { id: 'b' } }, 
    { data: { id: 'c' } }, 
    { data: { id: 'd' } }, 
    { data: { id: 'e' } }, 
    { data: { id: 'f' } }, 
    { data: { id: 'g' } } 
    ], 

edges: [ 
    { data: { id: 'ab', weight: 1, source: 'a', target: 'b' } }, 
    { data: { id: 'ac', weight: 2, source: 'a', target: 'c' } }, 
    { data: { id: 'bd', weight: 3, source: 'b', target: 'd' } }, 
    { data: { id: 'be', weight: 4, source: 'b', target: 'e' } }, 
    { data: { id: 'cg1', weight: 5, source: 'c', target: 'g' } }, 
    { data: { id: 'gc1', weight: 6, source: 'g', target: 'c' } }, 
    { data: { id: 'cg2', weight: 7, source: 'c', target: 'g' } }, 
    { data: { id: 'gf', weight: 8, source: 'g', target: 'f' } } 
    ] 

Использование кода в ссылке, дерево изюминка как это работает, если источником является и цель е.

Tree Highlight with Dijkstra's Algorithm

Если кто-то может помочь мне отследить и выделить путь, как указано в данных, было бы очень полезно.

+0

Путь Dijkstra дает * is * путь, взятый из 'a' в' f'. Пожалуйста, уточните свой вопрос. Неясно, чего вы хотите. У вас есть пример данных, поэтому, пожалуйста, укажите, что вы ожидаете в качестве вывода для этого набора данных. – maxkfranz

ответ

0

Я смог распечатать кратчайший путь, используя метод A *. Изменяя его для алгоритма Дейкстры, я бы, вероятно, к примеру реализовать FFG:

var dijkstra = cy.elements().dijkstra('#e', function(){ 
    return this.data('weight'); 
}); 

var pathToJ = dijkstra.pathTo(cy.$('#j')); 

       for (i = 0,j=0; i < pathToJ.nodes().size(),j<pathToJ.edges().size(); i++,j++) { 
        console.log('Nodes Size - '+ pathToJ.nodes().size()); 
        console.log('Edges Size - '+ pathToJ.edges().size()); 
        console.log('Node - \t' + pathToJ.nodes()[i].data('id')); 
        console.log('edge - \t' + pathToJ.edges()[j].data('id')); 
       } 

pathTo(node) возвращает коллекцию, содержащую кратчайший путь от узла-источника к узлу.

Если весовая функция не определена, для каждого ребра используется постоянный вес 1.