簡體   English   中英

為什么我的python代碼無限循環?

[英]Why is my python code looping infinitely?

你知道我沒有增加什么嗎? 我正在嘗試生成具有n個節點的加權圖?

我是我的增量。

因此,如果我調用genWeightGraph(10),我想添加10個節點,將節點k添加到兩個頂點(v1和v2)。 我開始時只有兩個互相連接的節點,因此它們的邊列表以[[1],[0]]開始,索引為list [index] =頂點。 我從一組N個節點中隨機生成k個,並將K個連接到2個隨機頂點。

之所以存在此加權列表,是因為像Internet一樣,您擁有的連接/邊緣越多,新節點連接到您的可能性就越大。 因此,當我從此加權列表中提取樣本時,加權列表僅能幫助我解釋這種概率偏差。

但這並沒有結束。 曾經 我不知道。

def genWeightGraph(n): #n nodes, davg number of links
    links = [[] for i in xrange(n-2)] # create n many nodes -2 to adjust for insert [1],[0]
    links.insert(0,[1])
    links.insert(1,[0]) # start with [[1],[0],...[]] of n length
    weighted = [nodes for v in links for nodes in v] #initialized weighted list of [1,0]
    i = 0 #initialized edges added
    while (i < n): #add this many nodes
        v1 = random.choice(weighted) #pick a friend/vertex from weighted list
        v2 = random.choice(weighted) #pick another friend/vertex from weighted list
        k = random.choice(xrange(2,n)) #pick a new friend to connect both v1 and v2 to
        print "v1", v1
        print "v2", v2 
        print "k", k
        print "nodes", i
        if k in links[v1] or links[v2]:
           continue
        elif v1 == v2: # if you pick the same vertex, just add k to one of them
            links[v1].append(k)
            links[k].append(v1)
            weighted += [k,v1] 
            i += 1
        else:
            links.insert(v1, k) # access v1's friend list, append k
            links.insert(k, v1) # find k's list, add v
            links.insert(v2, k) #add k to v2's list
            links.insert(k, v2) #find k's list, add v2 
            weighted += [k,v1,k,v2] #add to weighted
            i += 1

這就是問題:

if k in links[v1] or links[v2]:

它不是您使用or運算符的方式...應該是:

if (k in links[v1]) or (k in links[v2]):

在您的代碼中,鏈接[v2]初始化后,您始終會獲得真正的價值。

考慮以下示例

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> if 3 in a or b: print 'ok'
... 
ok
>>> if 13 in a or b: print 'bad'
... 
bad
>>> if 13 in a or 13 in b: print 'bad'
... 
>>> 

您有以下一行

if k in links[v1] or links[v2]:

它測試kin links[v1]還是links[v2]不為空。 更改為

if (k in links[v1]) or (k in links[v2]):

因此:

if k in links[v1] or links[v2]:
    continue

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM