Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “如何编码”;如果只有一个变量存在;在搜索中';算法';?_Python_Arrays_Numpy - Fatal编程技术网

Python “如何编码”;如果只有一个变量存在;在搜索中';算法';?

Python “如何编码”;如果只有一个变量存在;在搜索中';算法';?,python,arrays,numpy,Python,Arrays,Numpy,我正在使用一种DIY网格搜索“算法”,它从左上角开始,到右下角结束。我的“算法”只能左右移动,它观察它的邻居,看哪个最小,然后移动到最小。如果两个邻居都是平等的,那么优先级就会下降。下面是我的代码: import numpy as np import random # Create grid with random integers from 0 to 9 width, height = 10, 10 np.random.seed(0) grid = np.random.randint(0,

我正在使用一种DIY网格搜索“算法”,它从左上角开始,到右下角结束。我的“算法”只能左右移动,它观察它的邻居,看哪个最小,然后移动到最小。如果两个邻居都是平等的,那么优先级就会下降。下面是我的代码:

import numpy as np
import random

# Create grid with random integers from 0 to 9
width, height = 10, 10
np.random.seed(0)
grid = np.random.randint(0, 10, size=(width, height))

# Agent actions
goal = grid[-1][-1] # Row, Column

# Check mechanism
print(grid)
print(goal)
def rightdown():
x、 y=0,0
当前位置=网格[x][y]
步骤=[网格[0][0]]
打印(“初始位置:”,当前位置)
对于范围(16)中的i:
如果网格[x+1][y]<网格[x][y+1]:#向右走
当前位置=网格[x+1][y]
x+=1
elif grid[x+1][y]>grid[x][y+1]:#向下
当前位置=网格[x][y+1]
y+=1
elif grid[x+1][y]==grid[x][y+1]:#如果相同,则向下移动
当前位置=网格[x][y+1]
x+=1
elif网格[0][9]或网格[1][9]或网格[2][9]或网格[3][9]或网格[4][9]或网格[5][9]或网格[6][9]或网格[7][9]或网格[8][9]或网格[9][9]:
打印('右击')
elif网格[9][0]或网格[9][1]或网格[9][2]或网格[9][3]或网格[9][4]或网格[9][5]或网格[9][6]或网格[9][7]或网格[9][8]或网格[9][9]:
打印('bott hit')
打印(“当前位置:”,当前位置)
打印('这是x,y:',x',',y',\n')
步骤。追加(当前位置)
打印('采取的总步骤:',总和(步骤))
右下()
我的问题是:我想让它一旦到达数组的末尾(如右图),它只会下降。但是,如何编写代码?在英语中,这意味着如果只存在右数组,则向下移动,而不是同时存在右数组和下数组

编辑_1:我编辑了代码,以查看计数器位置是否到达最下面的行或最右边的列,但是下面的代码现在给出了一个错误:

索引10超出大小为10的轴0的界限

要绕过此选项,请将范围从16更改为15或更小。使用16是因为它正在迭代到下一个数字

对于范围(15)内的i:


为什么以下代码在以下位置[6][9]时不打印“右击”?

您的代码中有几个特殊之处:

  • 您需要检查索引,以便它们不会试图访问给定数组之外的内容
  • 您需要检查在移动时是否可以提升索引或超出范围
  • 比较索引下的值的唯一时间是在决定下一步移动的位置时:
    elif grid[0][9]或grid[1][9]。。。。或grid[9][9]:print('right hit')
    访问值并检查是否有非真实值-它不检查inexpositions
  • sum of steps()
    将汇总所有访问的值,而不是计算步骤(可能是有意的)
你可以这样安排:

def rightdown(g):
    row, column, (max_row, max_column) = 0, 0, g.shape

    print(g)
    last_pos = -1,-1
    current_pos = row,column
    current_value = g[row][column]
    steps = [current_value]

    def p(): #  printer function called twice later: dry - don't repeat yourself
        msg = "hit bottom" if row+1 == max_row else (
            "hit right" if column+1 == max_column else "")
        print("Pos:", current_pos, "  Value:", g[row][column], msg)
      
    while current_pos != (max_row - 1, max_column - 1):
        p()
        if row+1 < max_row and column+1 < max_column:
            vd = g[row + 1][column]
            vr = g[row][column + 1]

            if vd <= vr:
                row += 1
            else:
                column += 1
        elif row+1 == max_row:
            column += 1
        elif column+1 == max_column:
            row += 1

        steps.append(g[row][column])
        last_pos, current_pos = current_pos, (row, column)

    p()
    print('Steps', steps, 'taken: ', len(steps), "sum:", sum(steps))
