蜂窝空间两点最短路径的Python实现

news2024/9/19 10:41:54

昨天和Mcree来一场痛快淋漓的头脑风暴​!

叶子为什么是绿色的? 聊起一步步到物理是如何接过生物学家的接力棒深入探索:​参考链接:​为什么植物是绿色的?为了减少光合作用中的噪音

为什么眼睛能看到绿叶​?有没有存在一种植物甚至动物肉眼看不见,但摸的到​?散发着不可见光的生物​ — 依达尔文的进化论葫芦画瓢,这是躲避天敌的终极大招啊​!​

大喵点评:在我们给孩子讲授算法之前,是不是看看动物和植物的演进中都暗合哪些算法?

模拟动植物的行为而创造出的算法是最吸引我的 , 已在地球存在上万年的算法默默地指挥着动物的行为,蚁如何寻找食物,如何告诉同伴最短的路径等等; 对生命演化的好奇也是对生命背后的算法好奇。

视频:简单的规则创造出无限可能

alt

参考历史文章的链接: 简单的算法实现:蚂蚁自己的身体构建桥梁

简单动物的行为是机械编程的 破纪录的机器人凸显动物如何擅长跳跃

七个由动物建造的惊人结构

一道2022念蓝桥杯的题目。非常不错的题材!

alt

大喵点评:背景取材于游戏中的地图采用的位置表达。

alt
alt
alt
alt

基于蜂窝的位置算法有许多经典的应用场景,主要包括:

  1. 游戏地图设计。蜂窝结构的地图可以充分利用空间,方便探索,这很适合许多游戏地图的设计。像roguelike游戏中使用的地下迷宫地图常采用蜂窝结构。

  2. 焦点网格。在图像滤波、特征提取等领域,经常使用到焦点网格(focal grid)对图像进行采样。蜂窝结构正好适用于构建焦点网格,可以在图像上均匀离散采样。

  3. 蜂窝网络。在移动通信领域,蜂窝网络结构可以在有限空间内提供最大覆盖,这是构建移动网络的一种经典方式。

  4. 算法路径搜索。在路径搜索和规划算法中,蜂窝空间结构可以简化空间表示和搜索过程,许多经典算法都在此空间下进行讨论,如A*搜索算法等。

  5. 冗余阵列。在存储系统中,蜂窝结构的冗余阵列可以提供均匀的错误检查和纠错能力,如RAID6等技术采用蜂窝阵列结构。

  6. 热传导。在许多工程学科中,蜂窝结构都可以均匀有效地传导热量,常被用来设计散热器、换热器等设备。

  7. 空间覆盖。需要在平面空间上进行覆盖时,蜂窝结构可以实现最优解,这一特点在encrypt领域得到应用。

  8. 图像压缩。图像的频域转换后可以采用蜂窝扫描结构进行编码,这是一种图像压缩编码方式,如蜂窝图像压缩标准等。

所以,总之蜂窝算法在众多领域都找到了成功的应用,主要原因在于它结构简单,既可以在有限空间内高效覆盖,也方便进行空间分割与搜索,这些特性使其成为处理空间信息与问题的一种非常有效的工具。

接下来我们一起探讨这道题。水平所限只是抛砖引玉,直觉有更高效的算法。

以下是蜂窝空间两点最短路径的Python实现:

python的字典 direct定义 6 个方向的解析表达;

字典的value = tuple(x,y)

x = 东西方向的位移;

y = 南北方向的位移;

关键点是我们发现每一步的移动距离在东西方向上的位移大小有两种情形:

这是因为正西0方向和正东3方向时,每一步为 2; 正北和正南方向,每一步为 0;而

1,2,4,5 四个方向移动时,每一步 x 的变换率为 1;

def location(a,b,c):
    direct = {
              0:(-2,0),1:(-1,2),
              2:(1,2), 3:(2,0),
              4:(1,-2),5:(-1,-2)
              }

    #第 1 步完成时的坐标
    x1,y1 = direct.get(a)
    X,Y = b*x1,b*y1

    # 第 2 步完成时的坐标
    x2, y2 = direct.get((a+2)%6)
    X,Y = X + x2*c,Y + y2*c
    return X,Y

#测试用例
a,b,c = 0,5,3
print(location(a,b,c)) #(-7, 6)
a,b,c = 2,3,2
print(location(a,b,c)) #(5, 2)

a,b,c = 0,5,2
print(location(a,b,c)) #(-8, 4)

a,b,c = 2,3,5
print(location(a,b,c)) #(8, -4)

