2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


В этом разделе нельзя создавать новые темы.

Если Вы хотите задать новый вопрос, то не дописывайте его в существующую тему, а создайте новую в корневом разделе "Помогите решить/разобраться (М)".

Если Вы зададите новый вопрос в существующей теме, то в случае нарушения оформления или других правил форума Ваше сообщение и все ответы на него могут быть удалены без предупреждения.

Не ищите на этом форуме халяву, правила запрещают участникам публиковать готовые решения стандартных учебных задач. Автор вопроса обязан привести свои попытки решения и указать конкретные затруднения.

Обязательно просмотрите тему Правила данного раздела, иначе Ваша тема может быть удалена или перемещена в Карантин, а Вы так и не узнаете, почему.



Начать новую тему Ответить на тему
 
 Центральность графа
Сообщение04.07.2010, 14:52 


04/07/10
19
Вот статься на википедии http://en.wikipedia.org/wiki/Centrality.
Мне, собственно, нужен алгоритм нахождения любой из 4х центральностей ( для неориентированного графа), например, по матрице смежности. Если у кого есть алгоритм, или информация на русском, буду премного благодарен.

 Профиль  
                  
 
 Re: Центральность графа
Сообщение05.07.2010, 00:22 
Заслуженный участник


26/07/09
1559
Алматы
По-моему, по приведенной вами ссылке информации достаточно --- там есть формулы, объяснения, и ссылки, в том числе и на описания алгоритмов. Кстати, вы сказали, что вам нужна любая центральность, вот и реализуйте поиск самой простой, degree centrality. :)

 Профиль  
                  
 
 Re: Центральность графа
Сообщение05.07.2010, 15:16 


04/07/10
19
Хм, если разобраться, то там и правда не сложный алгоритм. Спасибо.
А вот если считать betweenness centrality, есть ли какой-нибудь алгоритм нахождения числа кратчайших путей, проходящих через ? Как найти кратчайший путь я понимаю, но мне просто надо сделать из этого программу. И существует ли betweenness centrality для графа, или она только для каждой вершины?

 Профиль  
                  
 
 Re: Центральность графа
Сообщение05.07.2010, 21:36 


04/07/10
19
Я нашел алгоритм нахождения кратчайших расстояний между 2 вершинами. http://e-maxx.ru/algo/floyd_warshall_algorithm - если кому понадобится. А есть ли похожий алгоритм для нахождения кратчайших расстояний, проходящих через заданную вершину?

 Профиль  
                  
 
 Re: Центральность графа
Сообщение06.07.2010, 00:31 
Заслуженный участник


26/07/09
1559
Алматы
Посмотрите на последнем вами указанном ресурсе алгоритмы в разделе "кратчайшие пути из одной вершины", например этот, этот или этот, или даже вот этот. Хотя вам нужен именно тот, которой вы сами нашли (алгоритм Флойда-Уоршола). :) Ещё можно попробовать алгоритм Джонсона.

Но я ещё раз обращаю ваше внимание на ссылки из вики-статьи. Например для betweenness centrality смотрите U.Brandes, A faster algorithm for betweenness centrality.

Также взгляните на используемый самим гуглом eigenvector centrality (краткое описание там же, в вики).

 Профиль  
                  
 
 Re: Центральность графа
Сообщение06.07.2010, 09:25 


04/07/10
19
Мне все-таки надо найти betweenness centrality. Статью A faster algorithm for betweenness centrality я уже нашел и думаю над ней продолжительное время. Там написан алгоритм нахождения центральности (именно то, что мне нужно), но не все понятно.
Что есть функция d[] и для чего введена вершина t, если мы ее не используем? И в строке foreach neighbor w of v do под соседом подразумевается, что w и v соединены ребром?

 Профиль  
                  
 
 Re: Центральность графа
Сообщение07.07.2010, 01:10 
Заслуженный участник


26/07/09
1559
Алматы
Цитата:
Что есть функция d[]

Видимо, массив расстояний от текущей вершины $s$ до всех остальных. Я не вникал. :)

Цитата:
для чего введена вершина t

Это просто вспомогательная переменная. Там ведь написано что-то вроде $d[t]\gets -1,\ t\in V$, т.е. расстояния до всех вершин из $V$ полагаются равными минус единице.

Цитата:
под соседом подразумевается, что w и v соединены ребром?

Конечно.

-- Ср июл 07, 2010 04:19:41 --

А вообще, посмотрите готовые реализации, например в библиотеках boost graph library или igraph.

 Профиль  
                  
 
 Re: Центральность графа
Сообщение11.07.2010, 00:47 


04/07/10
19
Все-таки реализовал этот алгоритм на с++. Вот, если кому понадобится:
Код:
#include <fstream>
#include <iostream>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <boost\foreach.hpp>
#define foreach BOOST_FOREACH

using namespace std;

void Erase(queue<int> A)
{
   while(!A.empty())
      A.pop();
}
void Erase(stack<int> A)
{
   while(!A.empty())
      A.pop();
}
class BetweennessData
{
public:
   double d;
   double sigma;
   vector<int> p;
   double delta;

   BetweennessData()
   {
      d = -1;
      sigma = 0;
      delta = 0;
      p.clear();
   }
};
int main()
{
   int size = 4;
   double* Cb = new double[size];
   int **Adj;
   Adj = new int *[size];
   for(int i  = 0; i<size; i++)
   {
      Adj[i]=new int[size];
   }
   Adj[0][0]=0; Adj[0][1]=1;Adj[0][2]=0; Adj[0][3]=1;
   Adj[1][0]=1; Adj[1][2]=0;Adj[1][2]=1; Adj[1][3]=0;
   Adj[2][0]=0; Adj[2][1]=1;Adj[2][2]=0; Adj[2][3]=1;
   Adj[3][0]=1; Adj[3][2]=0;Adj[3][2]=1; Adj[3][3]=0;
   for (int i = 0; i<size; i++)
   {
      Cb[i]=0;
   }
   stack<int> S;
   map<int,vector<int>> P;
   queue<int> Q;
   map<int, BetweennessData> decorator;
   for( int s = 0; s<size; s++ )
   {
      decorator.clear();
      Erase(S);
      P.clear();
      Erase(Q);
      decorator[s].sigma = 1;
        decorator[s].d = 0;
      Q.push(s);

      while (!Q.empty())
      {
         int v = Q.front();
         Q.pop();
         S.push(v);

         for (int w = 0; w<size; w++)
         {
            if(Adj[v][w]>0)
            {
               // w found for the first time?

               if (decorator[w].d < 0)
               {
                  Q.push(w);
                  decorator[w].d = decorator[v].d + 1;
               }

               // Shortest path to w via v?

               if (decorator[w].d == decorator[v].d + 1)
               {
                  decorator[w].sigma += decorator[v].sigma;
                  decorator[w].p.push_back(v);
               }
            }
         }
      }
      while (!S.empty())
      {
         int w = S.top();
         S.pop();
         foreach(int v,decorator[w].p)
         {
            decorator[v].delta +=(decorator[v].sigma /decorator[w].sigma )* ( 1.0 + decorator[w].delta );
         }
         if (w != s)
         {
            Cb[w]+=decorator[w].delta;
         }
      }
   }
   for (int i = 0; i<size; i++)
   {
      Cb[i]/=2;
      cout << Cb[i] << endl;
   }
   system("pause");
   return 0;
}

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group