首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么这段代码会关闭[init[0]][init[1]]而不是关闭[init[0]][init[0]]?

为什么这段代码会关闭[init[0]][init[1]]而不是关闭[init[0]][init[0]]?
EN

Stack Overflow用户
提问于 2019-06-28 14:22:53
回答 1查看 129关注 0票数 0

我正在阅读第一个搜索程序--人工智能机器人算法,我正在阅读它的python代码。在这里,我们创建了一个封闭数组来检查单元格一旦展开,就不再展开它们。我们定义了一个称为closed的数组,它的大小是我们的网格。作者说,它有两个值&1.0表示打开,1表示关闭,但我看到的只是零。

他将起始点0,0乘以1标记,直到不检查它们,但是他将坐标作为0和1放在这一行closed[init][init1] =1,为什么他放0和1而不是0,0?

python代码在这里:

代码语言:javascript
运行
复制
#grid format
# 0 = navigable space
# 1 = occupied space

grid=[[0,0,1,0,0,0],
      [0,0,1,0,0,0],
      [0,0,0,0,1,0],
      [0,0,1,1,1,0],
      [0,0,0,0,1,0]]

init = [0,0]                         
goal = [len(grid)-1,len(grid[0])-1]   


delta=[[-1, 0],      #up
       [ 0,-1],      #left
       [ 1, 0],      #down
       [ 0, 1]]      #right

delta_name = ['^','<','V','>']        #The name of above actions
cost = 1

def search():
    #open list elements are of the type [g,x,y] 
    closed = [[0 for row in range(len(grid[0]))] for col in range(len(grid))]

    #We initialize the starting location as checked
    closed[init[0]][init[1]] = 1
    # we assigned the cordinates and g value
    x = init[0]
    y = init[1]
    g = 0
    #our open list will contain our initial value
    open = [[g,x,y]]


    found = False #flag that is set when search complete
    resign= False #Flag set if we can't find expand

    #print('initial open list:')
    #for i in range(len(open)):
            #print('  ', open[i])
    #print('----')


    while found is False and resign is False:
        #Check if we still have elements in the open list
        if len(open)==0: #If our open list is empty
            resign=True
            print('Fail')
            print('############# Search terminated without success')
        else: 
            #if there is still elements on our list
            #remove node from list
            open.sort()       
            open.reverse()    #reverse the list
            next = open.pop() 
            #print('list item')
            #print('next')

            #Then we assign the three values to x,y and g. Which is our expantion
            x = next[1]
            y = next[2]
            g = next[0]

            #Check if we are done

            if x == goal[0] and y == goal[1]:
                found = True
                print(next) #The three elements above this if
                print('############## Search is success')
            else:
                #expand winning element and add to new open list
                for i in range(len(delta)): 
                    x2 = x+delta[i][0]
                    y2 = y+delta[i][1]
                    #if x2 and y2 falls into the grid
                    if x2 >= 0 and x2 < len(grid) and y2 >=0 and y2 <= len(grid[0])-1:
                        #if x2 and y2 not checked yet and there is not obstacles
                        if closed[x2][y2] == 0 and grid[x2][y2] == 0:
                            g2 = g+cost #we increment the cose
                            open.append([g2,x2,y2])#we add them to our open list
                            #print('append list item')
                            #print([g2,x2,y2])
                            #Then we check them to never expand again
                            closed[x2][y2] = 1

search()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-28 14:39:41

他将坐标0和1放在这一行中,closed[init][init1] =1

closed[init[0]][init[1]]并不意味着“将坐标(0,1)处的值设置为1”。它的意思是“使用init[0]作为x坐标,在y坐标下使用init[1],将值设置为1”。init[0]为0,init[1]为0,因此closed[init[0]][init[1]] = 1closed[0][0]设置为1。

假设起始坐标是init = [2,5]。将行更改为closed[init[2]][init[5]] = 1是不正确的。这将导致IndexError崩溃,因为init只有两个元素,所以只能用0或1对其进行索引。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56808670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档