输出:

[[5 0 3 3 7 9 3 5 2 4]
 [7 6 8 8 1 6 7 7 8 1]
 [5 9 8 9 4 3 0 3 5 0]
 [2 3 8 1 3 3 3 7 0 1]
 [9 9 0 4 7 3 2 7 2 0]
 [0 4 5 5 6 8 4 1 4 9]
 [8 1 1 7 9 9 3 6 7 2]
 [0 3 5 9 4 4 6 4 4 3]
 [4 4 8 4 3 7 5 5 0 1]
 [5 9 3 0 5 0 1 2 4 2]]
Pos: (0, 0)   Value: 5
Pos: (0, 1)   Value: 0
Pos: (0, 2)   Value: 3
Pos: (0, 3)   Value: 3
Pos: (0, 4)   Value: 7
Pos: (1, 4)   Value: 1
Pos: (2, 4)   Value: 4
Pos: (3, 4)   Value: 3
Pos: (3, 5)   Value: 3
Pos: (4, 5)   Value: 3
Pos: (4, 6)   Value: 2
Pos: (5, 6)   Value: 4
Pos: (5, 7)   Value: 1
Pos: (5, 8)   Value: 4
Pos: (6, 8)   Value: 7
Pos: (6, 9)   Value: 2 hit right
Pos: (7, 9)   Value: 3 hit right
Pos: (8, 9)   Value: 1 hit right
Pos: (9, 9)   Value: 2 hit bottom
Steps [5, 0, 3, 3, 7, 1, 4, 3, 3, 3, 2, 4, 1, 4, 7, 2, 3, 1, 2] taken: 19 sum: 58

x
y
width
height
进行比较,也许吧?对不起@TigerhawkT3,我不明白,你这是什么意思?
x
y
是当前值,代表你在网格中行走时的位置
width
height
是最大值,表示网格的尺寸。如果当前值达到最大值,那么您已经在该方向到达网格的末端。我研究了添加一个新的elif语句:“elif grid[x][y]:”,但是它从未达到这种情况,我不知道为什么。所以我编辑了它的某些值,但仍然不满足条件。知道为什么吗?我上面的代码反映了我所做的。宽度=10,索引是0…9。只有当x+1仍然小于宽度时,才能向右移动-如果x+1==10,则在nexts检查中会出现索引错误。
import numpy as np
import random

# Create grid with random integers from 0 to 9
width, height = 10, 10
np.random.seed(0)
grid = np.random.randint(0, 10, size=(width, height))
print(grid)

rightdown(grid)
[[5 0 3 3 7 9 3 5 2 4]
 [7 6 8 8 1 6 7 7 8 1]
 [5 9 8 9 4 3 0 3 5 0]
 [2 3 8 1 3 3 3 7 0 1]
 [9 9 0 4 7 3 2 7 2 0]
 [0 4 5 5 6 8 4 1 4 9]
 [8 1 1 7 9 9 3 6 7 2]
 [0 3 5 9 4 4 6 4 4 3]
 [4 4 8 4 3 7 5 5 0 1]
 [5 9 3 0 5 0 1 2 4 2]]
Pos: (0, 0)   Value: 5
Pos: (0, 1)   Value: 0
Pos: (0, 2)   Value: 3
Pos: (0, 3)   Value: 3
Pos: (0, 4)   Value: 7
Pos: (1, 4)   Value: 1
Pos: (2, 4)   Value: 4
Pos: (3, 4)   Value: 3
Pos: (3, 5)   Value: 3
Pos: (4, 5)   Value: 3
Pos: (4, 6)   Value: 2
Pos: (5, 6)   Value: 4
Pos: (5, 7)   Value: 1
Pos: (5, 8)   Value: 4
Pos: (6, 8)   Value: 7
Pos: (6, 9)   Value: 2 hit right
Pos: (7, 9)   Value: 3 hit right
Pos: (8, 9)   Value: 1 hit right
Pos: (9, 9)   Value: 2 hit bottom
Steps [5, 0, 3, 3, 7, 1, 4, 3, 3, 3, 2, 4, 1, 4, 7, 2, 3, 1, 2] taken: 19 sum: 58