为什么这段代码做的是 closed[init[0]][init[1]] 而不是 closed[init[0]][init[0]]?
Why does this code do closed[init[0]][init[1]] instead of closed[init[0]][init[0]]?
我正在阅读第一个搜索程序 - 机器人算法的人工智能,我正在阅读它的 python 代码。在这里,我们创建了一个封闭数组来检查单元格一旦展开并且不再展开。我们定义了一个名为 closed 的数组,并将其大小定义为我们的网格。作者说它有两个值 0 和 1。0 表示打开,1 表示关闭,但我看到它只是零。
他把起点0,0用1标记了,直到不去查,但是他把坐标0和1放在这一行closed[init[0]][init[1]] = 1。为什么他把 0 和 1 而不是 0,0?
python代码在这里:
#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()
he put the coordinate as 0 and 1 in this line closed[init[0]][init[1]] = 1
closed[init[0]][init[1]]
并不代表 "set the value at coordinates (0,1) to 1"。意思是"using init[0]
as the x coordinate and init[1]
at the y coordinate, set the value to 1"。 init[0]
为 0,init[1]
为 0,因此 closed[init[0]][init[1]] = 1
将 closed[0][0]
设置为 1。
假设起始坐标是init = [2,5]
。将该行更改为 closed[init[2]][init[5]] = 1
是不正确的。这会因 IndexError 而崩溃,因为 init
只有两个元素,所以你只能用 0 或 1 索引它。
我正在阅读第一个搜索程序 - 机器人算法的人工智能,我正在阅读它的 python 代码。在这里,我们创建了一个封闭数组来检查单元格一旦展开并且不再展开。我们定义了一个名为 closed 的数组,并将其大小定义为我们的网格。作者说它有两个值 0 和 1。0 表示打开,1 表示关闭,但我看到它只是零。
他把起点0,0用1标记了,直到不去查,但是他把坐标0和1放在这一行closed[init[0]][init[1]] = 1。为什么他把 0 和 1 而不是 0,0?
python代码在这里:
#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()
he put the coordinate as 0 and 1 in this line closed[init[0]][init[1]] = 1
closed[init[0]][init[1]]
并不代表 "set the value at coordinates (0,1) to 1"。意思是"using init[0]
as the x coordinate and init[1]
at the y coordinate, set the value to 1"。 init[0]
为 0,init[1]
为 0,因此 closed[init[0]][init[1]] = 1
将 closed[0][0]
设置为 1。
假设起始坐标是init = [2,5]
。将该行更改为 closed[init[2]][init[5]] = 1
是不正确的。这会因 IndexError 而崩溃,因为 init
只有两个元素,所以你只能用 0 或 1 索引它。