我试图做一个实现模式搜索(优化)的算法。我就快完成了。运行我的算法我看到值是如何收敛到函数的最小值的。我唯一的问题是这个臭名昭着的错误:'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循环。在此之前,我打印hy
和hx
的值 - 它们看起来很正常,只是普通的浮点数。所以,在这一点上,我不知道该怎么做。
不知道为什么人们没有提供任何提示或评论就投了票。 – Jacobian 2014-11-23 15:19:18
可能是因为您没有包含堆栈跟踪,您的缩进是错误的,除了说您添加了打印语句之外,您不会在调试中显示任何努力。因此,这是一个质量相当低的问题。我不是那个低调的人,所以这只是一个猜测。 – 2014-11-23 15:35:58