2014-11-23 72 views
-1

我试图做一个实现模式搜索(优化)的算法。我就快完成了。运行我的算法我看到值是如何收敛到函数的最小值的。我唯一的问题是这个臭名昭着的错误:'NoneType' object is not iterable。我的主要功能如下:为什么我在这个递归函数中得到'NoneType'对象是不可迭代的

def exploresearch(xk, yk, hx, hy, lamb, theta, curval): 
    if hx < theta and hy < theta: 
    return [xk, yk] 
    else: 
    while hx > theta and hy > theta: 
     # шаг вправо 
     if broyden(xk + hx, yk) < curval: 
      # шаг вверх 
      if broyden(xk + hx, yk + hy) < curval: 
       xn = xk + lamb * hx 
       yn = yk + lamb * hy 
       xk = xk + hx 
       yk = yk + hy 
       newval = broyden(xk, yk) 
       xs, ys, flag = simpleexplore(xn, yn, hx, hy, lamb, theta, newval) 
       if flag: 
        xk, yk = repeatpattern(xk, yk, hx, hy, xs, ys, lamb, theta) 
       xk, yk = exploresearch(xk, yk, hx, hy, lamb, theta, broyden(xk, yk)) 
       #repeatexplore(xk, yk, hx, hy, lamb, theta, "+", "+") 
      # шаг вниз 
      elif broyden(xk + hx, yk - hy) < curval: 
       xn = xk + lamb * hx 
       yn = yk - lamb * hy 
       xk = xk + hx 
       yk = yk - hy 
       newval = broyden(xk, yk) 
       xs, ys, flag = simpleexplore(xn, yn, hx, hy, lamb, theta, newval) 
       if flag: 
        xk, yk = repeatpattern(xk, yk, hx, hy, xs, ys, lamb, theta) 
       xk, yk = exploresearch(xk, yk, hx, hy, lamb, theta, broyden(xk, yk)) 
       #repeatexplore(xk, yk, hx, hy, lamb, theta, "+", "-") 
      # остаемся 
      else: 
       #поиск по образцу 
       # (xn, yn) - вершина, в которой делаем поиск по образцу 
       hy = hy/2 
       xn = xk + lamb * hx 
       yn = yk 
       xk = xk + hx 
       yk = yk 
       newval = broyden(xk, yk) 
       xs, ys, flag = simpleexplore(xn, yn, hx, hy, lamb, theta, newval) 
       if flag: 
        xk, yk = repeatpattern(xk, yk, hx, hy, xs, ys, lamb, theta) 
       xk, yk = exploresearch(xk, yk, hx, hy, lamb, theta, broyden(xk, yk)) 
       #repeatexplore(xk, yk, hx, hy, lamb, theta, "+", "") 
     # шаг влево 
     elif broyden(xk - hx, yk) < curval: 
      # шаг вверх 
      if broyden(xk - hx, yk + hy) < curval: 
       xn = xk - lamb * hx 
       yn = yk + lamb * hy 
       xk = xk - hx 
       yk = yk + hy 
       newval = broyden(xk, yk) 
       xs, ys, flag = simpleexplore(xn, yn, hx, hy, lamb, theta, newval) 
       if flag: 
        xk, yk = repeatpattern(xk, yk, hx, hy, xs, ys, lamb, theta) 
       xk, yk = exploresearch(xk, yk, hx, hy, lamb, theta, broyden(xk, yk)) 
       #repeatexplore(xk, yk, hx, hy, lamb, theta, "-", "+") 
      # шаг вниз 
      elif broyden(xk - hx, yk - hy) < curval: 
       xn = xk - lamb * hx 
       yn = yk - lamb * hy 
       xk = xk - hx 
       yk = yk - hy 
       newval = broyden(xk, yk) 
       xs, ys, flag = simpleexplore(xn, yn, hx, hy, lamb, theta, newval) 
       if flag: 
        xk, yk = repeatpattern(xk, yk, hx, hy, xs, ys, lamb, theta) 
       xk, yk = exploresearch(xk, yk, hx, hy, lamb, theta, broyden(xk, yk)) 
       #repeatexplore(xk, yk, hx, hy, lamb, theta, "-", "-") 
      # остаемся 
      else: 
       #поиск по образцу 
       # (xn, yn) - вершина, в которой делаем поиск по образцу 
       hy = hy/2 
       xn = xk - lamb * hx 
       yn = yk 
       xk = xk - hx 
       yk = yk 
       newval = broyden(xk, yk) 
       xs, ys, flag = simpleexplore(xn, yn, hx, hy, lamb, theta, newval) 
       if flag: 
        xk, yk = repeatpattern(xk, yk, hx, hy, xs, ys, lamb, theta) 
       xk, yk = exploresearch(xk, yk, hx, hy, lamb, theta, broyden(xk, yk)) 
       #repeatexplore(xk, yk, hx, hy, lamb, theta, "-", "") 
     # шаг вверх 
     elif broyden(xk, yk + hy) < curval: 
      hx = hx/2 
      xn = xk 
      yn = yk + lamb * hy 
      xk = xk 
      yk = yk + hy 
      newval = broyden(xk, yk) 
      xs, ys, flag = simpleexplore(xn, yn, hx, hy, lamb, theta, newval) 
      if flag: 
       xk, yk = repeatpattern(xk, yk, hx, hy, xs, ys, lamb, theta) 
      xk, yk = exploresearch(xk, yk, hx, hy, lamb, theta, broyden(xk, yk)) 
      #repeatexplore(xk, yk, hx, hy, lamb, theta, "", "+") 
     # шаг вниз 
     elif broyden(xk, yk - hy) < curval: 
      hx = hx/2 
      xn = xk 
      yn = yk - lamb * hy 
      xk = xk 
      yk = yk - hy 
      newval = broyden(xk, yk) 
      xs, ys, flag = simpleexplore(xn, yn, hx, hy, lamb, theta, newval) 
      if flag: 
       xk, yk = repeatpattern(xk, yk, hx, hy, xs, ys, lamb, theta) 
      xk, yk = exploresearch(xk, yk, hx, hy, lamb, theta, broyden(xk, yk)) 
     else: 
      hx = hx/2 
      hy = hy/2 
      xk, yk = exploresearch(xk, yk, hx, hy, lamb, theta, broyden(xk, yk)) 

把一些打印语句来调试,我看到这个错误之前正确弹出while循环。在此之前,我打印hyhx的值 - 它们看起来很正常,只是普通的浮点数。所以,在这一点上,我不知道该怎么做。

+0

不知道为什么人们没有提供任何提示或评论就投了票。 – Jacobian 2014-11-23 15:19:18

+0

可能是因为您没有包含堆栈跟踪,您的缩进是错误的,除了说您添加了打印语句之外,您不会在调试中显示任何努力。因此,这是一个质量相当低的问题。我不是那个低调的人,所以这只是一个猜测。 – 2014-11-23 15:35:58

回答

1

如果你的代码第一次测试失败并进入while循环,你永远不会返回任何东西。如果你不回报任何东西,那么像这样的陈述:

xk, yk = exploresearch(...) 

...会抛出你说的错误。这是因为exploresearch(...)返回None,并且xk, yk = None正试图迭代None(它是NoneType类型的对象)。

您需要确保代码的else部分返回的内容不是None

+0

谢谢,先生!我按照你的提示做了。 – Jacobian 2014-11-23 15:45:42

相关问题