【发布时间】:2021-07-29 17:38:28
【问题描述】:
import numpy as np
import random
import matplotlib.pyplot as plt
# set grid size, M*N (row, col)
M: int = 5
N: int = 5
def moves(pos: tuple, dpos: tuple) -> tuple:
return (pos[0] + dpos[0], pos[1] + dpos[1])
def check_neighbors(white_pos: tuple, black_pos: tuple) -> bool:
stationary = white_pos
up = (white_pos[0], white_pos[1] + 1)
upper_right = (white_pos[0] + 1, white_pos[1] + 1)
upper_left = (white_pos[0] - 1, white_pos[1] + 1)
left = (white_pos[0] - 1, white_pos[1])
right = (white_pos[0] + 1, white_pos[1])
lower_left = (white_pos[0] - 1, white_pos[1] - 1)
down = (white_pos[0], white_pos[1] - 1)
lower_right = (white_pos[0] + 1, white_pos[1] - 1)
if (black_pos == stationary) or (black_pos == up) or (black_pos == upper_right) or (black_pos == upper_left) or (black_pos == left) or (black_pos == right) or (black_pos == lower_left) or (black_pos == down) or (black_pos == lower_right):
return True
else:
return False
def run_sim():
w_x0 = random.sample([i for i in range(0,M)], 1)
w_y0 = random.sample([j for j in range(0,N)], 1)
b_x0 = random.sample([i for i in range(0,M)], 1)
b_y0 = random.sample([j for j in range(0,N)], 1)
white = [(x,y) for x, y in zip(w_x0, w_y0)]
black = [(x,y) for x, y in zip(b_x0, b_y0)]
stop: bool = False
n: int = 0
t: int = 0
while stop != True:
if check_neighbors(white[n], black[n]) == True:
stop = True
else:
dt_w = random.sample([i for i in range(-1,2)], 2)
dt_bl = random.sample([i for i in range(-1,2)], 2)
white.append(moves(white[n], dt_w))
black.append(moves(black[n], dt_bl))
t = t+1
n = n+1
return n
t_dist = [run_sim() for i in range(100)]
print(t_dist)
请原谅糟糕的格式
当它到达 t_dist = [run_sim() for i in range(100)] 时,它需要 FOREVER 才能运行(我的意思是超过 60 秒)。我怎样才能让它运行得更快并得到我的结果?为什么它的计算成本如此之高?
我正在使用 jupyter 笔记本。我也尝试将它作为 .py 文件简单地运行,但它仍然很慢。我尝试使用调试器,在 t_dist = 设置断点后,它只显示一些迭代然后停止。如果我将它设置为 range(5),它可以正常工作,但会开始出现更大的数字(即 100、10000),这就是我想要运行模拟的原因。
【问题讨论】:
-
我们无法重现您的问题。
-
你没有说明你的代码应该做什么,或者它应该如何做。
-
我认为他的最小尺寸循环导致了巨大的迭代@fthomson - 我完全同意
-
根据我的阅读,不能保证
run_sim将永远终止。它看起来在数学上等同于选择 1 到 25 之间的两个随机数,如果它们的差值的绝对值为 4 或更小,则返回循环计数器。 -
@RobertCotterman 我同意。这一试验有时在逻辑上需要很长时间,因此定义
n的最大值是现实的