首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何计算每一个节点中障碍物的高度,以及它对A星算法公式路径查找的影响?

如何计算每一个节点中障碍物的高度,以及它对A星算法公式路径查找的影响?
EN

Stack Overflow用户
提问于 2019-08-01 06:41:10
回答 1查看 181关注 0票数 1

我正在研究一种恒星算法来生成一个最优的轨迹。对于我的问题,我试图在两点之间找到一条最佳的无人机路径,但我需要考虑障碍的高度。如您所知,通过搜索,算法将计算出每个节点的g (cost)h(heuristic),并通过该公式选择最佳的F=G+H。我还需要计算障碍的高度,并将它添加到我的公式中,成为F=G+H+E。E代表障碍物的高度。

如果无人机以特定的高度飞行,面对一个很高的障碍物就会掉头,如果障碍物的高度接近无人机的高度,就意味着风险会很高,并会考虑飞越它的短障碍。

我已经生成了一个与我的网格大小相同的地图,我给出了障碍物的随机数(随机高度),然后我将它应用到我的公式中。在我的扩张阶段,如果障碍物的高度小于无人机的高度,那么无人机就可以飞越它,但我认为没有效果。我能得到什么帮助吗?

下面是我的代码:

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

import random

grid = [[0, 1, 0, 0, 0, 0],
        [0, 1, 0, 0, 0, 0],
        [0, 1, 0, 0, 0, 0],
        [0, 1, 0, 0, 0, 0],
        [0, 0, 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]                            #Start location is (0,0) which we put it in open list.
goal = [len(grid)-1,len(grid[0])-1]     #Our goal in (4,5) and here are the coordinates of the cell.

#Below the four potential actions to the single field

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

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

cost = 1   #Each step costs you one


drone_h = 60  #The altitude of drone

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))]

    action = [[-1 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

    expand=[[-1 for row in range(len(grid[0]))] for col in range(len(grid))]

    elevation = [[0 for row in range(len(grid[0]))] for col in range(len(grid))]
    for i in range(len(grid)):    
        for j in range(len(grid[0])): 
            if grid[i][j] == 1:
                elevation[i][j] = random.randint(1,100)
                print(elevation[i][j])
            else:
                elevation[i][j] = 0


    # we assigned the cordinates and g value
    x = init[0]
    y = init[1]
    g = 0
    h = heuristic[x][y]
    e = elevation[x][y]

    f = g + h + e

    #our open list will contain our initial value
    open = [[f, g, h, x, y]]

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

    #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:    
            resign = True
            print('Fail')
            print('############# Search terminated without success')
            print()
        else: 

            open.sort()            
            open.reverse()          
            next = open.pop()       
            #print('list item')
            #print('next')


            x = next[3]
            y = next[4]
            g = next[1]

            expand[x][y] = count
            count+=1

            #Check if we are done
            if x == goal[0] and y == goal[1]:
                found = True
                print(next) 
                print('############## Search is success')
                print()

            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 and elevation[x2][y2]< drone_h:
                            g2 = g + cost            
                            h2 = heuristic[x2][y2]
                            e = elevation[x2][y2]
                            f2 = g2 + h2 + e

                            open.append([f2,g2,h2,x2,y2])   
                            #print('append list item')
                            #print([g2,x2,y2])
                            #Then we check them to never expand again
                            closed[x2][y2] = 1
                            action[x2][y2] = i
    for i in range(len(expand)):
        print(expand[i])
    print()
    policy=[[' ' for row in range(len(grid[0]))] for col in range(len(grid))]
    x=goal[0]
    y=goal[1]
    policy[x][y]='*'
    while x !=init[0] or y !=init[1]:
        x2=x-delta[action[x][y]][0]
        y2=y-delta[action[x][y]][1]
        policy[x2][y2]= delta_name[action[x][y]]
        x=x2
        y=y2
    for i in range(len(policy)):
        print(policy[i])


search()

我得到的结果:

代码语言:javascript
运行
复制
[11, 11, 0, 4, 5]
############## Search is success

[0, -1, -1, -1, -1, -1]
[1, -1, -1, -1, -1, -1]
[2, -1, -1, -1, -1, -1]
[3, -1, 8, 9, 10, 11]
[4, 5, 6, 7, -1, 12]

['V', ' ', ' ', ' ', ' ', ' ']
['V', ' ', ' ', ' ', ' ', ' ']
['V', ' ', ' ', ' ', ' ', ' ']
['V', ' ', ' ', '>', '>', 'V']
['>', '>', '>', '^', ' ', '*']
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-01 08:11:44

你需要把成本和障碍的高度联系起来。所以,你需要弄清楚,就距离而言,高障碍所代表的风险是多么的昂贵。

所以,基本上你的启发式保持你的实际距离是G(到现在为止)+E(到现在为止),你的启发式保持G(到现在为止)+E(到现在为止)+H。

既然你没有说明承担风险有多糟糕,你有多想避免风险,比如说,除非没有其他方法,否则你永远都不想冒风险。

然后,您可以将海拔的成本联系起来如下:

代码语言:javascript
运行
复制
E(x) = 0 if obstacle is low
E(x) = maximal_possible_distance + (elevation - drone height)

这样的话,走一条弯路总是更好的,而且它更倾向于较小的海拔(如果你想更倾向于更小的海拔,可以添加一个因子或指数)。

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

https://stackoverflow.com/questions/57303131

复制
相关文章

相似问题

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