if __name__ == '__main__':
    # 调用函数location和B,C两点参数
    # 由函数返回结果获取B,C的位置坐标
    s,t = location(0,5,0),location(3,3,3)

    # 起点 s和终点 t 的坐标换算为步数
    # 注意 Y 是南北方向移动的步数
    # 首先 Y 条件成立后,再计算 X
    # X=东西方向移动的步数
    
    Y = abs(t[1]-s[1])//2
    X = abs(t[0]-s[0]) - Y * 1
    print(X/2, Y,int(X/2)+Y)

该实现定义了CellularSpace类表示蜂窝空间的坐标计算方法;

并给出shortest_path()方法计算两点最短路径。

即可以改写为函数调用:

def shortest_path(s,t):
    # 调用函数location和B,C两点参数
    # 由函数返回结果获取B,C的位置坐标
    s,t = location(0,5,0),location(3,3,3)

    # 起点 s和终点 t 的坐标换算为步数
    # 注意 Y 是南北方向移动的步数
    # 首先 Y 条件成立后,再计算 X
    # X=东西方向移动的步数
    
    Y = abs(t[1]-s[1])//2
    X = abs(t[0]-s[0]) - Y * 1
    print(X/2, Y,int(X/2)+Y)

实例调用该计算(2, 3)到(8, 12)的最短路径是 7

alt

选取 B 附近的点,测试结果正确;

s,t = location(0,5,3),location(0,6,4)
1

选取 C(2,3,2) 附近的点(2,3,3),又发现该点还可以表达为(3,3,0)

测试结果一致并且正确:

s,t = location(0,5,3),location(2,3,3)
8

s,t = location(0,5,3),location(3,3,0)
8

以上显示结果都是 8 步!

进一步验证。

考虑到同一个位置有不同的表达,例如下图中红色标记的 C 点,有两种甚至更多种路径可以到达:

题目给出的 C(2,3,2) 点还可以表达为(1,1,3)

s,t = location(0,5,3),location(2,3,2)
7

s,t = location(0,5,3),location(1,1,3)
7

输出结果都是 7,B(0,5,3)到C最少步数是 7 步;

再例如:

图中右下角的 C(3,3,2),又可以表达为 (2,1,4)

输入两种不同的表达,再看是否的同样的结果?

起点选择在 原点 O,分别带入坐标后结果一致:

s,t = location(0,0,0),location(3,3,3)
3

s, t = location(0, 0, 0), location(2, 1, 3)
3

再看左下角的红点:

s,t = location(0,0,0),location(5,2,0)
2

s, t = location(0, 0, 0), location(4, 2, 2)
2

最后测试图中相距最远的两个点: (0,5,3)和 (3,3,2)

s,t = location(0,5,3),location(3,3,2)
8

游戏中采用蜂窝位置算法的主要原因有:

  1. 空间利用效率高。蜂窝形状是一种经典的空间填充形状,可以在二维平面上充分利用空间,避免空隙。这在游戏地图等空间受限的场景中很有用。

  2. 减少重叠区域。由于蜂窝形状空间填充紧密,使相邻单元之间重叠区域最小。这可以避免在寻找可用空间和判断视野、射程时出现重叠歧义的情况。

  3. 方便探索。蜂窝形状空间划分规则精确清晰,游戏角色可以按规则顺利探索空间,不会由于空隙或死路而卡住。这也便于在空间内进行搜索与追踪。

  4. 简单的计算。在蜂窝空间内判断距离、邻居等仅需要简单的整数计算,不需要复杂的几何计算。这减少了游戏算法的计算量,提高了运行效率。

  5. 美观的形状。蜂窝形状在视觉上给人以整洁、有序的美感。这在游戏视觉效果上产生正面影响,特别适用于加强空间感的游戏场景。

总体来说,蜂窝位置算法由于空间利用率高、避免区域重叠、方便探索、计算简单以及美观的形状等原因,在游戏开发中得到广泛应用。

它不仅提高了游戏性能,也增强了游戏体验。

当然,蜂窝算法也有一定局限,如增加内存占用和限制某些形状的表达等。在具体应用中还需要综合考虑,选择最优的解决方案。

但作为一种典型的空间分割算法,蜂窝位置算法的优点明显大于缺点,这也是它在游戏与图形学领域得到广泛运用的原因。

alt

作为一名数学家、植物生物学家和数据科学家,我经常发现自己想知道为什么我们只有一种众所周知的算法,即神经网络,用于基于细胞的机器学习。

