자기 회피 랜덤 워크로 한 필기 쓰고 즐거웠다 ~ 계산 물리학 I (아사쿠라 서점)를 참고로 파이썬을 사용해 ~
전치
단백질의 구조의 시뮬레이션 등에 이용되는 자기 회피 랜덤 워크의 프로그램을 python으로 제작했으므로 소개하겠습니다. 근본적인 재작업을 할 수 있을 것 같은 생각은 합니다만, 즐거웠습니다.
랜덤 워크란?
랜덤 워크는 다음으로 이동하는 점이 무작위로 선택되는 운동으로 랜덤 워크를 기반으로 한 모델이 다양한 연구에 사용되고 있습니다. 예를 들면 아인슈타인이 연구한 것으로 유명한 브라운 운동은 수면에 떠 있는 꽃가루 중의 미립자의 불규칙한 움직임입니다만, 이것도 랜덤 워크를 사용한 모델로 시뮬레이션할 수 있는 운동의 하나입니다.
이번 주제인 자기 회피 랜덤 워크는, 자신이 다니는 경로를 다시 통과하지 않는 랜덤 워크입니다. 예를 들어 2차원 직사각형 격자의 격자점을 랜덤하게 한 필기로 이동하는 운동을 기술합니다. 실제의 응용으로서는, 자기 회피 랜덤 워크는 단백질의 구조를 시뮬레이션하기 위해서 이용되는 일이 있다고 합니다.
자기 회피 랜덤 워크 프로그램을 만들어 보았습니다.
자기 회피 랜덤 워크의 프로그램은, 상기의 성질로부터, ①한 번 통과한 경로를 피할 필요가 있다, ②현재 위치로부터 다음으로 이동할 수 있는 점이 없다(자신의 경로에 의해 둘러싸인다)와 랜덤 워크의 시뮬레이션 끝나야합니다. 또한 ③설정한 영역의 경계에 도달해도 시뮬레이션이 끝나도록 했습니다.
2차원 직사각형 격자상에서의 자기 회피 랜덤 워크의 프로그램은 다음과 같이 되었습니다. 자기 회피 랜덤 워크의 결과를 돌려주는 self_avoidance_random_walk 함수 중, 현재 점 주위의 점이 통과되었는지를 판정하는 surrounding_points_checker와, 다음의 이동점의 후보가 이미 통과되어 있지 않은지를 판별해 문제 없으면 이동 결정하는 next_point_decisioner가 작동하는 구조입니다. (이번에는 이동점을 리스트에 수시로 저장하고 있기 때문에 조금 돌아다니고 있다고 생각합니다. )
self_avoidance_random_walk
import numpy as np
import random
random.seed(None)
'''
二次元格子の最大値xmax,ymaxを与えることで
自己回避型ランダムウォークの結果を返す関数
'''
def self_avoidance_random_walk(xmax,ymax):
#初期状態の作製。
list_x = np.array([0])
list_y = np.array([0])
#random_walkのループ
roop_num = 0
while True:
#現在地の周囲の状況を確認し、通過済みの点(duplicate_num)を数える
duplicate_num = surrounding_points_checker(roop_num,list_x,list_y)
#移動できる点がなければループを抜ける
if duplicate_num >= 4:
break
#次の移動地点の候補(x_dum, y_dum)を作製
else:
D1 = random.randint(0,1)
D2 = random.randint(0,1)
dx_dum = (-1)**D1*D2
dy_dum = (-1)**D1*(1-D2)
x_dum = list_x[roop_num] + dx_dum
y_dum = list_y[roop_num] + dy_dum
#境界に達したらループを抜ける
if (abs(x_dum)==xmax or abs(y_dum)==ymax):
list_x = np.append(list_x,x_dum)
list_y = np.append(list_y,y_dum)
break
#新しい点を加える
roop_num,list_x,list_y = next_point_decisioner(roop_num,list_x,list_y,list_mono,x_dum,y_dum)
return list_x, list_y
def surrounding_points_checker(i,list_x,list_y):
#現在位置をx_cur,y_curに格納
x_cur = list_x[i]
y_cur = list_y[i]
#現在位置の周囲の位置をx_plus,y_plus,x_minus,y_minusとして表示
x_plus = x_cur+1
x_minus = x_cur-1
y_plus = y_cur+1
y_minus = y_cur-1
#周囲の既に通過した位置を記録し返す
duplicate_num = 0
for j in range(len(list_x)):
if (x_plus == list_x[j] and y_cur == list_y[j]) or (x_minus == list_x[j] and y_cur == list_y[j]):
duplicate_num +=1
elif (x_cur == list_x[j] and y_plus == list_y[j]) or (x_cur == list_x[j] and y_minus == list_y[j]):
duplicate_num +=1
else:
duplicate_num +=0
return duplicate_num
def next_point_decisioner(i,list_x,list_y,list_mono,x_dum,y_dum):
#移動地点の候補(x_dum, y_dum)が既に通過済みの地点でないか判別
k = 0
for j in range(len(list_x)):
if (x_dum == list_x[j] and y_dum == list_y[j]):
k +=1
else:
k +=0
#未通過の場合はリストに加え、通過済みの場合は候補を却下する
if k == 0:
list_x = np.append(list_x,x_dum)
list_y = np.append(list_y,y_dum)
i+=1
return i,list_x,list_y
if k == 1:
return i,list_x,list_y
자기 회피 랜덤 워크 프로그램의 실행 예
자기 회피 랜덤 워크의 프로그램은 예를 들면 다음과 같이 실행합니다. 여기서는 2차원 직사각형 격자의 $x$축을 $-11\le x\le 11$, $y$축을 $-11\le y\le 11$로 합니다.
import matplotlib.pyplot as plt
x_max = 11
y_max = 11
list_x, list_y = self_avoidance_random_walk(x_max, y_max)
plt.figure(figsize=(6, 6))
plt.plot(list_x, list_y)
plt.grid(True)
plt.xlim(-x_max-1,x_max+1)
plt.ylim(-y_max-1,y_max+1)
plt.show()
그러면 다음과 같은 그래프를 얻을 수 있습니다. 중심지점에서 시작하여 말단에 오거나 자신에게 둘러싸일 때 시뮬레이션이 끝난 것을 알 수 있습니다. 또한 실행할 때마다 결과가 무작위로 바뀝니다.
요약
이번에는 자기 회피 랜덤 워크의 프로그램을 제작했습니다. 이를 응용하여 격자점 위치에 있는 것의 종류를 지정하고 구조의 에너지 안정성 등을 시뮬레이션할 수도 있습니다. 또, 보다 효율적인 프로그램의 방법이 있을 것 같기 때문에 향후의 과제로 하고 싶습니다.
[참고 서적·웹]
R.H.Landau et al. (2018) 「실천 Python 라이브러리 계산 물리학 I - 수치 계산의 기초
Reference
이 문제에 관하여(자기 회피 랜덤 워크로 한 필기 쓰고 즐거웠다 ~ 계산 물리학 I (아사쿠라 서점)를 참고로 파이썬을 사용해 ~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/guraragu0010/items/1b31c13e1852bf99c973
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
랜덤 워크는 다음으로 이동하는 점이 무작위로 선택되는 운동으로 랜덤 워크를 기반으로 한 모델이 다양한 연구에 사용되고 있습니다. 예를 들면 아인슈타인이 연구한 것으로 유명한 브라운 운동은 수면에 떠 있는 꽃가루 중의 미립자의 불규칙한 움직임입니다만, 이것도 랜덤 워크를 사용한 모델로 시뮬레이션할 수 있는 운동의 하나입니다.
이번 주제인 자기 회피 랜덤 워크는, 자신이 다니는 경로를 다시 통과하지 않는 랜덤 워크입니다. 예를 들어 2차원 직사각형 격자의 격자점을 랜덤하게 한 필기로 이동하는 운동을 기술합니다. 실제의 응용으로서는, 자기 회피 랜덤 워크는 단백질의 구조를 시뮬레이션하기 위해서 이용되는 일이 있다고 합니다.
자기 회피 랜덤 워크 프로그램을 만들어 보았습니다.
자기 회피 랜덤 워크의 프로그램은, 상기의 성질로부터, ①한 번 통과한 경로를 피할 필요가 있다, ②현재 위치로부터 다음으로 이동할 수 있는 점이 없다(자신의 경로에 의해 둘러싸인다)와 랜덤 워크의 시뮬레이션 끝나야합니다. 또한 ③설정한 영역의 경계에 도달해도 시뮬레이션이 끝나도록 했습니다.
2차원 직사각형 격자상에서의 자기 회피 랜덤 워크의 프로그램은 다음과 같이 되었습니다. 자기 회피 랜덤 워크의 결과를 돌려주는 self_avoidance_random_walk 함수 중, 현재 점 주위의 점이 통과되었는지를 판정하는 surrounding_points_checker와, 다음의 이동점의 후보가 이미 통과되어 있지 않은지를 판별해 문제 없으면 이동 결정하는 next_point_decisioner가 작동하는 구조입니다. (이번에는 이동점을 리스트에 수시로 저장하고 있기 때문에 조금 돌아다니고 있다고 생각합니다. )
self_avoidance_random_walk
import numpy as np
import random
random.seed(None)
'''
二次元格子の最大値xmax,ymaxを与えることで
自己回避型ランダムウォークの結果を返す関数
'''
def self_avoidance_random_walk(xmax,ymax):
#初期状態の作製。
list_x = np.array([0])
list_y = np.array([0])
#random_walkのループ
roop_num = 0
while True:
#現在地の周囲の状況を確認し、通過済みの点(duplicate_num)を数える
duplicate_num = surrounding_points_checker(roop_num,list_x,list_y)
#移動できる点がなければループを抜ける
if duplicate_num >= 4:
break
#次の移動地点の候補(x_dum, y_dum)を作製
else:
D1 = random.randint(0,1)
D2 = random.randint(0,1)
dx_dum = (-1)**D1*D2
dy_dum = (-1)**D1*(1-D2)
x_dum = list_x[roop_num] + dx_dum
y_dum = list_y[roop_num] + dy_dum
#境界に達したらループを抜ける
if (abs(x_dum)==xmax or abs(y_dum)==ymax):
list_x = np.append(list_x,x_dum)
list_y = np.append(list_y,y_dum)
break
#新しい点を加える
roop_num,list_x,list_y = next_point_decisioner(roop_num,list_x,list_y,list_mono,x_dum,y_dum)
return list_x, list_y
def surrounding_points_checker(i,list_x,list_y):
#現在位置をx_cur,y_curに格納
x_cur = list_x[i]
y_cur = list_y[i]
#現在位置の周囲の位置をx_plus,y_plus,x_minus,y_minusとして表示
x_plus = x_cur+1
x_minus = x_cur-1
y_plus = y_cur+1
y_minus = y_cur-1
#周囲の既に通過した位置を記録し返す
duplicate_num = 0
for j in range(len(list_x)):
if (x_plus == list_x[j] and y_cur == list_y[j]) or (x_minus == list_x[j] and y_cur == list_y[j]):
duplicate_num +=1
elif (x_cur == list_x[j] and y_plus == list_y[j]) or (x_cur == list_x[j] and y_minus == list_y[j]):
duplicate_num +=1
else:
duplicate_num +=0
return duplicate_num
def next_point_decisioner(i,list_x,list_y,list_mono,x_dum,y_dum):
#移動地点の候補(x_dum, y_dum)が既に通過済みの地点でないか判別
k = 0
for j in range(len(list_x)):
if (x_dum == list_x[j] and y_dum == list_y[j]):
k +=1
else:
k +=0
#未通過の場合はリストに加え、通過済みの場合は候補を却下する
if k == 0:
list_x = np.append(list_x,x_dum)
list_y = np.append(list_y,y_dum)
i+=1
return i,list_x,list_y
if k == 1:
return i,list_x,list_y
자기 회피 랜덤 워크 프로그램의 실행 예
자기 회피 랜덤 워크의 프로그램은 예를 들면 다음과 같이 실행합니다. 여기서는 2차원 직사각형 격자의 $x$축을 $-11\le x\le 11$, $y$축을 $-11\le y\le 11$로 합니다.
import matplotlib.pyplot as plt
x_max = 11
y_max = 11
list_x, list_y = self_avoidance_random_walk(x_max, y_max)
plt.figure(figsize=(6, 6))
plt.plot(list_x, list_y)
plt.grid(True)
plt.xlim(-x_max-1,x_max+1)
plt.ylim(-y_max-1,y_max+1)
plt.show()
그러면 다음과 같은 그래프를 얻을 수 있습니다. 중심지점에서 시작하여 말단에 오거나 자신에게 둘러싸일 때 시뮬레이션이 끝난 것을 알 수 있습니다. 또한 실행할 때마다 결과가 무작위로 바뀝니다.
요약
이번에는 자기 회피 랜덤 워크의 프로그램을 제작했습니다. 이를 응용하여 격자점 위치에 있는 것의 종류를 지정하고 구조의 에너지 안정성 등을 시뮬레이션할 수도 있습니다. 또, 보다 효율적인 프로그램의 방법이 있을 것 같기 때문에 향후의 과제로 하고 싶습니다.
[참고 서적·웹]
R.H.Landau et al. (2018) 「실천 Python 라이브러리 계산 물리학 I - 수치 계산의 기초
Reference
이 문제에 관하여(자기 회피 랜덤 워크로 한 필기 쓰고 즐거웠다 ~ 계산 물리학 I (아사쿠라 서점)를 참고로 파이썬을 사용해 ~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/guraragu0010/items/1b31c13e1852bf99c973
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
import numpy as np
import random
random.seed(None)
'''
二次元格子の最大値xmax,ymaxを与えることで
自己回避型ランダムウォークの結果を返す関数
'''
def self_avoidance_random_walk(xmax,ymax):
#初期状態の作製。
list_x = np.array([0])
list_y = np.array([0])
#random_walkのループ
roop_num = 0
while True:
#現在地の周囲の状況を確認し、通過済みの点(duplicate_num)を数える
duplicate_num = surrounding_points_checker(roop_num,list_x,list_y)
#移動できる点がなければループを抜ける
if duplicate_num >= 4:
break
#次の移動地点の候補(x_dum, y_dum)を作製
else:
D1 = random.randint(0,1)
D2 = random.randint(0,1)
dx_dum = (-1)**D1*D2
dy_dum = (-1)**D1*(1-D2)
x_dum = list_x[roop_num] + dx_dum
y_dum = list_y[roop_num] + dy_dum
#境界に達したらループを抜ける
if (abs(x_dum)==xmax or abs(y_dum)==ymax):
list_x = np.append(list_x,x_dum)
list_y = np.append(list_y,y_dum)
break
#新しい点を加える
roop_num,list_x,list_y = next_point_decisioner(roop_num,list_x,list_y,list_mono,x_dum,y_dum)
return list_x, list_y
def surrounding_points_checker(i,list_x,list_y):
#現在位置をx_cur,y_curに格納
x_cur = list_x[i]
y_cur = list_y[i]
#現在位置の周囲の位置をx_plus,y_plus,x_minus,y_minusとして表示
x_plus = x_cur+1
x_minus = x_cur-1
y_plus = y_cur+1
y_minus = y_cur-1
#周囲の既に通過した位置を記録し返す
duplicate_num = 0
for j in range(len(list_x)):
if (x_plus == list_x[j] and y_cur == list_y[j]) or (x_minus == list_x[j] and y_cur == list_y[j]):
duplicate_num +=1
elif (x_cur == list_x[j] and y_plus == list_y[j]) or (x_cur == list_x[j] and y_minus == list_y[j]):
duplicate_num +=1
else:
duplicate_num +=0
return duplicate_num
def next_point_decisioner(i,list_x,list_y,list_mono,x_dum,y_dum):
#移動地点の候補(x_dum, y_dum)が既に通過済みの地点でないか判別
k = 0
for j in range(len(list_x)):
if (x_dum == list_x[j] and y_dum == list_y[j]):
k +=1
else:
k +=0
#未通過の場合はリストに加え、通過済みの場合は候補を却下する
if k == 0:
list_x = np.append(list_x,x_dum)
list_y = np.append(list_y,y_dum)
i+=1
return i,list_x,list_y
if k == 1:
return i,list_x,list_y
자기 회피 랜덤 워크의 프로그램은 예를 들면 다음과 같이 실행합니다. 여기서는 2차원 직사각형 격자의 $x$축을 $-11\le x\le 11$, $y$축을 $-11\le y\le 11$로 합니다.
import matplotlib.pyplot as plt
x_max = 11
y_max = 11
list_x, list_y = self_avoidance_random_walk(x_max, y_max)
plt.figure(figsize=(6, 6))
plt.plot(list_x, list_y)
plt.grid(True)
plt.xlim(-x_max-1,x_max+1)
plt.ylim(-y_max-1,y_max+1)
plt.show()
그러면 다음과 같은 그래프를 얻을 수 있습니다. 중심지점에서 시작하여 말단에 오거나 자신에게 둘러싸일 때 시뮬레이션이 끝난 것을 알 수 있습니다. 또한 실행할 때마다 결과가 무작위로 바뀝니다.
요약
이번에는 자기 회피 랜덤 워크의 프로그램을 제작했습니다. 이를 응용하여 격자점 위치에 있는 것의 종류를 지정하고 구조의 에너지 안정성 등을 시뮬레이션할 수도 있습니다. 또, 보다 효율적인 프로그램의 방법이 있을 것 같기 때문에 향후의 과제로 하고 싶습니다.
[참고 서적·웹]
R.H.Landau et al. (2018) 「실천 Python 라이브러리 계산 물리학 I - 수치 계산의 기초
Reference
이 문제에 관하여(자기 회피 랜덤 워크로 한 필기 쓰고 즐거웠다 ~ 계산 물리학 I (아사쿠라 서점)를 참고로 파이썬을 사용해 ~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/guraragu0010/items/1b31c13e1852bf99c973
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(자기 회피 랜덤 워크로 한 필기 쓰고 즐거웠다 ~ 계산 물리학 I (아사쿠라 서점)를 참고로 파이썬을 사용해 ~), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/guraragu0010/items/1b31c13e1852bf99c973텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)