zoukankan      html  css  js  c++  java
  • ASttar 路径规划之初级

    代码只是A*获取了从起点到达目的地的最短路径,但是对何时进行横向的偏移未做约束。

      1 # -*- coding: utf-8 -*-
      2 """
      3 Spyder Editor
      4 
      5 This is a temporary script file.
      6 """
      7 
      8 import numpy as  np
      9 import matplotlib.pyplot as plt
     10 import math
     11 import queue
     12 import time
     13 import copy
     14 
     15 detaWidth = 0.3
     16 totalWidth = 6.0   #road width
     17 detaLength = 3.0   
     18 totalLength = 30.0 # road predict length
     19 vehicleHarfWidth = 0.8
     20 
     21 # s,l half width,half height /m
     22 obstacle = np.array([[10,5,0.3,0.3],
     23                      [16,1.5,0.6,0.3]])
     24 
     25 numberOfL = np.int(totalWidth /detaWidth)
     26 numberOfS = np.int(totalLength /detaLength)
     27 
     28 class StrPosition:
     29     def __init__(self,s,l):
     30         self.s = s
     31         self.l = l
     32 
     33 
     34 class StrReachablePosition:
     35     def __init__(self,parentNode,reachNode):
     36         self.parentNode = parentNode
     37         self.reachNode = reachNode
     38         self.f =999
     39         self.g =999
     40         self.h =999
     41         
     42         
     43         
     44 def findInQueue(closeMap,node):
     45      ikey = node.reachNode.l * numberOfS + node.reachNode.s
     46      if closeMap.get(ikey,0) == 0:
     47          return False
     48      return True
     49 
     50 
     51 def refreshMap(node,openList):
     52       ikey = node.reachNode.l * numberOfS + node.reachNode.s
     53       openList[ikey] = node
     54       return openList
     55       
     56 def updateNode(node,openList,closeMap):
     57     #print("updateNode-------------",node.reachNode.l,node.reachNode.s)
     58     ikey = node.reachNode.l * numberOfS + node.reachNode.s
     59     if openList.get(ikey,0) != 0:
     60         nodet = openList[ikey]
     61         if(nodet.g > node.g):
     62             openList[ikey] = node
     63     else:
     64          if findInQueue(closeMap,node) == False:
     65              openList[ikey] = node
     66     return copy.deepcopy(openList)
     67 
     68 def delMap(node,openList):
     69     ikey = node.reachNode.l * numberOfS + node.reachNode.s
     70     if openList.get(ikey,0) == 0  or ikey == 0:
     71         return openList
     72     del openList[ikey] 
     73     return openList
     74 
     75 
     76 def environmentShow(environment,startIndex,endIndex):
     77 
     78     shape = environment.shape
     79     row = shape[0]
     80     col= shape[1]
     81     for rowi in range(startIndex,endIndex):
     82         for coli in range(col):
     83           x = np.array([0,col-1])
     84           y = np.array([rowi,rowi])
     85           x1 = np.array([coli,coli])
     86           y1 = np.array([0,(row -1)])
     87           plt.plot(x,y,'b-')
     88           plt.plot(x1,y1,'b-')
     89           if environment[rowi][coli] >0.1:
     90               plt.plot(coli,rowi,'o','r')
     91 
     92 def createObstacle(environment,obstacle,startIndex,endIndex):
     93     
     94     eshape = environment.shape
     95     erow = eshape[0]
     96     ecol= eshape[1]
     97     
     98     oshape = obstacle.shape
     99     for orowi in  range(oshape[0]):
    100 
    101         start_l = math.floor( (obstacle[orowi][1]-obstacle[orowi][2]) / detaWidth) - startIndexOfL
    102         end_l = math.ceil((obstacle[orowi][1]+obstacle[orowi][2]) / detaWidth) + startIndexOfL
    103         
    104         start_s = math.floor(( obstacle[orowi][0] -obstacle[orowi][3])/detaLength)
    105         end_s = math.ceil(( obstacle[orowi][0] + obstacle[orowi][3])/detaLength)
    106         print("obstacle s range",start_s,end_s)
    107         for obsl_i in range(start_l,end_l+1):
    108             for obss_i in range(start_s,end_s+1):
    109                 if obsl_i>=0 and obsl_i < erow and obss_i >= 0 and obss_i< ecol:
    110                     environment[obsl_i][obss_i] = 1.0
    111                     
    112             
    113 def createStopPosition(x,startIndexaOfL,endIndexOfL):
    114     stopPosition = np.zeros((endIndexOfL - startIndexOfL,2))
    115     for index in range(endIndexOfL-startIndexaOfL):
    116         stopPosition[index][0] = x
    117         stopPosition[index][1] = index
    118     return stopPosition
    119 
    120 def getHCost(startPosition,endPosition):
    121     normal = math.hypot( (startPosition.s - endPosition.s)*detaLength,(startPosition.l -endPosition.l)*detaWidth)
    122     #lcost = (startPosition.l -endPosition.l)*detaWidth * (startPosition.l -endPosition.l)*detaWidth *0.2
    123     lcost =0
    124     return normal + lcost
    125 
    126 def getGCost(node,endPosition):
    127     return node.g + math.hypot((node.reachNode.s - endPosition.s)*detaLength,(node.reachNode.l -endPosition.l)*detaWidth)
    128 
    129 def getFCost(node):
    130     return node.g+node.h
    131 
    132 def reachPoints(openList,environment,lastNode,stopPosition,closeMap, startIndexOfL,endIndexOfL):
    133     print("reachPoints-------------")
    134     parentNode = lastNode.reachNode
    135     nexts = parentNode.s + 1
    136     reachNode = StrPosition(nexts,0)
    137     node = StrReachablePosition(parentNode,reachNode)
    138     
    139     shape = environment.shape
    140     node.parentNode = parentNode
    141     print("nexts,s of env",nexts , shape[1])
    142     if nexts < shape[1]:
    143         if parentNode.l + 1 <= endIndexOfL:
    144             if environment[parentNode.l + 1][nexts] < 0.1:
    145                 reachNode.l =parentNode.l +1
    146                 node.reachNode = reachNode
    147                 node.g = getGCost(lastNode,reachNode)
    148                 node.h = getHCost(reachNode,stopPosition)
    149                 node.f = getFCost(node)
    150                 openList = updateNode(node,openList,closeMap)
    151 
    152        
    153         if environment[parentNode.l][nexts] < 0.1:
    154             reachNode.l =parentNode.l
    155             node.reachNode = reachNode
    156             node.g = getGCost(lastNode,reachNode)
    157             node.h = getHCost(reachNode,stopPosition)
    158             node.f = getFCost(node)
    159             openList = updateNode(node,openList,closeMap)
    160             
    161         if parentNode.l -1 >= startIndexOfL:
    162             if environment[parentNode.l -1 ][nexts] < 0.1:
    163                 reachNode.l =parentNode.l -1
    164                 node.reachNode = reachNode
    165                 node.g = getGCost(lastNode,reachNode)
    166                 node.h = getHCost(reachNode,stopPosition)
    167                 node.f = getFCost(node)
    168                 openList = updateNode(node,openList,closeMap)
    169     return openList
    170     
    171 def freshCloseList(node,openList,closeList,closeMap):
    172     print("freshCloseList-------------")
    173     ikey = node.reachNode.l * numberOfS + node.reachNode.s
    174     closeList.put(node)
    175     closeMap[ikey] =node.parentNode.l * numberOfS + node.parentNode.s
    176     return delMap(node,openList),closeList,closeMap    
    177      
    178  
    179 def getMinFFromOpenList(openList):
    180     print("getMinFFromOpenList-------------")
    181     #find min node
    182     start = StrPosition(0,0)
    183     end = StrPosition(0,0)
    184     noden = StrReachablePosition(start,end)
    185     if  len(openList) == 0:
    186         return noden,False
    187     minf =999999 
    188     for nodet in openList.items():
    189         if minf >nodet[1].f:
    190             minf = nodet[1].f
    191             noden = nodet[1]
    192             
    193     print("min",minf,noden.reachNode.s,noden.reachNode.l)       
    194     return noden,True
    195  
    196 
    197 
    198 def AStart(environment,startPosition,stopPosition,startIndexOfL,endIndexOfL):
    199     print("AStart-------------")
    200 
    201     #put startnode to queue
    202     node = StrReachablePosition(startPosition,startPosition)
    203     node.g = 0
    204     node.h = getGCost(node,startPosition)
    205     node.f = getFCost(node)
    206     openList = dict()
    207     openList = refreshMap(node,openList)
    208     print("dict len",len(openList))
    209     print("reachPosition",node.reachNode.s,node.reachNode.l)
    210     time.sleep(1)
    211     closeList = queue.Queue()
    212     closeMap = dict()
    213    #search 
    214     while node.reachNode.s != stopPosition.s or  
    215         node.reachNode.l != stopPosition.l and len(openList)!=0:
    216         # update reachabe node 
    217         #print("node.reachNode.s,stopPosition.s,node.reachNode.l,stopPosition.l",node.reachNode.s,stopPosition.s,node.reachNode.l,stopPosition.l)
    218         openList = reachPoints(openList,environment,node,stopPosition,closeMap,startIndexOfL,endIndexOfL)
    219         #time.sleep(1)
    220         ##-------------
    221         for nodet  in openList.items():
    222             print("openlist",nodet[0],nodet[1].reachNode.s,nodet[1].reachNode.l,nodet[1].f)
    223         ##----------------
    224         node,flag = getMinFFromOpenList(openList)
    225         if flag == False:
    226             print("openlist null")
    227             return closeList,closeMap,False
    228         else:
    229            openList,closeList,closeMap = freshCloseList(node,openList,closeList,closeMap)
    230           ##-------------
    231         #print("closemaplen",len(closeMap))
    232         #for nodet2  in closeMap.items():
    233         #    print("closemap",nodet2[0],nodet2[1])
    234         ##----------------
    235              
    236         if node.reachNode.s == stopPosition.s and node.reachNode.l == stopPosition.l:
    237             return closeList,closeMap,True
    238     print("openlist null",len(openList))
    239     return closeList, closeMap,False     
    240    
    241 def showTrajack(closeMap,startPosition,stopPosition):
    242     startkey =  startPosition.l * numberOfS + startPosition.s
    243     endkey = stopPosition.l * numberOfS + stopPosition.s
    244     
    245     ikey = closeMap[endkey]
    246     slist = list()
    247     llist = list()
    248 
    249     slist.append(stopPosition.s)
    250     llist.append(stopPosition.l)
    251     while ikey != startkey:
    252         s =  np.int(ikey % numberOfS)
    253         l =  np.int((ikey - s) / numberOfS)
    254         ikey = closeMap[ikey]
    255         slist.append(s)
    256         llist.append(l)
    257     
    258     slist.append(startPosition.s)
    259     llist.append(startPosition.l)
    260     plt.plot(slist,llist,'*')
    261     
    262     
    263     
    264     
    265 def showCloseList(closeList):
    266     while not closeList.empty():
    267         node = closeList.get()
    268         plt.plot(node.reachNode.s,node.reachNode.l,'r*')
    269 
    270     
    271     
    272 
    273 if __name__ == '__main__':
    274 
    275     # vehicle to road region  of l 
    276     startIndexOfL = np.int(vehicleHarfWidth / detaWidth)
    277     endIndexOfL = numberOfL - np.int(vehicleHarfWidth / detaWidth)
    278      
    279     environment = np.zeros((numberOfL,numberOfS))
    280     createObstacle(environment,obstacle,startIndexOfL,endIndexOfL)
    281     environmentShow(environment,startIndexOfL,endIndexOfL)
    282     
    283     
    284 
    285     #simple end a*--------------------------------------------
    286     '''startPosition = StrPosition(0,9)
    287     stopPosition = StrPosition(8,7)
    288     closeList,closeMap,Flag = AStart(environment,startPosition,stopPosition,startIndexOfL,endIndexOfL)
    289     
    290     
    291     if Flag == True:
    292         showTrajack(closeMap,startPosition,stopPosition)
    293     else:
    294         print("no route-----------------")
    295         showCloseList(closeList)
    296     '''
    297     
    298     #multi end a*
    299     
    300     stopPosition = createStopPosition(numberOfS-1,startIndexOfL,endIndexOfL)  
    301     startPosition = StrPosition(0,9)
    302 
    303     shapeOfEnd = stopPosition.shape
    304     for i  in  range(0,shapeOfEnd[0]):
    305         stop = StrPosition(stopPosition[i][0],stopPosition[i][1])
    306         closeList,closeMap,Flag = AStart(environment,startPosition,stop,startIndexOfL,endIndexOfL)
    307         if Flag == True:
    308             showTrajack(closeMap,startPosition,stop)
    309         else:
    310             print("no route-----------------")
    311         #showCloseList(closeList)   
    312     
    313     
    314     
    315 
    316 
    317 
    318 
    319           
    320     
    321         
    322     






  • 相关阅读:
    [USACO15JAN]草鉴定Grass Cownoisseur (分层图,最长路,$Tarjan$)
    P1558 色板游戏 (线段树)
    [Vani有约会]雨天的尾巴 (线段树合并)
    UVA11806 Cheerleaders (容斥)
    [JSOI2007]建筑抢修 (贪心)
    [POI2015]KIN (线段树)
    [六省联考2017]组合数问题 (矩阵优化$dp$)
    [BZOJ2957] 楼房重建 (线段树,递归)
    [USACO Section 5.3]量取牛奶 Milk Measuring (动态规划,背包$dp$)
    P2647 最大收益 (动态规划)
  • 原文地址:https://www.cnblogs.com/kabe/p/12102050.html
Copyright © 2011-2022 走看看