0

グラフ上のすべてのノードについて、次数、近さ、中間中心性を計算する必要があります。cy.ready()現在、イベント後に各ノードで Cytoscape.js に組み込まれている関数を使用しています。ただし、グラフが非常に大きいため (250 以上のノード、650 以上の接続)、計算に時間がかかりすぎます。誰でもより効率的な方法を提案できますか?

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()
})
4

1 に答える 1

0

アルゴリズムを N 回実行するのではなく、1 回実行します。次に、結果をクエリします。

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

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

正当な理由がない限り、中心性アルゴリズムの正規化されたバージョンを使用してください。たとえば、あるグラフの結果を別のグラフの結果と比較する場合、正規化されたバージョンのみが実際に意味を持ちます。

于 2016-12-15T20:44:10.537 に答える