基于坐标系的广度优先搜索

如何解决基于坐标系的广度优先搜索

我不是经验丰富的程序员(编程语言 MATLAB),因此对高级算法几乎一无所知。其中之一是广度优先搜索。我理解的概念,但将其应用到我的问题中对我来说很困难。

我的问题: 我将大小相等的圆盘随机放置在一个正方形中,当它们是一个连接网络时,会将圆盘的坐标放入单独的矩阵中。为了清晰起见,我对它们进行了着色(见图)。现在,我必须找到从左到右的网络从左到右的最短路径,并希望根据坐标来执行此操作。磁盘必须接触才能相互连接。如果它们不接触,它们就无法形成路径。

这就是我目前拥有的: 我在第 1 列和第 2 列中有一个坐标 x 和坐标 y 的矩阵,每一行代表一个磁盘(为方便起见,我们只取所有连接磁盘的坐标,不包括连接时未从左到右跨越的那些磁盘)。 圆盘的直径是已知的 (0.2)。 我们可以很容易地识别出哪些圆盘在正方形的左边界上,哪些圆盘在正方形的右边界上。这些代表可能的起始坐标和可能的目标坐标。

% Coordinates of group of disks,where the group connects from left to right.
 0.0159    0.1385
 0.0172    0.2194
 0.0179    0.4246
 0.0231    0.0486
 0.0488    0.1392
 0.0709    0.2109
 0.0813    0.0595
 0.0856    0.3530
 0.1119    0.3756
 0.1275    0.2530
 0.1585    0.4751
 0.1702    0.2926
 0.1908    0.3828
 0.1961    0.3277
 0.2427    0.4001
 0.2492    0.4799
 0.2734    0.4788
 0.3232    0.3547
 0.3399    0.3275
 0.3789    0.3716
 0.4117    0.3474
 0.4579    0.3961
 0.4670    0.3394
 0.4797    0.3279
 0.4853    0.4786
 0.3495    0.4455
 0.4796    0.2736
 0.0693    0.0746
 0.1288    0.4204
 0.1271    0.4071
 0.1218    0.4646
 0.1255    0.3080
 0.4154    0.2926

磁盘的位置和连接磁盘的颜色。图像非常示意性,应该在更大的区域内预期更多的磁盘(保持相同大小的磁盘)。

我的策略是设置广度优先搜索,将起始坐标作为正方形左侧的一个圆盘(可以是任何圆盘)。目标是找到到正方形右侧的最短路径。

据我所知,我想选择一个起始坐标并检查所有磁盘是否在我起始坐标的直径距离(磁盘的中点到中点)内。如果它们在我的起始坐标范围内,我想将它们放在“队列”中(MATLAB 本身不支持?但让我们自己设置一个)。然后,下一步是取第一个足够接近的磁盘,并为这个磁盘做同样的事情。我可以做到这一点,但是一旦我必须做我的第一个磁盘中的第二个磁盘,我就会迷失在我应该采用的数据结构和/或数据结构以及如何保存它找到的“路径”上。这意味着我可以找到一条路径,但不是所有路径,因此也不是最短路径。

感谢您的帮助!也许一些我还没有看到的文档,或者一个非常具有可比性的例子。

最好的问候,

解决方法

如果它们在我想要放置的起始坐标范围内 他们在“队列”中

在将它添加到队列之前,您要确保此磁盘之前未被处理(放入队列)。每个磁盘应该只处理一次,所以你要确保“邻居”磁盘之前没有被处理过,然后将其标记为已处理并将其添加到队列中。

下一步是取第一个足够接近的磁盘并执行 这个也一样。

实际上,要处理的下一张光盘只是队列开头的光盘。 继续这样做,直到达到目标/停止标准。

如何保存它找到的“路径”

有几种技术可以做到这一点。一个简单的方法是为每个磁盘维护一个“来自”值。该值指向磁盘的“父”。 由于每个磁盘都被处理一次(最多),它将有一个“来自”值或没有。
当到达目标时,可以从目标的“来自”值开始重建路径。

,

这个问题现在已经解决了!

我解决这个问题的方法与我的问题中已经提出的方法很接近,但也得到了一些评论的帮助。

坐标之间的距离可以放入一个矩阵中。让我们看看坐标(磁盘)1 和坐标(磁盘 3)。这意味着我们将在元素 (1,3) 和 (3,1) 处。如果磁盘在接触距离内,则这两个元素将指示 1,否则为 0。这对所有磁盘都进行,从而创建邻接矩阵。

我使用内置函数 G = Graph(adjacency matrix) 创建了一个“图”,我们可以创建一个无向图。然后使用内置函数 [path,distance of path] = shortestpath(G,s,t),其中 G 是图形,s 和 t 是起始磁盘(在这种情况下,由整数表示),可以找到从磁盘 s 到 t 的最短路径。

然而,我们必须注意一件事,那就是表示磁盘之间的实际距离。如果我们查看 G,我们实际上可以看到它包含两个对象。一个代表节点,另一个代表边。边对于基于坐标的距离至关重要,因为我们可以将边的“权重”设置为两个磁盘之间的距离。这可以简单地通过循环节点并计算相邻节点之间的距离并将它们插入权重 (G.Edges.Weight(i) = distance between the respective nodes) 来完成。

如何找到从左到右的最佳路径?我遍历所有起始磁盘(定义为接触正方形的左侧)并找到所有接触正方形右侧的磁盘的最短路径。保存路径的距离,可以找到实际的最短路径。

为了给你一个可以实现的例子,下面的视频展示了可以从每个起始磁盘找到哪些路径,最后一帧显示最短路径。 Video of path finding. 我也在此处附上了最短路径:

Shortest path left to right.

如果您有任何关于具体细节的问题要问我,请告诉我。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-