你必须会的启发式搜索算法--A*算法

知识点二十五:启发式搜索算法——A*算法 前言 魔兽世界、仙剑奇侠传这类 MMRPG(Multiplayer Online Role-PlayingGame) 游戏中,有一个非常重要的功能,那就是人物角色的自动寻路。当人物处于游戏地图中的某个位置的时候,我们用鼠标点击另外一个相对较远的位置,人物就会自动地绕过障碍物走过去。这个功能是怎么实现的呢? 路径搜索问题 实际上,这是一个非常典型的路径搜索问题。人物的起点就是他当下所在的位置,终点就... 阅读详情

一.算法原理

A* 算法,就是解决在一个平面 grid地图中寻找起点到终点的最短路径问题的算法,类似于Dijkstra算法和BFS算法一样,属于广度优先搜索。实际上它还是一个启发式搜索算法,什么叫启发式搜索算法?不同于BFS和DFS在子节点选择上其实是盲目的,启发式搜索就是利用评估函数在平面中对所有的待搜索点进行评估,找出最佳的搜索点问题。那么A* 算法是如何利用这些思想的呢?

1.评估函数

对于地图中的每一个点,都有一个评估标准值F,评估函数为:F= G+H

而G表示的是从起点到现在所在方格的总代价,计算G我们通常采用搜索树的深度,及此节点的上一个节点G+1来计算,源点本身G=0;

H代表着从当前点到目的地点的预计代价,计算H我们通常采用“曼哈端距离算法”(译注:Manhattan distance method),这个算法仅仅只是计算了当前点到终点的水平方向和竖直方向上的方格数,而没有将障碍物或不同地形考虑进来。 如果你在游戏中采用此算法,则需要注意将地形的情况考虑到H的计算之中,假设是在grid地图中,目的地坐标(4,4),当前坐标(0,0),当前坐标的 H = 8 H=8 H=8

2.待测点与已测点的存储

我们使用closeList(闭表)来储存那些我们被探测过的点和障碍点,当我们的终点被加入closeList中的时候,意味着我们已经得到最短路径,我们停止扩散搜索。
我们使用openList(开表)来记录我们的待测点,我们通常将当前点A的上下左右(其他的斜角方向是否考虑在内处于你的要求)中的那些没有被搜索过且不为障碍点的节点加入到openList中,同时设置这些点的parent引用指向当前节点A,用于记录路径,便于最后输出路径,并设置他们的F= H + G,H根据此节点的实际情况进行计算,G取当前节点A的G再加1,如果这些点中有的已经加入到openList中,我们将他的F值与根据节点A计算的F进行比较,如果新计算的评估值F小,我们就更新那个节点的F值。每次从开表中选择评估值F最小的点,使每一次的搜索点为最优点。

伪代码:

closeList:= set contains barriers nodes at the beginning
openList:= set contains the source node at the beginning

while(!openList isEmpty())
	node = get_node_with_minF(openList)
	if(node == end_node)
		getPathTo(end_node)
		break
	for(each neighbor node的相邻节点)
		//如果相邻节点在闭表中,直接跳过
		if(neighbor in closeList)
			continue
		//计算相邻节点的H和G
		int G = node.G + 1
		int H = calcuH_from_neighbor_to_end(neighbor, end)
		//已在开表中,需要更新
		if(neighbor in openList)
			if(neighbor.F > G + H)
				neighbor.F = G+H
				neighbor.parent = node
		else
			neighbor.F = G+H
			neighbor.parent = node
			openList.add(neighbor)
	openList.remove(node)
	closeList.add(node)

二.算法实现

package com.example.astar;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * @author 玄木.
 */
public class AStar {

