用python画出小世界网络,主要用到了4个库,turtle,numpy,math, random。
import turtle
from math import *
import random
import numpy as np
#turtle.left(90)
#turtle.pendown()
#turtle.circle(200, 90)
#turtle.pendown()
#turtle.circle(20)
#turtle.circle(200, 90)
#def make_graph(n):
def Goto(start, end):
turtle.pendown()
turtle.goto(end[0], end[1])
turtle.goto(start[0], start[1])
def make_graph(n, p):
Rad = 100
rad = 5
turtle.penup()
turtle.forward(Rad)
turtle.left(90)
angel = 360 / n
for i in range(0, n):
turtle.pendown()
turtle.circle(-rad)
turtle.penup()
turtle.circle(Rad, angel)
#得到图的邻接矩阵
matrix =np.zeros([n,n], dtype = int)
for i in range(0, n):
matrix[i][ (i+1+n)% n ] = 1
matrix[ (i+1+n)% n ][i] = 1
matrix[i][(i+2+n)%n] = 1
matrix[(i+2+n)%n][i] = 1
matrix[i][(i-1+n)%n] = 1
matrix[(i-1+n)%n][i] = 1
matrix[i][(i-1 + n)%n] = 1
matrix[(-1 + n)%n][i] = 1
#print(matrix[1][1])
for i in range(0, n):
for j in range(-2, 3):
new_index = (i+j + n) % n
if matrix[i][new_index] == 1:
temp_p = random.random()
if temp_p < p:
matrix[i][new_index] = 0
matrix[i][new_index] = 0
while 1:
t = random.randint(0, n-1)
if matrix[i][t] != 1 and t != new_index:
matrix[i][t] = 1
matrix[t][i] = 1
break
#得到各个点的距离
position = []
pi = acos(-1)
for i in range(0, n):
temp_list = []
temp_list.append( Rad * cos( i * angel * pi / 180 ) )
temp_list.append( Rad * sin( i * angel * pi / 180 ) )
position.append(temp_list)
#print (len(position[1]))
#连线
for i in range(0, n):
for j in range(0, n):
if matrix[i][j] == 1:
Goto(position[i], position[j])
turtle.penup()
turtle.circle(Rad, angel)
turtle.done()
def main():
n = 10
random.seed(10)
# turtle.screensize(800, 600, 'green')
turtle.setup(width=400, height=300, startx=0, starty=0)
turtle.speed('fastest')
make_graph(n, 0.15)
main()
画出图: