0

Мне нужно вычислить degree, близость и центрированность между центрами для каждого узла на графике. В настоящее время я использую функции, встроенные в Cytoscape.js на каждом узле после события cy.ready(). Однако, поскольку графики достаточно велики (250+ узлов, 650+ соединений), слишком много времени для вычисления. Может ли кто-нибудь предложить более эффективный метод?Выполнять функции централизованности на всех узлах с использованием Cytoscape.js

var calculateSNA = function() { 
    // Don't run if already set... 
    if(data.sna) return false 
    console.log('Running SNA') 

    _.map(nodes, function(node) { 
    var target = cy.nodes('#' + node.data.id) 
    node.data.sna = { 
     degreeCentrality: cy.$().dc({ root: target }).degree, 
     closenessCentrality: cy.$().cc({ root: target }), 
     betweennessCentrality: cy.$().bc().betweenness(target) 
    } 
    return node 
    }) 

    // Add SNA data to local storage 
    Data.add({ 
    sna: true 
    }) 
    Node.set(nodes) 

    console.log('SNA complete') 
} 


cy.ready(function(event) { 
    console.log('cy.ready()') 
    calculateSNA() 
}) 

ответ

0

Запустить алгоритм один раз, а не запускать его N раз. Тогда просто запросить результат:

let ccn = cy.elements().closenessCentralityNormalized({ /* my options */ }); 

cy.nodes().forEach(n => { 
    n.data({ 
    ccn: ccn.closeness(n) 
    }); 
}); 

Используйте нормированные варианты алгоритмов центральности, если у вас есть хороший повод, чтобы сделать иначе. Только нормализованные версии действительно означают что угодно, если сравнить результаты на одном графике с результатами другого графика.

+0

Как рассчитать нормализованную независимую центральность Пожалуйста, направляйте let ccn = cy.elements(). Dcn ({'options.directed': true}); $ scope.ndd = cy.nodes() Foreach. (П => { n.data ({ CCN: ccn.degree (п) });} ) –