我如何获得最短的随机序列,以便它编码从一个元素到另一个元素的所有可能的转换?

如何解决我如何获得最短的随机序列,以便它编码从一个元素到另一个元素的所有可能的转换?

我正在设计一个实验,其中参与者将被提示一系列随机的动作,我将在整个实验过程中记录数据。我的目的是使用尽可能短的序列来捕捉从一个动作到另一个动作的每一个可能的过渡。假设有 N 种可能的操作,我正在寻找一种可以生成一组具有以下属性随机序列的算法:

  • 在每个序列中滑动,连续的两个元素代表从一个动作到另一个动作的过渡。因此,除了序列的开始和结束,每个元素都将作为一个过渡的结束,也是下一个过渡的开始。从我使用小示例观察到的情况来看,这种方法似乎可以生成最短的序列,同时涵盖所有转换。
  • 实现算法的代码必须返回所有这些有效的最短序列。
  • 不能有两个连续的元素相同(即不允许自转换)。
  • 必须使用 Python 和 MATLAB 中可用的基本函数,因此我不能使用 Python 中可能可用但 MATLAB 中不可用的模块/库(反之亦然)。

例如,假设我有 3 个操作:{A,B,C}。该算法应该产生的预期序列之一是:ABCBACA。滑过这个序列,一次取 2 个元素,我得到 {AB,BC,CB,BA,AC,CA}。正如预期的那样,这涵盖了使用长度为 7 的序列可能发生的所有 6 次转换。该序列没有两个相同的连续元素。该算法可能产生的另一个有效序列是:ACABCBA。滑过这个序列一次取 2 个元素,我得到 {AC,CA,AB,BA},因此覆盖了所有的转换,没有两个连续的元素是相同的。

我用笔和纸算出了这两个例子,但我无法看到模式,尤其是对于 N >3。我如何从这里开始?

在我的情况下,长度为 N*(N-1) + 1 的序列似乎是最短的序列,我认为这是有道理的。我还观察到这些序列的开始和结束是相同的(即,如果我们从 A 开始,我们会在 A 结束)。看起来好像这是一个循环列表而不是线性列表。这通常是真的吗?

解决方法

如果我正确理解您的要求,那么您需要做的基本上如下:

  1. 创建一个有向图,每个可能的转换都有一个节点(因此一个用于 AB,一个用于 AC 等),并添加从每个节点到以您的“结束”开头的每个节点的连接(所以对于 AB,你可以将它连接到 BA 和 BC——记住,这些是单向的)
  2. 找出上图的任意哈密顿圈。

你已经完成了。问题是,在一般情况下,找到哈密顿环是一个 NP 完全问题。因此,轻松地说,为大 N 找到一种有效的方法可能具有挑战性。如果你只需要它来处理相当小的 N,那么你可以选择任何找到哈密顿环的算法并将其插入。

见鬼,你可能只是连接 1. 尚未使用的随机转换和 2. 从前一个转换结束的任何开始(换句话说,随机遍历上述图形,而无需返回节点您已经访问过),如果在用完所有过渡之前用尽了所有选项,请重新开始。它肯定会相当快地找到小 N(例如

至于您关于解决方案是否总是循环的问题;对,那是正确的。很明显,您是否考虑过这样一个事实:在最佳解决方案中,您将只看到每个转换一次,并且任何“传出”转换都必须与同一动作的“传入”转换配对:例如如果您从 AB 开始,您的池将包含 N 个 xA 形式的转换,但只有 N-1 个 Ax 转换,因此您最终将只剩下一个 xA 形式的悬空转换,因此必须放在最后。

可能有某种替代解决方案可以利用这个特定问题的结构来产生更有效的解决方案,但如果有,我没有看到。不过,这个问题基本上是寻找最短 superpermutation 的小规模版本,目前还没有更有效的解决方案。

,

对于将来看到此问题的任何人:我遇到了 De Bruijn sequence,这几乎正是我想要解决我的问题的方法。文章中引用的 Python 代码非常适合我的问题。我需要做的唯一修改是在输出字符串中,我需要确保所有涉及自转换的排列(例如 AABBCC 等)都折叠为单个符号(即 ABC 等)。

此外,正如维基百科页面所述:

... 请注意,这些序列被理解为在一个循环中“环绕”...

所以这证实了我的观察,即序列总是在同一点结束和开始。可以通过向输入(即输入 ABCACBBAC 等)提供置换字符串来获得多个序列,然后我们得到我们感兴趣的输出。产生的输出Python 代码似乎总是有序的。

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

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?