2022-04-19:A*算法, 过程和Dijskra高度相处, 有到终点的预估函数, 只要预估值<=客观上最优距离,就是对的。 预估函数是一种吸引力: 1)合适的吸引力可以提升算法的速度; 2)吸引

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-04-19:A*算法, 过程和Dijskra高度相处, 有到终点的预估函数, 只要预估值<=客观上最优距离,就是对的。 预估函数是一种吸引力: 1)合适的吸引力可以提升算法的速度; 2)吸引相关的知识,希望对你有一定的参考价值。

2022-04-19:A*算法,
过程和Dijskra高度相处,
有到终点的预估函数,
只要预估值<=客观上最优距离,就是对的。
预估函数是一种吸引力:
1)合适的吸引力可以提升算法的速度;
2)吸引力“过强”会出现错误。

答案2022-04-19:

具体见代码。

代码用rust编写。代码如下:

use rand::Rng;
fn main() 
    let mut map: Vec<Vec<isize>> = vec![];
    for i in 0..10 
        map.push(vec![]);
        for j in 0..10 
            map[i].push(0);
        
    
    for i in 0..map.len() 
        for j in 0..map[0].len() 
            map[i][j] = rand::thread_rng().gen_range(1, 10);
        
    
    let startX: isize = 0;
    let startY: isize = 0;
    let targetX: isize = 4;
    let targetY: isize = 7;
    let ret: isize = min_distance2(&mut map, startX, startY, targetX, targetY);
    for i in 0..10 
        println!(":?", map[i]);
    
    println!("", ret);


const MAX_VALUE: isize = 9223372036854775807;

fn min_distance2(
    map: &mut Vec<Vec<isize>>,
    startX: isize,
    startY: isize,
    targetX: isize,
    targetY: isize,
) -> isize 
    if map[startX as usize][startY as usize] == 0 || map[targetX as usize][targetY as usize] == 0 
        return MAX_VALUE;
    
    let n = map.len() as isize;
    let m = map[0].len() as isize;
    let mut heap: Vec<Vec<isize>> = Vec::new();
    let mut closed: Vec<Vec<bool>> = Vec::new();
    for i in 0..n 
        closed.push(Vec::new());
        for j in 0..m 
            closed[i as usize].push(false);
        
    
    let mut t = vec![
        map[startX as usize][startY as usize],
        distance(startX, startY, targetX, targetY),
        startX,
        startY,
    ];
    heap.push(t);
    let mut ans = MAX_VALUE;
    while heap.len() > 0 
        //用切片模拟堆,所以需要排序
        heap.sort_by(|x, y| (x[0] + x[1]).cmp(&(y[0] + y[1])));

        // 报错
        // let mut cur: &Vec<isize> = &(heap[0]);
        // heap.remove(0);

        let mut fromDistance: isize = heap[0][0];
        let mut row: isize = heap[0][2];
        let mut col: isize = heap[0][3];
        heap.remove(0); //必须放在这里
        if (closed[row as usize][col as usize]) 
            continue;
        
        closed[row as usize][col as usize] = true;
        if (row == targetX && col == targetY) 
            ans = fromDistance;
            break;
        
        add2(
            fromDistance,
            row - 1,
            col,
            targetX,
            targetY,
            n,
            m,
            map,
            &mut closed,
            &mut heap,
        );
        add2(
            fromDistance,
            row + 1,
            col,
            targetX,
            targetY,
            n,
            m,
            map,
            &mut closed,
            &mut heap,
        );
        add2(
            fromDistance,
            row,
            col - 1,
            targetX,
            targetY,
            n,
            m,
            map,
            &mut closed,
            &mut heap,
        );
        add2(
            fromDistance,
            row,
            col + 1,
            targetX,
            targetY,
            n,
            m,
            map,
            &mut closed,
            &mut heap,
        );
    
    return ans;


fn add2(
    pre: isize,
    row: isize,
    col: isize,
    targetX: isize,
    targetY: isize,
    n: isize,
    m: isize,
    map: &mut Vec<Vec<isize>>,
    closed: &mut Vec<Vec<bool>>,
    heap: &mut Vec<Vec<isize>>,
) 
    if (row >= 0
        && row < n
        && col >= 0
        && col < m
        && map[row as usize][col as usize] != 0
        && !closed[row as usize][col as usize])
    
        let mut t = vec![
            pre + map[row as usize][col as usize],
            distance(row, col, targetX, targetY),
            row,
            col,
        ];
        heap.push(t);
    


// 曼哈顿距离
fn distance(curX: isize, curY: isize, targetX: isize, targetY: isize) -> isize 
    return abs(targetX - curX) + abs(targetY - curY);


fn abs(a: isize) -> isize 
    if a < 0 
        -a
     else 
        a
    


执行结果如下:


左神java代码

以上是关于2022-04-19:A*算法, 过程和Dijskra高度相处, 有到终点的预估函数, 只要预估值<=客观上最优距离,就是对的。 预估函数是一种吸引力: 1)合适的吸引力可以提升算法的速度; 2)吸引的主要内容,如果未能解决你的问题,请参考以下文章

本篇更完ESP 保姆级教程 疯狂传感器篇 —— 案例:ESP8266 + DHT11 + 巴法云平台(节点上报数据,包括全部源码)

深度优先搜索和广度优先搜索、A星算法三种算法的区别和联系?

深度优先搜索和广度优先搜索、A星算法三种算法的区别和联系?

带你整理面试过程中关于 JVM 的运行内存划分垃圾回收算法和 4种引用类型的相关知识点

问题记录ESP8266修改软件串口接收缓冲区大小

什么是RSA算法,有公钥和私钥对?他的处理过程是这样的?