python动态规划和A*算法

#动态规划
grid=[[0,1,0,0,0,0],
      [0,0,1,0,0,0],
      [0,0,1,0,0,0],
      [0,0,0,1,1,0],
      [0,0,1,1,1,0],
      [0,0,0,0,1,0]]

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

#up left down right
dir = [[0, -1],
      [-1, 0],
      [0, 1],
      [1, 0]]
dir_pic=['<','^','>','v']
cost=1

def search_policy(grid,init,cost):
    gird_row = len(grid)
    gird_col = len(grid[0])
    grid_value = [[99for col in range(gird_col)]for row in range(gird_row)]
    pic=[[' 'for col in range(gird_col)]for row in range(gird_row)]
    change=True
    while change:

        change=False

        for row in range(gird_row):
            for col in range(gird_col):
                if row==init[0] and col==init[1]:
                    if grid_value[row][col]>0:
                        grid_value[row][col]=0
                        pic[row][col]='*'
                        change=True
                elif grid[row][col]==0:
                    for i in range(len(dir)):
                        next_row = row + dir[i][0]
                        next_col = col + dir[i][1]
                        if next_row >=0 and next_row <gird_row and next_col>=0 and next_col<gird_col and grid[next_row][next_col]==0:
                            next_value=grid_value[next_row][next_col]+cost
                            if next_value<grid_value[row][col]:
                                grid_value[row][col]=next_value
                                pic[row][col]=dir_pic[i]
                                change = True
    # for i in grid_value:
    #     print(i)
    for i in range(len(pic)):
        print(pic[i])
    return grid_value
search_policy(grid,init,cost)

 

#A*
#create grid
grid=[[0,0,0,0,0,0],
      [0,1,1,1,1,0],
      [0,1,0,0,0,0],
      [0,1,0,0,0,0],
      [0,1,0,0,1,0]]
heuristic=[[9,8,7,6,5,4],
           [8,7,6,5,4,3],
           [7,6,5,4,3,2],
           [6,5,4,3,2,1],
           [5,4,3,2,1,0]]
init = [0, 0]
goal = [len(grid)-1,len(grid[0])-1]
#up left down right
dir = [[0, -1],
      [-1, 0],
      [0, 1],
      [1, 0]]
dir_pic=['<','^','>','v']
gird_row=len(grid)
gird_col=len(grid[0])


def search(gird, init, goal):
    step = 1
    if init == goal:
        return 0
    #未扩展的标记0,已经扩展的标记1
    expanded_grid=[[0, 0, 0, 0, 0, 0],
                   [0, 0, 0, 0, 0, 0],
                   [0, 0, 0, 0, 0, 0],
                   [0, 0, 0, 0, 0, 0],
                   [0, 0, 0, 0, 0, 0]]
    for row in range(len(grid)):
        for col in range(len(grid[0])):
            if grid[row][col]==1:
                expanded_grid[row][col]='x'
    #初始节点标记
    expanded_grid[init[0]][init[1]] = 1
    # expanded node
    open_list = [[9,0,init[0],init[1]]]
    # cost,list of(x,y)
    path = []
    cost = 1
    #loop
    while open_list != []:
            g = open_list[0][1]
            x = open_list[0][2]
            y = open_list[0][3]
            #弹出最小得f
            path.append(open_list[0])
            del open_list[0]
            if x != goal[0] or y != goal[1]:
                for i in dir:
                    x2 = x+i[0]
                    y2 = y+i[1]
                    # 移动的时候越界判断&障碍物判断&已经扩展过的判断
                    if (x2 <= gird_row-1) and (x2 >= 0) and (y2 <= gird_col-1) and (y2 >= 0) and (gird[x2][y2] == 0) and (expanded_grid[x2][y2] == 0):
                        g2 = g+cost
                        h2 = heuristic[x2][y2]
                        f2 = g2+h2
                        open_list.append([f2, g2, x2, y2])
                        step += 1
                        expanded_grid[x2][y2] = step
                        #将g按从小到大得顺序排列
                        open_list.sort()
            else:
                return expanded_grid
    # print("There is no vaild path!")
    return expanded_grid
expanded=(search(grid,init,goal))
for i in expanded:
    print(i)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值