Я пытаюсь сделать алгоритм, который реализует поиск (оптимизацию) шаблона. Я почти закончил. Запуск моего алгоритма я вижу, как значения сходятся к минимуму функции. Единственная проблема, которая у меня есть, это эта печально известная ошибка: '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
значения - и они выглядят нормально, просто обычные числа с плавающей запятой. Итак, на данный момент я не знаю, что делать.
Удивительно, почему люди голосуют вниз, не давая никаких намеков или комментариев. – Jacobian
, возможно, потому, что вы не включаете трассировку стека, ваш отступ неправильный, и вы не проявляете никаких усилий при отладке, кроме того, что добавляете инструкцию печати. Из-за этого вопрос довольно низкого качества. Я не был человеком, который был ниспослан, так что это просто догадка. –