물리2008. 7. 8. 16:49

/* 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 와 같다..


Posted by blindfish