我如何创建受约束的随机实验方案



我正在尝试在MATLAB中构建一个协议,以在框架内随机化实验试验订单,并且无法创建有效的算法。

问题

我想管理T试验次数([t1, t2, t3…],每个参数不同(,并为R重复[r1, r2, r3…]。每次运行将由相同的精确试验组成,但每次运行都随机顺序。此外,随机化受到限制,以说明在给定运行中较早或更晚的效果。在所有运行中,每个试验必须在跑步中早,中间和后期进行相等的次数。为此,每次运行都被分解为G[g1, g2, g3…]。我想制作一种将生成一组R随机运行的算法,以使每个试验t出现在任何运行N=R/G次的每组中。

示例

T = 9试验[t1, t2,…, t9]将重复R = 6运行[r1, r2, …, r6]。将使用许多G = 3[g1, g2, g3]组。下面显示了一个6次运行的示例集。(|字符单独的组。组内的顺序无关紧要,因为稍后会随机分组中的审判订单。组在构建运行之外没有任何意义。一旦构建运行,它将被视为一个凝聚力单元。(<(<(<(<(<(

      s1 s2 s3   s4 s5 s6   s7 s8 s9
r1 = [t1 t2 t3 | t4 t5 t6 | t7 t8 t9]
r2 = [t3 t4 t7 | t2 t6 t8 | t1 t5 t9]
r3 = [t5 t8 t9 | t1 t2 t7 | t3 t4 t6]
r4 = [t2 t4 t6 | t3 t5 t9 | t1 t7 t8]
r5 = [t5 t6 t9 | t1 t7 t8 | t2 t3 t4]
r6 = [t1 t7 t8 | t3 t4 t9 | t2 t5 t6]

请注意,每个试验每次运行一次(行(和每组N = R/G = 6/3 = 2次(" |"列表列(。每个单独的列是一个插槽[s1, s2, …, s9],每个列都包含每次运行的不同试验。我对算法的实现将需要R = 10T >= 320

我的尝试

我尝试了3种不同的算法,所有这些算法都完全失败了(使用T = 20,小(,或者它们的扩展不佳(使用T = 320花费很长时间(。我发现使用G = max(gcd(d(R), T))G,其中gcd是两个参数之间的"最大共同除数",而d是"除数"功能,它列出了输入的所有除数(不包括输入本身(。我的算法的简要说明:

1。创建一个随机试验顺序,作为每个运行的原型(每个运行相同的随机原型(。对于每次运行,遍历每个插槽,然后在随机选择的不同插槽中切换试验的试验(前提是两个试验都可以占据各自的新插槽,因为任何给定试验的最大次数都可以出现在同一次数组,N(。由于随机化最终会导致不存在开关的情况,任何时候发生这种情况,因此将算法重新启动直到找到最终解决方案。这适用于T = 20通常不到10秒钟,但很快就会棘手。

2。对于每个试验,进行每次运行,然后随机选择该试验仍然需要并仍然可以加入的组(该组不满意,更少,而更少在同一试验中,同一试验中的N在所有跑步之前都在该组中(。该算法也导致不存在任何选择的情况,因此在卡住时也会重新启动。该算法需要很长时间才能收敛。

3。对于每次运行,将每个试验分配给一个组,首先分配最少数量的分组的试验。该算法也被卡住了,还需要很长时间。

如果您愿意,我可以为这些实现提供MATLAB代码。


理想情况下,我想要一种确定性算法,可以找到每个独特的组组合(尽管我不知道存在多少组(,并且我会选择一个随机分组以每次使用。对此问题的任何帮助将不胜感激。

对于参数t = 3n r = 3这是一个解决方案:

生成第一行的随机排列

第二行是第一行的变化第三组现在在第一组中。

第三行是第二行再次移动。

所以这个模式是

[T1 T2 T3 |T4 T5 T6 |T7 T8 T9]

[T7 T8 T9 |T1 T2 T3 |T4 T5 T6]

[T4 T5 T6 |T7 T8 T9 |T1 T2 T3]

对于参数t = 3n r = 3M,我建议您将行分为三组,并像上述三个组生成三组。当然,您可以一代一代人洗牌。

请注意,您对每组三行使用不同的排列。例如,使用6行,您可能最终会

123 456 789

789 123 456

456 789 123

148 256 379

379 148 256

256 379 148

这样的概括是使用https://en.wikipedia.org/wiki/wiki/latin_square of Size 3n的整数N。如果行中的元素数量是3N的倍数,则3N的倍数将它们切成3n零件并使用拉丁广场产生3n行。对于n = 1,这几乎是相同的东西,实际上只有一个侧面3的拉丁正方形,但是对于n = 2,有9408个侧面6的拉丁正方形,所以随机选择一个正方形实际上意味着一些东西。还请注意,在同一篇文章中,参考(4(告诉您如何随机生成拉丁正方形。我还没有看过这个,但也许您可以使用其中的想法。

最新更新