/* made by JEong Hyang Min (blindfish)
* 2008. 07. 08*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
int main()
{
int i,j,k;
int node=0;
int link=0;
int num1=0;
int totsum=0;
int *sum;
int *prob;
int **network;
printf("input number of node===>");
scanf("%d", &node);
printf("\n");
printf("input number of link===>");
scanf("%d", &link);
printf("\n");
network = (int **)malloc(sizeof(int*) * node);
sum = (int *)malloc(sizeof(int) * node);
prob = (int *)malloc(sizeof(int) * node);
srand(times(NULL));
// 처음 행렬을 0을 채우고 노드갯수만큼의 행렬을 생성한다.
for(i=0; i<node; i++)
network[i] = (int *)malloc(sizeof(int) * node);
for(i=0; i<node; i++)
for(j=0; j<node; j++)
network[i][j]=0;
//seed값을 주고 여기서 자라게 한다.
network[0][0]=0;
network[1][0]=1;
network[0][1]=1;
network[2][1]=1;
network[1][2]=1;
//처음에 합산과 확률분포 행렬을 초기화한다.
for(i=0; i<node; i++)
{
sum[i]=0;
prob[i]=0;
}
for(i=3; i<node; i++) //노드를 하나씩 추가한다.
{
totsum=0;
for(j=0; j<i; j++)
{
for(k=0; k<j; k++)
{
sum[j] += network[j][k]; //노드의 링크수를 센다.
totsum += network[j][k]; //총 링크수를 계산한다.
}
}
for(j=0; j<i; j++)
{
for(k=0; k<=j; k++)
prob[j] += sum[k]; //확률 분포를 만든다..
printf("%d ", prob[j]);
}
printf("\n");
num1=rand(); //몬테 카를로를 쓸 수를 만든다.
num1=num1%totsum; //확률분포안에 정규화 시킨다.
for(j=0; j<i; j++)
{
if(num1<=prob[0])
{
network[i][0]=1; //해당되는 확률함수를 찻고 링크와 노드를 추가시킨다.
network[0][i]=1;
}
else if(prob[j]<num1 && num1<=prob[j+1])
{
network[i][j]=1;
network[j][i]=1;
}
else
{
network[i][j]=0;
network[j][i]=0;
}
}
for(j=0; j<=i; j++)
{
sum[j]=0; //값을 다시 초기화한다.
prob[j]=0;
}
}
for(i=0; i<node; i++)
{
for(j=0; j<node; j++)
printf("%d", network[i][j]);
printf("\n");
}
free(network);
free(sum); //동적할당에선 꼭 메모리를 free시킨다.
free(prob); // 안그러면 메모리 문제로 재부팅 해야할수도 있다.
return 0;
}
척도없는 네크워크 = 정보가 다루는 계나 네트워크의 총체적 정보가 필요함..
포텐셜 문제의 real field, pow-law
매력도==> charge
random network
전체 네트워크에서의 총체적인 정보가 없어도 된다..
== mean field thoery 와 같다..