    private Node source;
    private Node end;
    private List<Node> openList;
    private List<Node> closeList;
    /**
     *
     * @param map 0:for source node, 1:for nothing, 2:for barriers, 3:for end node, 4:for path
     * @return the path from source to end
     * @throws NotFoundException
     */
    public void aStar(int[][] map) throws NotFoundException{
        //异常处理
        if(map.length==0||map[0].length==0){
            throw new NotFoundException("parameters invalid");
        }
        init(map);
        while(!openList.isEmpty()){
            Node node = getNodeWithMinF(openList);
            if(node.equals(end)){
                for(Node tmp : getPathTo(node)){
                    map[tmp.y][tmp.x] = 4;
                }
                printMap(map);
                return;
            }
            for(Node neighbor : getNeighbors(node, map)){
                if (closeList.contains(neighbor)){
                    continue;
                }
                int G = node.getG() + 1;
                int H = calcuH(neighbor, end);
                if(openList.contains(neighbor)) {
                    if (neighbor.getF() > G + H) {
                        neighbor.setG(G);
                        neighbor.setH(H);
                        neighbor.setF(G + H);
                        neighbor.setParent(node);
                    }
                }
                else{
                    neighbor.setG(G);
                    neighbor.setH(H);
                    neighbor.setF(G + H);
                    neighbor.setParent(node);
                    openList.add(neighbor);
                }
            }
            openList.remove(node);
            closeList.add(node);
        }
        throw new NotFoundException("not found");
    }

    /**
     * init the openList,closeList,source,end node
     * @param map
     */
    public void init(int[][] map){
        openList = new ArrayList<Node>();
        closeList = new ArrayList<Node>();
        for(int row=0;row<map.length;row++){
            for(int column=0;column<map[0].length;column++){
                //add the barriers nodes to the closeList
                if(map[row][column]==2){
                    closeList.add(new Node(column, row));
                }
                else if(map[row][column]==1){
                    source = new Node(column, row);
                }
                else if(map[row][column]==3){
                    end = new Node(column, row);
                }
            }
        }
        source.setG(0);
        source.setH(calcuH(source, end));
        source.setF(source.getG()+source.getH());
        openList.add(source);
    }


    /**
     * return the path from source node to end node
     * @param end
     * @return
     */
    public List<Node> getPathTo(Node end){
        List<Node> pathTo = new ArrayList<Node>();
        Node temp = end;
        while(temp!=null){
            pathTo.add(temp);
            temp = temp.parent;
        }
        Collections.reverse(pathTo);
        return pathTo;
    }

    /**
     * get neighbors of node
     * @param node
     * @param map
     * @return
     */
    public List<Node> getNeighbors(Node node, int[][] map){
        List<Node> list = new ArrayList<Node>();
        if(node.x>0 && node.x<map[0].length-1){
            list.add(new Node(node.x-1,node.y));
            list.add(new Node(node.x+1,node.y));
        }
        else if(node.x == 0){
            list.add(new Node(node.x+1,node.y));
        }
        else{
            list.add(new Node(node.x-1,node.y));
        }
        if(node.y>0 && node.y<map.length-1){
            list.add(new Node(node.x,node.y+1));
            list.add(new Node(node.x,node.y-1));
        }
        else if(node.y == 0){
            list.add(new Node(node.x,node.y+1));
        }
        else{
            list.add(new Node(node.x,node.y-1));
        }
        return list;
    }

    /**
     * calculate H
     * @param node
     * @param end
     * @return
     */
    public int calcuH(Node node, Node end){
        return Math.abs(node.x-end.x)+Math.abs(node.y-end.y);
    }

    /**
     * get the node with minimum F in openList
     * @param list
     * @return
     */
    public Node getNodeWithMinF(List<Node> list){
        Collections.sort(list, Comparator.comparingInt(o -> o.F));
        return list.get(0);
    }

    /**
     * print the map
     * @param map
     */
    public void printMap(int[][] map){
        int row=0,column=0;
        for(row=0;row<map.length;row++){
            for (column=0;column<map[0].length;column++){
                switch (map[row][column]){
                    case 0:
                        System.out.print("[]");
                        break;
                    case 2:
                        System.out.print("##");
                        break;
                    case 1:
                    case 3:
                        System.out.print("@@");
                        break;
                    case 4:
                        System.out.print("->");
                        break;
                    default:break;
                }
            }
            System.out.println();
        }
        System.out.println();
    }


    /**
     * static inner class Node
     */
    public static class Node{
        private int x;
        private int y;
        private int G;
        private int H;
        private int F;
        private Node parent;

        public Node(int x, int y){
            this.x = x;
            this.y = y;
            this.G = 0;
            this.H = 0;
            this.F = Integer.MAX_VALUE;
            this.parent = null;
        }


