返回顶部
首页 > 资讯 > 后端开发 > Python >python中A*算法有什么用
  • 419
分享到

python中A*算法有什么用

2023-06-20 20:06:19 419人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

小编给大家分享一下python中A*算法有什么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!说明A*算法是静态路网中解决最短路径最有效的直接搜索方法。A*算法是启发式算法,采用最佳优先搜索策略(Best-first),基

小编给大家分享一下python中A*算法有什么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

说明

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

A*算法是启发式算法,采用最佳优先搜索策略(Best-first),基于评估函数对每个搜索位置的评估结果,猜测最佳优先搜索位置。

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

实例

import heapqimport copyimport reimport datetime BLOCK = []  # 给定状态GoAL = []  # 目标状态 # 4个方向direction = [[0, 1], [0, -1], [1, 0], [-1, 0]] # OPEN表OPEN = [] # 节点的总数SUM_node_NUM = 0  # 状态节点class State(object):    def __init__(self, gn=0, hn=0, state=None, hash_value=None, par=None):        '''        初始化        :param gn: gn是初始化到现在的距离        :param hn: 启发距离        :param state: 节点存储的状态        :param hash_value: 哈希值,用于判重        :param par: 父节点指针        '''        self.gn = gn        self.hn = hn        self.fn = self.gn + self.hn        self.child = []  # 孩子节点        self.par = par  # 父节点        self.state = state  # 局面状态        self.hash_value = hash_value  # 哈希值     def __lt__(self, other):  # 用于堆的比较,返回距离最小的        return self.fn < other.fn     def __eq__(self, other):  # 相等的判断        return self.hash_value == other.hash_value     def __ne__(self, other):  # 不等的判断        return not self.__eq__(other)  def manhattan_dis(cur_node, end_node):    '''    计算曼哈顿距离    :param cur_state: 当前状态    :return: 到目的状态的曼哈顿距离    '''    cur_state = cur_node.state    end_state = end_node.state    dist = 0    N = len(cur_state)    for i in range(N):        for j in range(N):            if cur_state[i][j] == end_state[i][j]:                continue            num = cur_state[i][j]            if num == 0:                x = N - 1                y = N - 1            else:                x = num / N  # 理论横坐标                y = num - N * x - 1  # 理论的纵坐标            dist += (abs(x - i) + abs(y - j))     return dist  def test_fn(cur_node, end_node):    return 0  def generate_child(cur_node, end_node, hash_set, open_table, dis_fn):    '''    生成子节点函数    :param cur_node:  当前节点    :param end_node:  最终状态节点    :param hash_set:  哈希表,用于判重    :param open_table: OPEN表    :param dis_fn: 距离函数    :return: None    '''    if cur_node == end_node:        heapq.heappush(open_table, end_node)        return    num = len(cur_node.state)    for i in range(0, num):        for j in range(0, num):            if cur_node.state[i][j] != 0:                continue            for d in direction:  # 四个偏移方向                x = i + d[0]                y = j + d[1]                if x < 0 or x >= num or y < 0 or y >= num:  # 越界了                    continue                # 记录扩展节点的个数                global SUM_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))  # 哈希时要先转换成字符串                if h in hash_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)  # 加入到堆中  def print_path(node):    '''    输出路径    :param node: 最终的节点    :return: None    '''    num = node.gn     def show_block(block):        print("---------------")        for b in block:            print(b)     stack = []  # 模拟栈    while node.par is not None:        stack.append(node.state)        node = node.par    stack.append(node.state)    while len(stack) != 0:        t = stack.pop()        show_block(t)    return num  def A_start(start, end, distance_fn, generate_child_fn, time_limit=10):    '''    A*算法    :param start: 起始状态    :param end: 终止状态    :param distance_fn: 距离函数,可以使用自定义的    :param generate_child_fn: 产生孩子节点的函数    :param time_limit: 时间限制,默认10秒    :return: None    '''    root = State(0, 0, start, hash(str(BLOCK)), None)  # 根节点    end_state = State(0, 0, end, hash(str(GOAL)), None)  # 最后的节点    if root == 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()    while len(OPEN) != 0:        top = heapq.heappop(OPEN)        if top == end_state:  # 结束后直接输出路径            return print_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("Time running out, break !")            print("Number of nodes:", SUM_NODE_NUM)            return -1     print("No road !")  # 没有路径    return -1  def read_block(block, line, N):    '''    读取一行数据作为原始状态    :param block: 原始状态    :param line: 一行数据    :param N: 数据的总数    :return: None    '''    pattern = re.compile(r'\d+')  # 正则表达式提取数据    res = re.findall(pattern, line)    t = 0    tmp = []    for i in res:        t += 1        tmp.append(int(i))        if t == N:            t = 0            block.append(tmp)            tmp = []  if __name__ == '__main__':    try:        file = open("./infile.txt", "r")    except IOError:        print("can not open file infile.txt !")        exit(1)     f = open("./infile.txt")    NUMBER = int(f.readline()[-2])    n = 1    for i in range(NUMBER):        l = []        for j in range(NUMBER):            l.append(n)            n += 1        GOAL.append(l)    GOAL[NUMBER - 1][NUMBER - 1] = 0     for line in f:  # 读取每一行数据        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()        if length != -1:            print("length =", length)            print("time = ", (end_t - start_t).total_seconds(), "s")            print("Nodes =", SUM_NODE_NUM)