神经元只是一种类型的细胞,还有许多其他类型的细胞执行决策和学习功能。

更好的是,有些植物细胞特别有趣,因为它们是全能的。这意味着每个细胞都有植物的完整遗传信息。

因此,任何细胞都可以经历分化,变成叶子、根、花或干细胞,更令人印象深刻的是,可以从组织培养物中生长出全新的植物。

从表面上看,这似乎无趣或显而易见,但最终在工作中会做出复杂的决策。植物细胞如何知道何时变成叶子、芽、根或全新的植物?

为什么这么小的包不仅包含制定该决定的所有信息,而且还包含做出该决定的所有信息?提出这些问题并尝试以编程方式回答它们可以为机器学习和人工智能提供有趣的新方法。

当我考虑如何像植物细胞一样运作的算法时,我经常发现自己将决策树视为模型集合的第一步,其中决策树将选择应该实现的一个或多个模型。

例如,在某些情况下,当植物经历大量光照、高温和干燥土壤时;营养生长减慢,根系生长增加,现有叶子枯萎。这只是植物根据复杂的环境场景做出复杂决策的众多例子之一(如果您不相信植物会做出决定,请查看此播客)。

现在所有的植物都很酷,但我对一组特别感兴趣;兰花。由于其高度专业化和长寿命,兰花的行为方式令人困惑和迷人(只要问问任何兰花爱好者)。

他们可以选择多年不开花,与真菌建立动态关系,并且已经进化出惊人的特定方式,几乎在世界各地茁壮成长。

兰花是机会主义者和操纵者,通过研究它们可以学到很多东西。

我经常发现自己倾向于我的个人收藏,想知道我是否可以编写一种算法来告诉我如何以最佳方式照顾它们,或者可以帮助我识别它们(由于收敛进化,这很困难),或者更好的算法以某种方式模仿它们采用的机制,但可以应用于其他问题。

神经网络本身就很迷人,并且已经能够做一些令人惊奇的事情,但它们也有局限性,并且计算成本非常高。

我们可以做得更好,可以构建一种像植物细胞一样运作的算法(也许,只是也许,像植物细胞一样,它会更有效率)。

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/544333.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hadoop基础学习---1、大数据概论

1、大数据概念 大数据:指无法在一段时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 大数据主要解决,海量数据的采集、存储…

本地git仓库(gitea)与openssh-server的冲突(connection reset by ip port 22)

前提 之前在本地的windows电脑上安装了一个gitea供项目组成员使用。 期间为了在windows电脑上使用scp拷贝文件,离线安装过一个openssh。 冲突 发现无法pull/clone gitea上的仓库了,提示 connection reset by ip port 22 fatal: Could not read from r…

基于K8sSVC springboot 服务间调用

公司项目私有化部署,甲方要求服务间调用使用K8sSVC完成服务间调用。需要把原有基于springbootnacos 服务注册发现改造为k8ssvc完成服务间注册发现。 首先了解一下k8s svc: K8S核心概念之SVC(易混淆难理解知识点总结)_k8s svc_倾…

LVGL v8.2移植到IMX6ULL开发板

本文介绍嵌入式轻量化图形库LVGL 8.2移植到Linux开发板IMX6ULL的步骤。 文章目录 LVGL简介移植LVGL的硬件条件移植准备1. 源码下载2. 驱动加载 移植过程源码修改1. 修改lv_conf.h2. 修改lv_drv_conf.h3. 修改main.c文件4. 修改Makefile文件 源码编译效果演示 LVGL简介 LVGL最初…

内网渗透之权限维持-自启动映像劫持粘滞键辅助屏保后门WinLogon

0x01权限维持-自启动 以下几种方法都需服务器重启 1、自启动路径加载 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 将木马放到此目录,等待服务器重启即可 2、自启动服务加载 sc create ServiceTest binPath C:\1.exe …

上门家教预约小程序开发 良师就在你身边

社会的发展科技的进步让人们对教育的重视度也逐渐升高,很多家长可以说是为了孩子的教育操碎了心。在学校还好有老师辅导,节假日在家的时候,很多家长自己本身文化知识有限或者工作繁忙没有时间辅导,送去辅导班来回接送又很麻烦&…

LeetCode 116. 填充每个节点的下一个右侧节点指针

116. 填充每个节点的下一个右侧节点指针 描述 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下: struct Node {int val;Node *left;Node *right;Node *next; }填充它的每个 next 指针&#xff0…

