美文网首页
适应局域信息的扩散过程

适应局域信息的扩散过程

作者: 牛嘧啶 | 来源:发表于2018-08-08 13:44 被阅读10次

    WS小世界网络

    相关代码

    program activity_diffusion
      implicit none
      integer, parameter :: n=10000,e=2,space=100,time=30000
      integer :: i,j,k,head,tail,tt,cc,o
      integer :: adj(n*space)=0,degree(n)=0
      real :: r,t,p
      real :: k1,k2,k3,k4,kk
      real :: activity(n)=0,D(n)=0,suma(n)=0
      real :: temp(n)=0,avactivity(n)=0
      
      open(10,file='activity.txt',status='old')
    
    do o=1,20
    !****************************************************************
      forall(i=1:n*space)adj(i)=0
      forall(i=1:n)degree(i)=0
    !####################generate a WS network#######################
      do i=1,n
        if(i<n)then
          adj(space*(i-1)+1)=i+1
          adj(space*(i+1-1)+3)=i
        else
          adj(space*(i-1)+1)=1
          adj(space*(1-1)+3)=i
        end if
        
        if(i<n-1)then
          adj(space*(i-1)+2)=i+2
          adj(space*(i+2-1)+4)=i
        else
          adj(space*(i-1)+2)=i+2-n
          adj(space*(i+2-n-1)+4)=i
        end if
      end do
      do i=1,n
        degree(i)=4
      end do
      
      p=0.2
      call random_seed
      do i=1,n
        if(degree(i)==1)then
          goto 102
        end if
        do j=1,2
          call random_number(r)
          if(r<p)then
            adj(space*(i-1)+j)=0
    101     call random_number(r)
            head=r*n+1
            if(i+j<=n)then
              do k=1,degree(i+j)
                if(adj(space*(i+j-1)+k)==head)then
                  goto 101
                end if
              end do
              adj(space*(i+j-1)+degree(i+j)+1)=head
              adj(space*(head-1)+degree(head)+1)=i+j
              degree(head)=degree(head)+1
            else
              do k=1,degree(i+j-n)
                if(adj(space*(i+j-n-1)+k)==head)then
                  goto 101
                end if
              end do
              adj(space*(i+j-n-1)+degree(i+j-n)+1)=head
              adj(space*(head-1)+degree(head)+1)=i+j-n
              degree(head)=degree(head)+1   
            end if
          end if
        end do
    102 continue
      end do
    
      do i=1,n
        do j=1,2
          if(adj(space*(i-1)+1)==0)then
            do k=1,degree(i)
              adj(space*(i-1)+k)=adj(space*(i-1)+k+1)
            end do
            degree(i)=degree(i)-1
          end if
        end do
      end do
    
      
    !####################the network is generated####################
    !##########################diffusion#############################
    
      do i=1,n
        call random_number(r)
        activity(i)=r
      end do
    
      t=0.01
      
      do tt=1,time
        do i=1,n
          cc=0
          suma(i)=0
          D(i)=0
          do k=1,degree(i)
            suma(i)=suma(i)+(activity(adj(space*(i-1)+k))-activity(i))
            if(activity(adj(space*(i-1)+k))-activity(i)>0)then
              cc=cc+1
            end if
              end do
          D(i)=cc/degree(i)
          k1=t*(D(i)*suma(i))
          
          suma(i)=0
          do k=1,degree(i)
            suma(i)=suma(i)+(activity(adj(space*(i-1)+k))-(activity(i)+k1/2))
          end do
          k2=t*(D(i)*suma(i))
          
          suma(i)=0
          do k=1,degree(i)
            suma(i)=suma(i)+(activity(adj(space*(i-1)+k))-(activity(i)+k2/2))
          end do
          k3=t*(D(i)*suma(i))
          
          suma(i)=0
          do k=1,degree(i)
            suma(i)=suma(i)+(activity(adj(space*(i-1)+k))-(activity(i)+k3))
          end do
          k4=t*(D(i)*suma(i))
          
          kk=((k1+k4)/2+k2+k3)/3
          
          activity(i)=activity(i)+kk 
        end do
      end do
    !****************************************************************
      do i=1,n
        temp(i)=temp(i)+activity(i)
      end do
      write(*,*)o
    end do
    
      do i=1,n
        avactivity(i)=temp(i)/20
      end do
    !###########################[output]#############################
      do i=1,n
        write(10,20) degree(i),avactivity(i)
        write(*,*) degree(i),avactivity(i)
      end do
      
    20 format(1x,I5,2x,f15.5)  
      close(10)
      
      stop
    end program
    
    
    

    BA无标度网络

    代码

    program activity_diffusion
      implicit none
      integer, parameter :: n=100,space=100,time=30000
      integer :: i,j,k,head,tail1,tail2,tt,cc,o
      integer :: adj(n*space)=0
      real :: r,t,ktotal
      real :: k1,k2,k3,k4,kk
      real :: CDF(0:n)=0,degree(n)=0
      real :: activity(n)=0,D(n)=0,suma(n)=0
      real :: temp(n)=0,avactivity(n)=0
      
      open(10,file='activity.txt',status='old')
    !####################generate a BA network#######################
      adj(space*(1-1)+1)=2
      adj(space*(1-1)+2)=3
      adj(space*(2-1)+1)=1
      adj(space*(2-1)+2)=3
      adj(space*(3-1)+1)=1
      adj(space*(3-1)+2)=2
      do i=1,3
        degree(i)=2
        CDF(i)=CDF(i-1)+1/3
      end do
      
      call random_seed
      do head=4,n
        call random_number(r)
        do i=1,head-1
          if(r<=CDF(i))then
            tail1=i
            goto 101
          end if
        end do
    101 continue
        adj(space*(head-1)+1)=tail1
        degree(tail1)=degree(tail1)+1
    102 call random_number(r)
        do i=1,head-1
          if(r<=CDF(i))then
            tail2=i
            if(tail2==tail1)then
              goto 102
            end if
            goto 103
          end if
        end do
    103 continue
        adj(space*(head-1)+2)=tail2
        degree(tail2)=degree(tail2)+1
        degree(head)=2
        do k=1,space
          if(adj(space*(tail1-1)+k)==0)then
            adj(space*(tail1-1)+k)=head
            goto 104
          end if
        end do
    104 continue
        do k=1,space
          if(adj(space*(tail2-1)+k)==0)then
            adj(space*(tail2-1)+k)=head
            goto 105
          end if
        end do
    105 continue
        ktotal=0
        do i=1,head
          ktotal=ktotal+degree(i)
        end do
        
        do i=1,head
          CDF(i)=CDF(i-1)+degree(i)/ktotal
        end do
      end do
    
    !####################the network is generated####################
    !##########################diffusion#############################
    do o=1,20
    !****************************************************************
      do i=1,n
        call random_number(r)
        activity(i)=r
      end do
    
      t=0.01
      
      do tt=1,time
        do i=1,n
          cc=0
          suma(i)=0
          D(i)=0
          do k=1,space
            if(adj(space*(i-1)+k)/=0)then
              suma(i)=suma(i)+(activity(adj(space*(i-1)+k))-activity(i))
            end if
            if(activity(adj(space*(i-1)+k))-activity(i)>0)then
              cc=cc+1
            end if
              end do
          D(i)=cc/degree(i)
              k1=t*(D(i)*suma(i))
          
          suma(i)=0
          do k=1,space
            if(adj(space*(i-1)+k)/=0)then
              suma(i)=suma(i)+(activity(adj(space*(i-1)+k))-(activity(i)+k1/2))
            end if
          end do
          k2=t*(D(i)*suma(i))
          
          suma(i)=0
          do k=1,space
            if(adj(space*(i-1)+k)/=0)then
                  suma(i)=suma(i)+(activity(adj(space*(i-1)+k))-(activity(i)+k2/2))
            end if
          end do
          k3=t*(D(i)*suma(i))
          
          suma(i)=0
          do k=1,space
            if(adj(space*(i-1)+k)/=0)then
              suma(i)=suma(i)+(activity(adj(space*(i-1)+k))-(activity(i)+k3))
            end if
          end do
          k4=t*(D(i)*suma(i))
          
          kk=((k1+k4)/2+k2+k3)/3
          
          activity(i)=activity(i)+kk 
    !    write(*,*)o,tt,activity(i) 
        end do
      end do
    !****************************************************************
      do i=1,n
        temp(i)=temp(i)+activity(i)
      end do
      write(*,*)o
    end do
    
      do i=1,n
        avactivity(i)=temp(i)/20
      end do
    !###########################[output]#############################
      do i=1,n
        write(10,20) degree(i),avactivity(i)
        write(*,*) degree(i),avactivity(i)
      end do
      
    20 format(1x,f15.5,2x,f15.5)  
      close(10)
      
      stop
    end program
    
    
    

    相关文章

      网友评论

          本文标题:适应局域信息的扩散过程

          本文链接:https://www.haomeiwen.com/subject/hzotbftx.html