Python蒙特卡罗模拟循环

时间:2013-01-18 19:15:49

标签: python loops random simulation montecarlo

我正在研究一个简单的蒙特卡罗模拟脚本,稍后我会扩展它用于更大的项目。该脚本是一个基本的爬虫,试图从网格中的A点到达B点。点A的坐标是(1,1)(这是左上角),点B的坐标是(n,n)(这是右下角,n是网格的大小)。

爬虫开始移动后,有四个选项,可以向左,向右,向上或向下(不允许对角线移动)。如果这四个选项中的任何一个满足以下条件:

  1. 新点应该仍然在n x n网格的范围内
  2. 以前不应该访问新点
  3. 新点将在剩余的有效选项中随机选择(据我所知,Python使用Mersenne Twister算法来选择随机数)。

    我想运行模拟1,000,000次(以下代码仅运行100次),每次迭代都应该终止:

    1. 抓取工具卡住了(没有有效的移动选项)
    2. 抓取工具到达网格上的最终目的地(n,n)。
    3. 我以为我正确地实现了算法,但显然有些不对劲。无论我运行多少次模拟(100或1,000,000),我只能获得一个成功的事件,爬虫可以设法到达终点,其余的尝试(99或999,999)都不成功。

      我打赌我错过了一些简单的东西,但由于某种原因看不到它。有什么想法吗?

      非常感谢!

      编辑:文中的一些拼写错误已得到纠正。

      import random
      
      i = 1 # initial coordinate top left corner
      j = 1 # initial coordinate top left corner
      k = 0 # counter for number of simulations
      n = 3 # Grid size
      
      foundRoute = 0 # counter for number of cases where the final point is reached
      gotStuck = 0 # counter for number of cases where no valid options found
      coordList = [[i, j]]
      
      while k < 100:
          while True:
              validOptions = []
      
              opt1 = [i - 1, j]
              opt2 = [i, j + 1]
              opt3 = [i + 1, j]
              opt4 = [i, j - 1]
      
              # Check 4 possible options out of bound and re-visited coordinates are
              # discarded:
      
              if opt1[0] != 0 and opt1[0] <= n and opt1[1] != 0 and opt1[1] <= n:
                  if not opt1 in coordList:
                      validOptions.append(opt1)
      
              if opt2[0] != 0 and opt2[0] <= n and opt2[1] != 0 and opt2[1] <= n:
                  if not opt2 in coordList:
                      validOptions.append(opt2)
      
              if opt3[0] != 0 and opt3[0] <= n and opt3[1] != 0 and opt3[1] <= n:
                  if not opt3 in coordList:
                      validOptions.append(opt3)
      
              if opt4[0] != 0 and opt4[0] <= n and opt4[1] != 0 and opt4[1] <= n:
                  if not opt4 in coordList:
                      validOptions.append(opt4)
      
              # Break loop if there are no valid options
              if len(validOptions) == 0:
                  gotStuck = gotStuck + 1
                  break
      
              # Get random coordinate among current valid options
              newCoord = random.choice(validOptions)
      
              # Append new coordinate to the list of grid points visited (to be used
              # for checks)
              coordList.append(newCoord)
      
              # Break loop if lower right corner of the grid is reached
              if newCoord == [n, n]:
                  foundRoute = foundRoute + 1
                  break
      
              # If the loop is not broken, assign new coordinates
              i = newCoord[0]
              j = newCoord[1]
          k = k + 1
      
      print 'Route found %i times' % foundRoute
      print 'Route not found %i times' % gotStuck
      

1 个答案:

答案 0 :(得分:3)

您的问题是,您永远不会清理您访问过的地点。更改突破内部while循环的块看起来像这样:

 if len(validOptions) == 0:
     gotStuck = gotStuck + 1
     coordList = [[1,1]]
     i,j = (1,1)
     break

您还需要在成功的地方更改块:

if newCoord == [n, n]:
    foundRoute = foundRoute + 1
    coordList = [[1,1]]
    i,j = (1,1)
    break

或者,您可以简单地将此代码放在内部while循环之前。然后代码的开头如下:

k = 0 # counter for number of simulations
n = 3 # Grid size  
foundRoute = 0 # counter for number of cases where the final point is reached
gotStuck = 0 # counter for number of cases where no valid options found
while k < 100:
    i,j = (1,1) 
    coordList = [[i,j]]
    while True:
        #Everything else