看完了这篇文章,相信你对“Python中A*算法有什么用”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网Python频道,感谢各位的阅读!

--结束END--

本文标题: python中A*算法有什么用

本文链接: https://lsjlt.com/news/299990.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python中A*算法有什么用
    小编给大家分享一下python中A*算法有什么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!说明A*算法是静态路网中解决最短路径最有效的直接搜索方法。A*算法是启发式算法,采用最佳优先搜索策略(Best-first),基...
    99+
    2023-06-20
  • python中Floyd算法有什么用
    这篇文章主要介绍python中Floyd算法有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!说明Floyd算法又称插点法,利用动态规划思想解决有权图中多源点之间的最短路径问题。该算法从图片的带权邻接矩阵开始,在...
    99+
    2023-06-20
  • Python中Dijkstra算法有什么用
    小编给大家分享一下Python中Dijkstra算法有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!说明Dijkstra算法是经典的最短路径算法,它是数据结...
    99+
    2023-06-20
  • python中Bellman-Ford算法有什么用
    这篇文章将为大家详细讲解有关python中Bellman-Ford算法有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。说明Bellman-Ford算法是包含负权图的单源最短路径算法。算法原理是对图进...
    99+
    2023-06-20
  • Python 编程中最有用的算法是什么?
    Python 是一种广泛使用的编程语言,拥有丰富的库和工具,适用于各种任务。在 Python 编程中,最有用的算法是什么?本文将介绍 Python 编程中最常用的算法,并提供演示代码,帮助你更好地理解这些算法的实现和应用。 排序算法 ...
    99+
    2023-07-19
    编程算法 linux django
  • java中a++和++a有什么区别
    在Java中,a++和++a是一种增量运算符,都用于递增变量a的值。它们的区别在于:1. a++是后缀递增运算符,先使用a的当前值,...
    99+
    2023-10-12
    java
  • Python运算中a+=b和a=a+b相等吗
    这篇文章主要介绍“Python运算中a+=b和a=a+b相等吗”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python运算中a+=b和a=a+b相等吗”文章能帮助大家解决问题。如题,先上代码a+=...
    99+
    2023-07-05
  • Redis中的LRU算法有什么用
    这篇文章给大家分享的是有关Redis中的LRU算法有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Redis是基于内存存储的key-value...
    99+
    2024-04-02
  • python实现A*寻路算法
    目录A* 算法简介关键代码介绍保存基本信息的地图类搜索到的节点类算法主函数介绍代码的初始化完整代码A* 算法简介 A* 算法需要维护两个数据结构:OPEN 集和 CLOSED 集。OPEN 集包含所有已搜索到的待检测...
    99+
    2022-06-02
    python A*寻路算法 python A*算法
  • Python中GC算法的作用是什么
    Python中GC算法的作用是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问题,...
    99+
    2023-06-14
  • HTML中<a>标签有什么用
    小编给大家分享一下HTML中<a>标签有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 实例 标签定义及使...
    99+
    2024-04-02
  • python中getattribute方法有什么用
    这篇文章主要介绍了python中getattribute方法有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Python的优点有哪些1、简单易用,与C/C++、Java...
    99+
    2023-06-14
  • python中filter()方法有什么用
    这篇文章主要为大家展示了“python中filter()方法有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python中filter()方法有什么用”这篇文章吧。filter()方法(过...
    99+
    2023-06-17
  • python中map()方法有什么用
    小编给大家分享一下python中map()方法有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!map()方法:map() 会根据提供的函数对指定序列做映射。...
    99+
    2023-06-17
  • python中reduce()方法有什么用
    这篇文章主要为大家展示了“python中reduce()方法有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python中reduce()方法有什么用”这篇文章吧。reduce()方法:r...
    99+
    2023-06-17
  • python中isidentifier()方法有什么用
    这篇文章给大家分享的是有关python中isidentifier()方法有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、说明用于判断字符串是否是有效的Python标识符,还可以用来判断变量名是否合法。如...
    99+
    2023-06-15
  • Python中__new__方法有什么用
    这篇文章主要为大家展示了“Python中__new__方法有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python中__new__方法有什么用”这篇文章吧。一、__new__方法简介接...
    99+
    2023-06-29
  • python中append()方法有什么用
    在Python中,append()方法用于在列表的末尾追加一个新的元素。通过调用该方法,可以将一个新的元素添加到列表最后,从而扩展列...
    99+
    2024-03-06
    python
  • python中什么是递归算法
    本篇文章为大家展示了python中什么是递归算法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前端开发,众多大型网站均...
    99+
    2023-06-14
  • python中K-NN算法的作用是什么
    这期内容当中小编将会给大家带来有关python中K-NN算法的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python有哪些常用库python常用的库:1.requesuts;2.scrapy...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作