        @Override
        public boolean equals(Object obj) {
            if(obj instanceof Node){
                Node other = (Node)obj;
                return other.x==this.x && other.y==this.y;
            }
            return false;
        }

        public int getG() {
            return G;
        }

        public void setG(int g) {
            G = g;
        }

        public int getH() {
            return H;
        }

        public void setH(int h) {
            H = h;
        }

        public int getF() {
            return F;
        }

        public void setF(int f) {
            F = f;
        }

        public Node getParent() {
            return parent;
        }

        public void setParent(Node parent) {
            this.parent = parent;
        }
    }

    /**
     * static inner Exception class
     */
    public static class NotFoundException extends Exception{
        public NotFoundException(String mess) {
            super(mess);
        }
    }
}

三.实验测试

1. 基础测试

    @Test
    public void aStarTest(){
        int[][] map = {
                {0, 0, 0, 0, 0, 0, 2, 0, 0, 0},
                {1, 0, 0, 0, 0, 0, 2, 0, 0, 0},
                {0, 0, 0, 0, 0, 2, 2, 0, 0, 0},
                {0, 0, 2, 0, 2, 2, 2, 0, 0, 0},
                {0, 0, 0, 0, 0, 2, 2, 0, 0, 0},
                {0, 0, 2, 0, 0, 2, 0, 0, 0, 0},
                {0, 0, 2, 0, 0, 2, 0, 0, 0, 0},
                {0, 0, 2, 0, 0, 2, 0, 0, 0, 0},
                {0, 0, 2, 0, 2, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 2, 0, 0, 3},
        };
        try {
            aStar.printMap(map);
            aStar.aStar(map);
        }catch (AStar.NotFoundException e){
            e.printStackTrace();
        }
    }

[]表示可以行走的空地
##表示障碍
->表示路径
@ 表示起点和终点

实验结果

测试通过

2.异常测试

    @Test
    public void aStarTest(){
        int[][] map = {
                {0, 0, 0, 0, 0, 0, 2, 0, 0, 0},
                {1, 0, 0, 0, 0, 0, 2, 0, 0, 0},
                {0, 0, 0, 0, 0, 2, 2, 0, 0, 0},
                {0, 0, 0, 0, 0, 2, 2, 0, 0, 0},
                {0, 0, 0, 0, 0, 2, 2, 0, 0, 0},
                {0, 0, 2, 0, 0, 2, 0, 0, 0, 0},
                {0, 0, 2, 0, 0, 2, 0, 0, 0, 0},
                {0, 0, 2, 0, 0, 2, 0, 0, 0, 0},
                {0, 0, 2, 0, 0, 0, 2, 0, 0, 0},
                {0, 0, 0, 0, 0, 0, 2, 0, 0, 3},
        };
        try {
            aStar.printMap(map);
            aStar.aStar(map);
        }catch (AStar.NotFoundException e){
            e.printStackTrace();
        }
    }

实验结果

测试通过


你可能还敢兴趣的图论算法(均附Java实现代码):

