Python的a+,python计算a+aa+aaa

  Python的a+,python计算a+aa+aaa

  说明

  1.A*算法是静态路网中求解最短路径最有效的直接搜索方法。

  2.A*算法是一种启发式算法,采用最佳优先搜索策略,根据评价函数对每个搜索位置的评价结果猜测最佳优先搜索位置。

  * A算法大大减少了低质量的搜索路径,因此搜索效率高,比传统的路径规划算法更具实时性和灵活性。而A*算法找到的是相对最优路径,而不是绝对最短路径,适合大规模、高实时性的问题。

  实例

  importheapq

  导入副本

  进口

  导入日期时间

  BLOCK=[]#给定状态

  目标=[]#目标状态

  #4方向

  方向=[[0,1],[0,-1],[1,0],[-1,0]]

  #打开表格

  OPEN=[]

  #节点总数

  总和节点数=0

  #状态节点

  classState(对象):

  def__init__(self,gn=0,hn=0,state=None,hash_value=None,par=None):

  初始化

  :paramgn:gn GN是从初始化到现在的距离

  :paramhn:启发式距离

  :paramstate:节点存储的状态

  3360 param hash _ value3360哈希值,用于确定权重

  :parampar:父节点指针

  self.gn=gn

  self.hn=hn

  self.fn=self.gn self.hn

  Self.child=[]#子节点

  Self.par=par#父节点

  Self.state=state#情境状态

  Self.hash _ value=散列值#散列值

  Def__lt__(self,other):#用于堆比较,返回最小距离

  不间断空格

  ;returnself.fn<other.fn

  

  def__eq__(self,other):#相等的判断

  returnself.hash_value==other.hash_value

  

  def__ne__(self,other):#不等的判断

  returnnotself.__eq__(other)

  

  

  defmanhattan_dis(cur_node,end_node):

  '''

  计算曼哈顿距离

  :paramcur_state:当前状态

  :return:到目的状态的曼哈顿距离

  '''

  cur_state=cur_node.state

  end_state=end_node.state

  dist=0

  N=len(cur_state)

  foriinrange(N):

  forjinrange(N):

  ifcur_state[i][j]==end_state[i][j]:

  continue

  num=cur_state[i][j]

  ifnum==0:

  x=N-1

  y=N-1

  else:

  x=num/N#理论横坐标

  y=num-N*x-1#理论的纵坐标

  dist+=(abs(x-i)+abs(y-j))

  

  returndist

  

  

  deftest_fn(cur_node,end_node):

  return0

  

  

  defgenerate_child(cur_node,end_node,hash_set,open_table,dis_fn):

  '''

  生成子节点函数

  :paramcur_node:当前节点

  :paramend_node:最终状态节点

  :paramhash_set:哈希表,用于判重

  :paramopen_table:OPEN表

  :paramdis_fn:距离函数

  :return:None

  '''

  ifcur_node==end_node:

  heapq.heappush(open_table,end_node)

  return

  num=len(cur_node.state)

  foriinrange(0,num):

  forjinrange(0,num):

  ifcur_node.state[i][j]!=0:

  continue

  fordindirection:#四个偏移方向

  x=i+d[0]

  y=j+d[1]

  ifx<0orx>=numory<0ory>=num:#越界了

  continue

  #记录扩展节点的个数

  globalSUM_NODE_NUM

  SUM_NODE_NUM+=1

  

  state=copy.deepcopy(cur_node.state)#复制父节点的状态

  state[i][j],state[x][y]=state[x][y],state[i][j]#交换位置

  h=hash(str(state))#哈希时要先转换成字符串

  ifhinhash_set:#重复了

  continue

  hash_set.add(h)#加入哈希表

  gn=cur_node.gn+1#已经走的距离函数

  hn=dis_fn(cur_node,end_node)#启发的距离函数

  node=State(gn,hn,state,h,cur_node)#新建节点

  cur_node.child.append(node)#加入到孩子队列

  heapq.heappush(open_table,node)#加入到堆中

  

  

  defprint_path(node):

  '''

  输出路径

  :paramnode:最终的节点

  :return:None

  '''

  num=node.gn

  

  defshow_block(block):

  print("---------------")

  forbinblock:

  print(b)

  

  stack=[]#模拟栈

  whilenode.parisnotNone:

  stack.append(node.state)

  node=node.par

  stack.append(node.state)

  whilelen(stack)!=0:

  t=stack.pop()

  show_block(t)

  returnnum

  

  

  defA_start(start,end,distance_fn,generate_child_fn,time_limit=10):

  '''

  A*算法

  :paramstart:起始状态

  :paramend:终止状态

  :paramdistance_fn:距离函数,可以使用自定义的

  :paramgenerate_child_fn:产生孩子节点的函数

  :paramtime_limit:时间限制,默认10秒

  :return:None

  '''

  root=State(0,0,start,hash(str(BLOCK)),None)#根节点

  end_state=State(0,0,end,hash(str(GOAL)),None)#最后的节点

  ifroot==end_state:

  print("start==end!")

  

  OPEN.append(root)

  heapq.heapify(OPEN)

  

  node_hash_set=set()#存储节点的哈希值

  node_hash_set.add(root.hash_value)

  start_time=datetime.datetime.now()

  whilelen(OPEN)!=0:

  top=heapq.heappop(OPEN)

  iftop==end_state:#结束后直接输出路径

  returnprint_path(top)

  #产生孩子节点,孩子节点加入OPEN表

  generate_child_fn(cur_node=top,end_node=end_state,hash_set=node_hash_set,

  open_table=OPEN,dis_fn=distance_fn)

  cur_time=datetime.datetime.now()

  #超时处理

  if(cur_time-start_time).seconds>time_limit:

  print("Timerunningout,break!")

  print("Numberofnodes:",SUM_NODE_NUM)

  return-1

  

  print("Noroad!")#没有路径

  return-1

  

  

  defread_block(block,line,N):

  '''

  读取一行数据作为原始状态

  :paramblock:原始状态

  :paramline:一行数据

  :paramN:数据的总数

  :return:None

  '''

  pattern=re.compile(r'\d+')#正则表达式提取数据

  res=re.findall(pattern,line)

  t=0

  tmp=[]

  foriinres:

  t+=1

  tmp.append(int(i))

  ift==N:

  t=0

  block.append(tmp)

  tmp=[]

  

  

  if__name__=='__main__':

  try:

  file=open("./infile.txt","r")

  exceptIOError:

  print("cannotopenfileinfile.txt!")

  exit(1)

  

  f=open("./infile.txt")

  NUMBER=int(f.readline()[-2])

  n=1

  foriinrange(NUMBER):

  l=[]

  forjinrange(NUMBER):

  l.append(n)

  n+=1

  GOAL.append(l)

  GOAL[NUMBER-1][NUMBER-1]=0

  

  forlineinf:#读取每一行数据

  OPEN=[]#这里别忘了清空

  BLOCK=[]

  read_block(BLOCK,line,NUMBER)

  SUM_NODE_NUM=0

  start_t=datetime.datetime.now()

  #这里添加5秒超时处理,可以根据实际情况选择启发函数

  length=A_start(BLOCK,GOAL,manhattan_dis,generate_child,time_limit=10)

  end_t=datetime.datetime.now()

  iflength!=-1:

  print("length=",length)

  print("time=",(end_t-start_t).total_seconds(),"s")

  print("Nodes=",SUM_NODE_NUM)以上就是python A*算法的介绍,希望对大家有所帮助。更多Python学习指路:python基础教程

  本文教程操作环境:windows7系统、Python 3.9.1,DELL G3电脑。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: