【发布时间】:2020-04-30 13:10:08
【问题描述】:
我有兴趣确定 R 中 NxN 矩阵的所有可能“连续”路径并返回它们的结果。 “连续”是指我们可以在不举起铅笔/数字的情况下旅行。也就是说,我们可以向上、向下、向左、向右或沿对角线移动。
为了具体说明,让我们使用一个 3x3 矩阵示例:
mat_3x3 <- matrix(LETTERS[1:9], ncol = 3, byrow = TRUE)
mat_3x3
# [,1] [,2] [,3]
# [1,] "A" "B" "C"
# [2,] "D" "E" "F"
# [3,] "G" "H" "I"
这意味着我们有以下有效和无效的路径:
一些注意事项:
- 起始位置不必是位置
A(1, 1)。 - 我们不能“双退”或多次触摸同一个单元格。
- 短路径是可能的(例如,
A -> B -> C是有效路径;同样,A -> E -> I)——也就是说,我们不需要通过所有节点。
如果有方便的包或概念,请指教(我见过的图遍历包大部分都是“图”而不是“矩阵”)。我想动态编程或递归可能在这里有用,但我不知道如何开始。
我相信对于路径 = 15 的一个单元格,对于以下解决方案,2X2 案例的答案可能是 60; 15 * 4 = 60:
但是,对于 3x3、4x4 的情况,情况会迅速升级...不再只是角落,添加“中心”正方形等...
如果我们将这个问题更多地考虑为一个图或网络,那么对于 3X3 情况,我们有以下内容:
为什么?
我只是对这个问题真正感兴趣并且觉得它很有趣。我想了解如何在R 中对其进行编程,但如果存在其他答案,我会考虑(然后可能将它们转换为R)。它最初是一个思考“游戏”的思想实验,您可以在触摸屏上滑动手指以从字符串中创建单词。我们想要最大化分数而不是最小成本——使用Z 比E 得分更高,例如Scrabble 等。但我想这在社交网络、图论、交通方面有有趣的应用优化和其他领域。
【问题讨论】:
-
您可以构建一个看起来像矩阵的图形。这是 Python 中的一个 example。
-
我会首先尝试找出一个合适的算法,然后担心如何在 R 中实现它。谷歌搜索“查找所有路径网格”似乎是一个合理的开始,尽管它们中的大多数都是为查找两个特定节点之间的路径而设计的,而不是查找覆盖网格中每个节点的所有路径...
-
我同意 Ben 的观点,首先找到合适的方法很重要。但是,假设每个节点都是唯一的 id,我认为
combinat::permn(m)将为您提供每个可能遍历节点的节点顺序。不过,9 个节点会产生 362,880 (factorial(9)) 个排列,所以现在您遇到了如何处理这些排列的问题。 -
这里有一个解决方案,虽然它不在 R stackoverflow.com/questions/13410168/…
-
哦,我认为路径必须通过所有节点......你的用例是什么?你打算用多大的网格来试试这个……?
标签: r matrix igraph graph-theory