启发式搜索算法:A算法(全局、局部择优算法)+A*算法 解决八数码问题 文章目录1.A 算法1.1.全局择优算法1.1.1.求解八数码1.2.局部择优算法2.A*算法2.1 解决八数码难题 参考博客:人工智能搜索策略:A*算法 1.A 算法 在图搜索算法中,如果能在搜索的每一步都利用估价函数f(n)=g(n)+h(n)对Open表中的节点进行排序,则该搜索算法为A算法。由于估价函数中带有问题自身的启发性信息,因此,A算法又称为启发式搜索算法。 对启发式搜索算法,又可根据搜索过程中选择扩展节点的范围,将其分为全局择优搜索算法和局部择优搜索算法。 ` 1.1.全局择优算法 在全 阅读详情

相关推荐

图搜索的经典启发式算法A星(A*、A Star)算法详解

从广度优先搜索算法开始介绍,扩展地介绍到 A* 算法,并对比分析了几种方法之间的特点

Linshaodan520的博客 3230

启发式搜索: A*算法

启发式搜索: A*算法

qq_46118239的博客 1886

算法提升:图的启发式搜索算法(A算法、A*算法)

算法提升:图的启发式搜索算法(A算法、A*算法)

阿呆的隐秘角落 3946

启发式搜索(Informed Search)-贪婪算法GBS+A*算法

目录 写在前面 一、启发式搜索和启发式函数 二、贪婪算法(贪婪最佳优先搜索)greedy best-first search (GBS) 三、A*搜索(结合UCS和GBS) A*搜索算法结束的条件是什么? ​怎么判证明A* 树搜索的最优性?(这个容易出证明题) 四、怎么选择一个好的启发式函数 ​ 写在前面 我们之前几篇博客都是在讨论无信息搜索,包括深度优先...

敲代码的乔帮主 1万+

【第31话:路径规划】自动驾驶启发式搜索算法(A星搜索算法( A* 搜索算法))详解及代码举例说明

本文详细介绍了自动驾驶系统中启发式搜索算法(以A算法为例)的原理与应用。文章首先阐述了启发式搜索的基础概念,包括代价函数、启发式函数及其在自动驾驶路径规划中的重要性。接着重点解析A算法的运作机制,强调其通过优先队列和启发式函数实现高效搜索的特点。文章还提供了A*算法的Python实现示例,展示了其在网格地图中的实际应用。最后,作者探讨了算法在自动驾驶中的优化方向,如动态环境处理和启发式设计改进,并指出未来可能的发展趋势,包括与机器学习结合和硬件加速等。全文兼顾理论与实操,为自动驾驶路径规划提供了清晰的技术指

一碗白开水一 1290

3、启发式有序搜索算法:A*及其变体详解

本文详细介绍了启发式有序搜索算法A*及其多种变体,包括MA*、BHPA、BHFFA和IDA*等,分析了它们在不同条件下的可采纳性、最优性及空间时间性能。文章重点探讨了A*算法的终止条件与最短路径保证,比较了不同启发式函数的信息性与单调性对搜索效率的影响,并阐述了各类改进算法的设计思想与适用场景。通过在(n²-1)谜题上的实验数据对比,展示了各算法在实际应用中的表现差异。最后,文章展望了启发式搜索算法在并行计算、深度学习融合与自适应机制方面的未来发展趋势,为解决大规模搜索问题提供了系统性的理论支持与实践指导。

rice5的博客 188

再探a*搜索算法(启发式函数的影响)

Dijkstra算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径。它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),优先从未遍历的节点集合中选取距离最近的那个节点遍历,然后再更新与该节点有关的接待你的距离,直到扩展到终点为止。条件是每条边的权值不能为负数。但是在某种情形中,和广度优先搜索一样,需要耗费更多的时间。如下图,红色为开始节点,蓝色为结束节点。

qq_36489998的博客 3643

优化搜索算法:A*与启发式函数的威力

本文深入探讨了8数码问题的解决方法,通过对比不同的搜索算法和启发式函数,揭示了A*搜索算法和GoodEvaluator等启发式函数如何高效找到最优解。文章分析了搜索树算法的效率,强调了合适启发式函数的重要性,并探讨了A*搜索在面临复杂状态时可能遇到的内存限制问题。

weixin_31620365的博客 428

A*启发式搜索算法详解 人工智能

A*启发式搜索算法详解 人工智能 转自:http://dev.gameres.com/Program/Abstract/Arithmetic/AmitAStar.mht 我们尝试解决的问题是把一个游戏对象(game object)从出发点移动到目的地。路径搜索(Pathfinding)的目标是找到一条好的路径——避免障碍物、敌人,并把代价(燃料,时间,距离,装备,金钱等)最小化。运动(Movement)的目标是找到一条路径并且沿着它行进。把关注的焦点仅集中于其中的一种方法是可能的。一种极端

Free Loop~~~跳动的恒星 9849

MATLAB仿真实现A*启发式搜索算法的详细指南

A*算法是计算机科学中一种广泛使用的路径查找和图遍历算法,它结合了最好优先搜索和迪杰斯特拉算法的优点,能够高效地找到问题的最优解。这种算法的核心在于其利用启发式函数(h(n))评估每个节点的优先级,指导搜索过程,使得算法在巨大的搜索空间中能以较小的代价找到近似最佳路径。作为启发式搜索算法,A*是评估节点成本与估计到目标的距离的最佳实践。成本函数g(n)表示从起点到当前节点n的实际代价,而启发式函数h(n)则估计从节点n到目标点的最小代价。

weixin_35899324的博客 978

从零开始搭建Proxmox VE虚拟化网络:手把手教你配置桥接、VLAN和链路聚合

本文详细介绍了如何在Proxmox VE虚拟化环境中配置桥接、VLAN和链路聚合网络。通过分步指南和实战案例,帮助用户掌握Linux Bridge、VLAN隔离和Bonding技术,构建高性能、高可用的企业级虚拟化网络架构。

wind6的博客 977

启发式搜索算法之贪婪最佳优先搜索算法和A*算法

** 启发式搜索算法之贪婪最佳优先搜索算法和A*算法** 启发式搜索又称为有信息搜索,是相对于广度优先搜索和深度优先搜素这类无信息搜索的搜索算法。该类算法是基于能够获得辅助算法的额外信息进行运算,这些信息称为启发信息。其中启发式搜索中最具代表性的就是贪婪最佳优先算法和A*算法。 启发式搜索算法满足三个条件: 1.具有启发函数:估计结点n距离达到目标还需要多少代价。在求最短路径的问题中,该函数为以相同的速度到达两个城市间的时间代价。 2.具有评价函数: **A算法,A(A-Star)算法是一种静态路网中求解

qq_44250808的博客 6539

蚁群算法(Ant Colony Optimization,ACO)讲解+代码实现

通常情况下,较优的解对应的路径上的信息素会被加强,而较差解对应的信息素则会减少或蒸发。的化学物质,这种物质会在蚂蚁走过的路径上留下痕迹,后续的蚂蚁会根据这些信息素的浓度来选择路径,从而形成一条从蚁巢到食物源的。在求解TSP蚁群算法中,每只蚂蚁相互独立,用于构造不同的路线,蚂蚁之间通过信息素进行交流,合作求解。的过程,该路段经过的蚂蚁越多,信息素留下的就越多,浓度越高,更多的蚂蚁都会选择这个路段。需要注意的是,蚁群算法是一种。(6)计算每只蚂蚁的总距离:遍历每只蚂蚁的路线,累加经过的城市之间的距离。

m0_73804764的博客 1万+

人工智能实验四:A*搜索求解8数码问题(启发式搜索算法)

该问题是将与空格相连的数字移动到空格的位置上,也就相当于将空格移动到与之相连的位置,因此,以空格为当前结点,扩展结点可能为上下左右四个相连的位置,若使用一般的搜索算法,可能陷入无限搜索中,永远搜不到目标解,而 A* 搜索算法则能非常好的将搜索过程导向求解目标。所以,要寻找最小代价的解,首先扩展的是g(n)+h(n)值最小的结点。A* 搜索(A 星搜索)是最广为人知的最佳优先搜索,它对结点n的代价评估结合了g(n),即到达此结点n已经花费的路径代价,和h(n),即从该结点n到目标结点所花代价。

落灬枫的博客 9901

时空图神经网络实战:T-GCN在交通流量预测中的深度解析

本文深度解析了时空图神经网络T-GCN在交通流量预测中的实战应用。通过结合图卷积网络(GCN)和门控循环单元(GRU),T-GCN有效捕捉交通数据的时空依赖性,相比传统方法降低30%以上预测误差。文章详细介绍了T-GCN的核心技术、工程实践和优化策略,为智能交通系统提供有力工具。

weixin_29038537的博客 267

RPA实战-UiPath自动化处理Outlook邮件附件全流程解析

本文详细解析了如何使用UiPath实现Outlook邮件附件的自动化处理全流程,涵盖环境配置、核心流程实现、高级功能扩展及性能优化技巧。通过RPA技术,企业可大幅提升邮件附件处理效率,减少人工操作错误,适用于财务、物流等多个场景。

weixin_33701251的博客 427

深度优先算法,广度优先算法,hill climbing,贪心搜索,A*算法,启发式搜索算法是什么,比起一般搜索法算法有什么区别

A算法通过维护一个优先队列(通常是最小堆),并根据启发式函数(如g(n) + h(n),其中g(n)是从起点到当前点的实际距离,h(n)是从当前点到目标点的估计距离)来评估节点的优先级。它从图的某个顶点V0开始,依次访问V0的各个未被访问过的邻接点,然后从这些邻接点出发,再依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到。它从当前的节点开始,和周围的邻居节点的值进行比较,如果当前节点不是最大的,就用最高的邻居节点来替换当前节点,从而实现向“山峰”的高处攀爬的目的。

mimo_mimo的博客 1889

苍穹外卖项目面试总结话术

美食速递这个项目最初是我参与制作的大创项目,是一款为中南学生提供校园外卖送至宿舍服务的软件,包含系统管理后台和小程序端两部分。其中系统管理后台主要提供给食堂内部员工使用,可以对食堂各个窗口、员工、订单、菜品等进行维护管理;小程序端可以在线浏览菜品、添加购物车、下单等,由学生兼职做跑腿送餐上门服务。这是个前后端分离的项目,我主要是负责后端的用户登录、员工管理,菜品管理,订单管理模块的编码实现。

qq_45195447的博客 1万+

A*启发式搜索算法

A* 算法

jyyyyx的算法之旅 3921

面向可扩展的 ABAP CDS:EXTEND VIEW 全面实战与工程化指引

摘要: 本文深入讲解ABAP CDS的EXTEND VIEW功能,帮助开发者在标准或自建模型上安全扩展字段与关联。核心内容包括: 作用:避免直接修改标准CDS,通过轻量扩展添加业务字段和关联,降低维护风险。 语法要点:需定义CDS扩展实体名和Dictionary Append View名,支持添加普通字段、关联,但不允许聚合或修改原有结构。 限制:不能扩展含聚合、UNION的视图,且扩展字段需避免命名冲突。 工程实践:建议使用客户命名空间,区分结构扩展与元数据扩展,并注意功能性变更需通过其他方式实现。 示例

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 394

提示词工程中的上下文隔离

已经进入context的prompt是没有办法让大模型真正的忘记的,但是可以通过prompt技巧强约束模型的后续推理中“不再使用、不再提及、不再引用”某部分提示词,这其实是一种行为抑制(behavior suppression),并不是删除。

Criss@陈磊 234

N数码问题的启发式搜索算法--A*算法python实现

一、启发式搜索:A算法 1)评价函数的一般形式 : f(n) = g(n) + h(n) g(n):从S0到Sn的实际代价(搜索的横向因子) h(n):从N到目标节点的估计代价,称为启发函数(搜索的纵向因子); 特点: 效率高, 无回溯, 搜索算法 OPEN表 : 存放待扩展的节点. CLOSED表 : 存放已被扩展过的节点. 2)评价函数 f(x) = g(x) +...

weixin_30693683的博客 994

rk3568 修改开机动画

bootanimation.zip是一个Android设备启动时播放的动画文件,它包含了一系列的图片和描述文件,用于描述动画的播放顺序和持续时间。

weixin_35723192的博客 2727

【HDU 1043】Eight(A*启发式搜索算法)

DescriptionThe 15-puzzle has been around for over 100 years; even if you don’t know it by that name, you’ve seen it. It is constructed with 15 sliding tiles, each with a number from 1 to 15 on it, and

Ice_Confuse 1743

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

启发式搜索算法2 - A*算法

最佳优先搜索算法的效果非常依赖估价函数,而估价函数又不是这么容易设置,那么能不能折中一下,添加其他确定性参数来平衡这个估价函数的不确定性,这就是A*算法

linkedin_21843693的博客 1202

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

python查找算法例题_N数码问题的启发式搜索算法--A*算法python实现

一、启发式搜索:A算法1)评价函数的一般形式 : f(n) = g(n) + h(n)g(n):从S0到Sn的实际代价(搜索的横向因子)h(n):从N到目标节点的估计代价,称为启发函数(搜索的纵向因子);特点: 效率高, 无回溯,搜索算法OPEN表 : 存放待扩展的节点.CLOSED表 : 存放已被扩展过的节点.2)评价函数 f(x) = g(x) + h(x)当f(x) = g(x) 时,...

weixin_36011546的博客 1710
上一篇: JMM内存模型如何为并发保驾护航
下一篇: 经典常用算法/常用算法思维---附伪代码以及实现
Hack Rabbit
Hack Rabbit 新星创作者: 运维技术领域 新星创作者: 运维技术领域
博客等级 码龄9年 2893粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hack Rabbit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值