超立方体上的简单随机行走

问题描述

我已经为n维超立方体上的惰性简单随机游走编写了代码。为了可视化它,可以想到一个2D正方形或3D立方体,其中正方形/立方体的角是图形的顶点。此图上的游走始于原点,概率为0.5停留在一个顶点上,并且保持相等的概率访问其邻居。代码正在运行,但是我有一个技术问题。我将稍作解释,但最后,随着时间的增加,固定分布(均匀分布)与通过仿真获得的分布之间的距离必须减小为0。在我的模拟中,对于较大的n(例如n = 10),上述分布之间的距离逐渐缩小为非零值。如果有人可以指出我出了问题的地方,那将是很棒的事情!!

  1. 函数生成n-dim超立方体的所有顶点,输出是位串列表的列表,即,超立方体的每个顶点都是n位串,并且有2 ^ n个这样的顶点。

     def generateallBinaryStrings(n,arr,l,i):  
    
         if i == n: 
             l.append(arr[:]) 
             return
    
         arr[i] = 0
         generateallBinaryStrings(n,i + 1)  
    
         arr[i] = 1
         generateallBinaryStrings(n,i + 1)  
    
         return l
    
  2. 创建一个字典,其键是顶点,值是邻居(每个顶点有n个邻居)

     def dictionary(v):
         d={}
         for i in range(len(v)):
             d[str(v[i])]=[]
             temp=[]
             for j in range(n):
                 temp=v[i][:]
                 if v[i][j]==1:
                     temp[j]=0
                 else:
                     temp[j]=1
                 d[str(v[i])].append(temp)
         return d
    
  3. 在n-dim多维数据集上从原点开始的简单随机游动(输出是在时间t中访问的顶点的列表)

     def srw(d,n,t):
         h=[[0 for i in range(n)]]
         w=[1/(2*n) for i in range(n)]
         w.append(0.5)
         for i in range(t):
             temp=d[str(h[-1])][:]
             temp.append(h[-1])
             h.append(random.choices(temp,weights=w)[-1])
    
         return h
    
  4. 找到静态分布和模拟分布之间的L1距离

     def tvdist(d,t,num):
         finalstate=[]
         for i in range(num):
             temp=srw(d,t)
             finalstate.append(temp[-1])
         temp2=[list(item) for item in set(tuple(row) for row in finalstate)]
         Xt={}
         for state in temp2:
             Xt[str(state)]=None
         for state in temp2:
             count=0
             for i in finalstate:
                 if i==state:
                     count+=1
             Xt[str(state)]=count/num
    
    
         dist=0
         for state in d:
             if state in Xt:
                 dist+=abs(Xt[str(state)]-(1/(2**n)))
             else:
                 dist+=1/(2**n)
         dist=0.5*(dist)
    
         return dist
    
  5. 如果您复制代码,请在上面粘贴代码,然后运行以下代码(将距离与时间作图,n = 5,10)

     import numpy as np
     import matplotlib.pyplot as plt
     import random
     import collections as cs
    
     time=30
     numsim=5000
    
     for n in range(5,11,5):
    
         l = []  
         arr = [None] * n 
         vertices=generateallBinaryStrings(n,0)
         d=dictionary(vertices)
         tvdistance=[]
         for t in range(1,time):
             tvdistance.append(tvdist(d,numsim))
         plt.plot(tvdistance)
    
     plt.show()
    
  6. 我得到这个图:(n = 5看起来正确,但n = 10逐渐减小为非零值)

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)