我正在尝试在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 = 10
和T >= 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(告诉您如何随机生成拉丁正方形。我还没有看过这个,但也许您可以使用其中的想法。