我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python中A*算法有什么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python中A*算法有什么用

小编给大家分享一下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*算法有什么用”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python中A*算法有什么用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python中A*算法有什么用

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

python中Floyd算法有什么用

这篇文章主要介绍python中Floyd算法有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!说明1、Floyd算法又称插点法,利用动态规划思想解决有权图中多源点之间的最短路径问题。该算法从图片的带权邻接矩阵开始
2023-06-20

Python中Dijkstra算法有什么用

小编给大家分享一下Python中Dijkstra算法有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!说明1、Dijkstra算法是经典的最短路径算法,它是数
2023-06-20

python中Bellman-Ford算法有什么用

这篇文章将为大家详细讲解有关python中Bellman-Ford算法有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。说明1、Bellman-Ford算法是包含负权图的单源最短路径算法。算法原理是对
2023-06-20

java中a++和++a有什么区别

在Java中,a++和++a是一种增量运算符,都用于递增变量a的值。它们的区别在于:1. a++是后缀递增运算符,先使用a的当前值,然后再将a的值递增1。例如:```javaint a = 5;int b = a++; // b的值为5,a
2023-10-12

Python中GC算法的作用是什么

Python中GC算法的作用是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问题,
2023-06-14

python中map()方法有什么用

小编给大家分享一下python中map()方法有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!map()方法:map() 会根据提供的函数对指定序列做映射。
2023-06-17

python中reduce()方法有什么用

这篇文章主要为大家展示了“python中reduce()方法有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python中reduce()方法有什么用”这篇文章吧。reduce()方法:r
2023-06-17

Python中__new__方法有什么用

这篇文章主要为大家展示了“Python中__new__方法有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python中__new__方法有什么用”这篇文章吧。一、__new__方法简介接
2023-06-29

python中isidentifier()方法有什么用

这篇文章给大家分享的是有关python中isidentifier()方法有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、说明用于判断字符串是否是有效的Python标识符,还可以用来判断变量名是否合法。如
2023-06-15

python中append()方法有什么用

在Python中,append()方法用于在列表的末尾追加一个新的元素。通过调用该方法,可以将一个新的元素添加到列表最后,从而扩展列表的长度。例如:my_list = [1, 2, 3]my_list.append(4)print(m
python中append()方法有什么用
2024-03-06

python中filter()方法有什么用

这篇文章主要为大家展示了“python中filter()方法有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python中filter()方法有什么用”这篇文章吧。filter()方法(过
2023-06-17

python中getattribute方法有什么用

这篇文章主要介绍了python中getattribute方法有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Python的优点有哪些1、简单易用,与C/C++、Java
2023-06-14

python中K-NN算法的作用是什么

这期内容当中小编将会给大家带来有关python中K-NN算法的作用是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。python有哪些常用库python常用的库:1.requesuts;2.scrapy
2023-06-14

python中什么是递归算法

本篇文章为大家展示了python中什么是递归算法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前端开发,众多大型网站均
2023-06-14

Python中__new__方法有什么作用

本篇内容介绍了“Python中__new__方法有什么作用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、__new__方法简介接下来通过
2023-07-06

Python中Pandas方法有什么作用

本篇内容介绍了“Python中Pandas方法有什么作用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!pandas.cut(x, bins,
2023-06-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录