2014-11-23 3 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)) 

Собирают некоторые операторы для отладки, я вижу, что эта ошибка выскакивает прямо перед во время цикла. И как раз перед этим я печатаю hy и hx значения - и они выглядят нормально, просто обычные числа с плавающей запятой. Итак, на данный момент я не знаю, что делать.

+0

Удивительно, почему люди голосуют вниз, не давая никаких намеков или комментариев. – Jacobian

+0

, возможно, потому, что вы не включаете трассировку стека, ваш отступ неправильный, и вы не проявляете никаких усилий при отладке, кроме того, что добавляете инструкцию печати. Из-за этого вопрос довольно низкого качества. Я не был человеком, который был ниспослан, так что это просто догадка. –

ответ

1

Если ваш код не прошел первый тест и входит в цикл while, вы никогда ничего не возвращаете. Если вы ничего не возвращаете, то такие заявления выглядят следующим образом:

xk, yk = exploresearch(...) 

... будет выдавать ошибку, которую вы говорите. Это потому, что exploresearch(...) возвращает None, а xk, yk = None пытается перебрать более None (который является объектом типа NoneType).

Вы должны убедиться, что часть вашего кода возвращает что-то отличное от None.

+0

Спасибо, сэр! Я последовал твоему намеку и сделал это. – Jacobian

Смежные вопросы