Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C/C++で実装するBarabási-Albertグラフ(スケールフリーモデル向け)とは?

バラバーシ・アルバート(BA)モデルとは

バラバーシ・アルバート(BA)モデルは、スケールフリーネットワークを生成するために提案された複数のモデルの一つとして扱われています。このモデルは、「成長(growth)」と「選択的接着(preferential attachment)」という2つの重要な概念を組み合わせたものです。どちらの概念も、現実のネットワークに広く見られる性質です。

成長(Growth)

「成長」とは、ネットワーク内のノード数が時間の経過とともに増加していくことを意味します。

選択的接着(Preferential Attachment)

「選択的接着」とは、すでに多くの接続を持つノードほど、新しいリンクを受け取る確率が高くなるという仕組みです。次数の高いノードほど、ネットワークに追加されるリンクをつかみ取る能力が強いといえます。

選択的接着は、人と人とをつなぐソーシャルネットワークをイメージすると直感的に理解しやすくなります。ここで、XからYへのリンクは「人物Xが人物Yを知っている(面識がある)」ことを表します。リンクを多く持つノードは、人脈の広い著名人に相当します。新たにコミュニティへ参加してきた人は、無名の人よりも、そうした存在感のある人物と知り合いになる可能性のほうが高いでしょう。

BAモデルは、World Wide Web(WWW)においても同様の現象を前提として提案されました。つまり、新しいページは、ほとんど誰も知らないページではなく、YahooやGoogleといった非常に有名なサイト(ハブ)へ優先的にリンクを張るという仮定です。もし誰かが既存のリンクをランダムに選んでリンク先を決めるとすれば、特定のページが選ばれる確率は、そのページの次数(被リンク数)に比例します。

BAモデルのグラフ例(50ノード)

次の画像は、選択的接着モデルに従って生成された、50ノードからなるBAモデルのグラフを示しています。

C/C++で実装するBarabási-Albertグラフ(スケールフリーモデル向け)とは?

上記のグラフは、「富める者はさらに富み、貧しき者はさらに貧しくなる」といういわゆる「マタイ効果(rich-get-richer)」の論理を見事に体現しています。

  1. マッチ棒で作る三角ピラミッドに必要な本数を計算するC/C++プログラム

    この記事では、下図のようなピラミッド状の三角形を作るために必要なマッチ棒の本数を求める方法を解説します。ピラミッドの底辺のサイズが与えられたとき、そのサイズに応じて必要なマッチ棒の総本数を計算します。例えば、底辺のサイズが1の場合は3本、底辺が2の場合は9本、底辺が3の場合は18本のマッチ棒が必要になります。必要なマッチ棒の本数を求める公式この問題を解くには、以下の公式を使用します。必要なマッチ棒の本数 = 3 × x × (x + 1) ÷ 2ここで、x はピラミッドの底辺のサイズです。この公式を使えば、ループで一つずつ数え上げることなく、O(1)の計算量で即座に答えを求められます。C++で

  2. C++で非連結グラフに対するBFS(幅優先探索)を実装する方法

    非連結グラフとは非連結グラフ(disconnected graph)とは、グラフ内の1つ以上の頂点が他の頂点と辺でつながっておらず、どこかの頂点から出発しても到達できない頂点が存在するグラフのことです。このようなグラフは、複数の「連結成分(connected component)」に分かれている状態と捉えることができます。通常のBFSでは不十分な理由単純な幅優先探索(BFS: Breadth First Search)が正しく機能するのは、グラフが連結している場合、すなわちグラフ内のすべての頂点がある1つの頂点から到達できる場合だけです。非連結グラフでは、開始頂点から到達できない頂点が必ず存在