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
}
}
执行结果如下:

2022-04-19:A*算法, 过程和Dijskra高度相处, 有到终点的预估函数, 只要预估值<=客观上最优距离,就是对的。 预估函数是一种吸引力: 1)合适的吸引力可以提升算法的速度; 2)吸引的更多相关文章
- 【2022.04.19】Docker-compose一键安装mirai,搭建QQ机器人最快方法
先用官方的脚本安装下docker curl -sSL https://get.docker.com/ | sh 安装docker-compose curl -L "https://githu ...
- Adaboost提升算法从原理到实践
1.基本思想: 综合某些专家的判断,往往要比一个专家单独的判断要好.在"强可学习"和"弱科学习"的概念上来说就是我们通过对多个弱可学习的算法进行"组合 ...
- [机器学习]-Adaboost提升算法从原理到实践
1.基本思想: 综合某些专家的判断,往往要比一个专家单独的判断要好.在”强可学习”和”弱可学习”的概念上来说就是我们通过对多个弱可学习的算法进行”组合提升或者说是强化”得到一个性能赶超强可学习算法的算 ...
- 牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类
不多说,直接上干货! 首先,大家要搞清楚,java里的内存是怎么分配的.详细见 牛客网Java刷题知识点之内存的划分(寄存器.本地方法区.方法区.栈内存和堆内存) 哪些内存需要回收 其实,一般是对堆内 ...
- 机器学习第5周--炼数成金-----决策树,组合提升算法,bagging和adaboost,随机森林。
决策树decision tree 什么是决策树输入:学习集输出:分类觃则(决策树) 决策树算法概述 70年代后期至80年代初期,Quinlan开发了ID3算法(迭代的二分器)Quinlan改迚了ID3 ...
- 学习图像算法阶段性总结 (附一键修图Demo) 2016.04.19更新demo
今天特别感慨,自己从决定研究图像处理,势必要做出一键修图算法. 经历了,三个多月的书籍积累,三个多月的算法调整以及优化. 人是一种奇怪的动物,当你做不到的时候,你以为做到了,自己会感觉很爽,很有成就感 ...
- Python的函数式编程-传入函数、排序算法、函数作为返回值、匿名函数、偏函数、装饰器
函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...
- 非负权值有向图上的单源最短路径算法之Dijkstra算法
问题的提法是:给定一个没有负权值的有向图和其中一个点src作为源点(source),求从点src到其余个点的最短路径及路径长度.求解该问题的算法一般为Dijkstra算法. 假设图顶点个数为n,则针对 ...
- 【Java/Android性能优5】 Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强
本文转自:http://www.trinea.cn/android/android-imagecache/ 主要介绍一个支持图片自动预取.支持多种缓存算法.支持二级缓存.支持数据保存和恢复的图片缓存的 ...
- eclipse在Ubuntu 13.04下的安装过程
eclipse在Ubuntu 13.04下的安装过程及问题小记 一.eclipse安装过程 首先确保在安装eclipse之前已经安装好Java虚拟机 1. eclipse官网下载压缩包 下载地址:ht ...
随机推荐
- 关于python print函数format 格式化
关于python print函数format 格式化 Your Guide to the Python print() Function https://realpython.com/python- ...
- C_C++常用函数汇总
1 string.h.cstring(C) (1)字符串连接函数 strcat.strncat strcat(char[ ], const char[ ]) strncat(char[ ], cons ...
- Django笔记五之字段类型
这篇笔记介绍字段的类型 Field Type. Django 的model 下的 field 对应的是 MySQL 中的表字段,而我们定义的 field 的类型则对应 MySQL 中的字段类型. 本次 ...
- jQ的事件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 这可能是最全面的TCP面试八股文了
计算机网络基础,考验一个程序员的基本功,也能更快的筛选出更优秀的人才. 说说TCP的三次握手 假设发送端为客户端,接收端为服务端.开始时客户端和服务端的状态都是CLOSED. 第一次握手:客户端向服务 ...
- 图与网络分析—R实现(三)
最小生成树 (Minimum Spanning Tree) 应该大家都不陌生,Spanning 有跨越的意思,生成树一般来说每个节点都能访问到别的节点,是一个连通树.所以,一般考虑无向图里去造生成树. ...
- 【过滤器设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
简介 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern),是一种结构型模式.这种模式允许使用不同的标准条件来过滤一组对象,并通过逻辑运算的方式把各条件连接起来,它 ...
- Redis集群介绍及测试思路
作者:京东零售 李磊 Redis集群介绍 Redis集群一般有四种方式,分别为:主从复制.哨兵模式.Cluster以及各大厂的集群方案.在3.0版本之前只支持单实例模式,3.0之后支持了集群方式.在3 ...
- [Java EE]小结:生成全局唯一编号的思路
并发是一个让人很头疼的问题,通常会在服务端或数据库端做处理,保证在并发下数据的准确性. 为此,简要讨论一下,如何通过解决全局生成唯一编号的并发问题. 1 MySQL数据库的锁 1-0 锁的分类 按锁定 ...
- 【AIGC未来的发展方向】面向人工智能的第一步,一文告诉你人工智能是什么以及未来的方向分析
人工智能的概念 当人们提到"人工智能(AI)"时,很多人会想到机器人和未来世界的科幻场景,但AI的应用远远不止于此.现在,AI已经广泛应用于各种行业和生活领域,为我们带来了无限可能 ...