ValueError:在递归图搜索中解包的值太多

时间:2018-04-27 22:43:35

标签: python python-3.x

问题

作为单一任务的一部分,我正在建立一个程序,以找到从一条路到另一条路的最短路径。我正在使用一种称为递归最佳优先搜索的算法来实现这一点,并且当递归展开时获取ValueError并尝试解压缩解决方案(存储为节点列表,从目标节点到根节点)。递归调用存储在变量'result'和'best.f'中,如搜索算法的倒数第二行所示。

代码

下面包括主要算法和相关(但不是全部)方法

搜索算法:(Based on this pseudocode)

def find_path_from_to(problem):
    return RBFS_Road(problem,Node(problem.start,None,None,0,problem),math.inf)

def RBFS_Road(problem,node,f_limit):
    if problem.goaltest(node): return solution(node)
    successors = []
    for action in problem.actions(node):
        successors.append(Node(action.current_pos,node, 
        [node.current_pos,action],node.g+1,problem))
    if not successors: return "failure",math.inf
    for s in successors:
        s.f = max(s.g+s.h,node.f)
    while True:
        best = min_node(successors)
        if best.f > f_limit: return "failure",best.f
        alternative = alt(successors)
        result,best.f = RBFS_Road(problem,best,min(f_limit,alternative))
        if result != "failure": return result

返回解决方案列表以及Node和Problem类

的函数
def solution(node):
    solution_list = [node.current_pos]
    current_node = node
    while current_node.parent is not None:
        solution_list.append(current_node.parent.current_pos)
        current_node = current_node.parent
    return [solution_list,None]

|

class Problem():
    def __init__(self,start,goal,city_data):
        self.start = start
        self.goal = goal
        self.city_data = city_data

    def goaltest(self,node):
        return node.current_pos.split(' ',1)[0] == self.goal.split(' ',1)[0]
    def actions(self,node):
        return find_neighbors(node,self.city_data)

class Node():
    def __init__(self,current_pos,parent,action,steps,problem):
        self.current_pos  = current_pos
        self.parent = parent
        self.action = action
        self.problem = problem
        self.g = steps
        self.h = h_heu(self,self.problem.city_data)
        self.f = self.g + self.h

我尝试了什么

递归调用被分配给2个变量,第一个将结束一个列表,第二个有助于在算法决定回溯时重定向搜索。找到解决方案时,第二个变量'best.f'设置为'None',因为我们不再需要它了。所以很自然地我设置解决方案列表返回[列表,无],但仍然得到解包错误。

然后我尝试通过在原始递归调用之上的print语句中插入带递归调用的行来打印出递归调用的结果以及输出的长度:

print(RBFS_Road(args),len(RBFS_Road(args))

(用'args'替换实际参数以便于阅读)

它输出以下内容:

('failure', 4.0) 2
('failure', 4.0) 2
('failure', 4.0) 2
[['street_3 45', 'avenue_0 23', 'avenue_0 21', 'street_1 37'], None] 2
('failure', 4.0) 2
('failure', 4.0) 2
[['street_3 45', 'avenue_0 23', 'avenue_0 21', 'street_1 37'], None] 2
['street_3 45', 'avenue_0 23', 'avenue_0 21', 'street_1 37'] 4
('failure', 4.0) 2
('failure', 4.0) 2
[['street_3 45', 'avenue_0 23', 'avenue_0 21', 'street_1 37'], None] 2

堆栈跟踪,评论后:

Traceback (most recent call last):
  File "RouteFinding_New.py", line 120, in <module>
    main(str(sys.argv[1]),str(sys.argv[2]),str(sys.argv[3]))
  File "RouteFinding_New.py", line 117, in main
    solution = find_path_from_to(problem)
  File "RouteFinding_New.py", line 37, in find_path_from_to
    return 
RBFS_Road(problem,Node(problem.start,None,None,0,problem),math.inf)
  File "RouteFinding_New.py", line 51, in RBFS_Road
  print(RBFS_Road(problem,best,min(f_limit,alternative)),len(RBFS_Road(problem,best,min(f_limit,alternative))))
File "RouteFinding_New.py", line 52, in RBFS_Road
result,best.f = RBFS_Road(problem,best,min(f_limit,alternative))
ValueError: too many values to unpack (expected 2)

我认为罪魁祸首是长度为4的线,因为它没有“无”。我不能为我的生活找出为什么无消失。

问题

为什么我的程序会给我'解压错误的值太多'以及我该怎么做才能解决它。如果我能弄清楚为什么“无”从解决方案列表中消失(在“我尝试过的内容”部分中),问题就解决了。

注意:

我试图只包含问题的相关部分,因为它已经很长,所以如果你想知道更多的东西,请随意添加评论。提前感谢任何试图提供帮助的人

0 个答案:

没有答案