【Win32】资源文件(对话框),逆向对话框回调函数,消息断点(附带恶意软件源码)

之前在学习windows编程的时候已经写过对话框的创建了,其中包括了对话框的分类,原理等等,大家可以去看一下:【windows编程之对话框】对话框原理,对话框的创建。原理今天就讲的不是很多了,直接给大家给出步骤…

inquirer 用户与命令行交互工具

学习脚手架的时候接触到inquirer ,用来创建用户与命令行交互工具,使用方式如下: 1、安装 npm i -S inquirer 2、所有type使用范例 var inquirer require(inquirer);const questions [{type: confirm,name: order,message: 您好&#xf…

如何用 Midjourney 绘制你自己的拟人头像?

在元宇宙时代,许多人都使用各种AI应用程序来生成他们自己的头像,其中Midjourney是一个非常流行的选择。然而,成功的先行者可能不愿意透露具体的prompt(提示语),因为他们可能担心自己的创意被其他人抄袭。此…

Talk | 北航助理教授孙庆赟 :图学习里的拓扑不均衡问题初探

本期为TechBeat人工智能社区第497期线上Talk! 北京时间5月17日(周三)20:00,北京航空航天大学计算机学院 助理教授—孙庆赟的Talk将准时在TechBeat人工智能社区开播! 她与大家分享的主题是: “图学习里的拓扑不均衡问题初探 ”,届…

Stream流 - 两个list集合对象属性的合并、对象属性值运算

两个list集合对象属性的合并 合并两个 list<map>, 并将 userId 相同的所有属性合并到一个 map 中 list1中对象的属性:userId、userName list2中对象的属性:userId、gender、age 最总集合中对象的属性:userId、user…

C# | [二进制字符串] 与 [字节数组] 互相转换,一行代码就搞定! - CodePlus系列

C#二进制字符串与字节数组互相转换 文章目录 C#二进制字符串与字节数组互相转换前言示例代码实现思路扩展方法说明引用CodePlus库结束语 前言 开发中有时需要将二进制数据转换为字符串或相反。虽然.NET提供了一些用于二进制数据操作的类库,但是它们的使用有时候会比…

Elasticsearch 安装 X-pack

X-Pack是Elastic Stack扩展功能,提供安全性,警报,监视,报告,机器学习和许多其他功能。 ES7.0之后,默认情况下,当安装Elasticsearch时,会安装X-Pack,无需单独再安装。 1.…

编程测试被候选人吐槽了?原因可能是这些

一位前Facebook Tech Lead曾经说过:面试就好像是在第一次约会的时候,就决定是不是要跟对方结婚。 这虽然是个无奈的笑话,但也真实地反映了技术面试中的一个难题:面试官需要在相当有限的时间里,准确地判断候选人的技术…

什么是自然语言处理的机器翻译?

机器翻译(Machine Translation,MT)是一种自然语言处理技术,旨在将一种语言的文本自动翻译成另一种语言。机器翻译是自然语言处理领域的重要应用之一,它可以帮助人们在跨语言交流、文档翻译和信息检索等方面更加便捷和高…

Maven聚合和继承,使用IDEA构建聚合与继承工程

文章目录 1 聚合步骤1:创建一个空的maven项目步骤2:将项目的打包方式改为pom步骤3:pom.xml添加所要管理的项目步骤4:使用聚合统一管理项目 2 继承步骤1:创建一个空的Maven项目并将其打包方式设置为pom步骤2:在子项目中设置其父工程步骤3:优化子项目共有依赖导入问题步骤4:优化子…

企业数据治理内训的好处这么多,赶紧安排!

数据治理是确保数据的质量和完整性的一种方法,这对企业非常重要,因为它们需要准确的数据来做出正确的决策。 学习有效地管理和维护数据 通过内部培训,员工可以学习如何有效地管理和维护数据,从而提高数据质量和可靠性。 帮助企业…

SpringAop的实践应用

使用AOP来对前端传来的对象参数进行 BaseDto中属性的填充 这样就不用每次都去UserThreadLocal中拿了再又往BaseDto中放了 Aspect Component public class UserAspect {Pointcut("annotation(org.springframework.web.bind.annotation.RequestMapping) || annotation(o…

测试将被开发、运维替代?我后悔了!?

记得在求职的时候,面试官经常问我:“为什么要选择软件测试工作?”而我也会经常说一堆自己有的没的优势去应付。 工作这么久了,也不再浮躁,静下心来回忆当初选择软件测试工作的历程,也是对自己职业生涯的一次回顾。 …