高效算法,可随机生成一个多集的两个分散,无序排列


13

背景

假设我有两个相同批次的n大理石。每个大理石可以是c种颜色之一,其中cn。令ni表示每批中颜色为i的大理石的数量i

S为多集{1,,1n1,2,,2n2,,1c,,cnc}代表一批。在频率表示中S也可以写为(1n12n2cnc)

\ msS的不同置换数S多项式给出:

|SS|=(nn1,n2,,nc)=n!n1!n2!nc!=n!i=1c1ni!.

是否有一个有效的算法来生成两个弥漫,错乱排列PQS随意?(分布应均匀。)

  • 甲置换P如果对于每个不同的元件iP,的实例i在大致均匀间隔的出P

    例如,假设S=(1424)={1,1,1,1,2,2,2,2}

    • {1,1,1,2,2,2,2,1}不扩散
    • {1,2,1,2,1,2,1,2}是分散的

    更严格地:

    • 如果,则只有一个实例要在 “间隔” ,所以让。ni=1iPΔ(i)=0
    • 否则,令是实例之间的距离 和实例 的在。从中减去期望的实例之间的距离,定义以下内容: 如果在均匀分布,则应该为零,或者如果为非常接近零。d(i,j)jj+1iPi
      δ(i,j)=d(i,j)nniΔ(i)=j=1ni1δ(i,j)2
      iPΔ(i)nin

    现在定义统计量来衡量每个在均匀间隔的数量。如果接近零,或大致,我们称弥散。(可以选择特定于的阈值,以便在使扩散。)s(P)=i=1cΔ(i)iPPs(P)s(P)n2k1SPs(P)<kn2

    此约束想起了更严格的实时调度问题,称为风车问题,具有多重集(因此)和密度。目的是调度循环无限序列,使得长度为任何子序列都包含至少一个实例。换句话说,可行的时间表要求所有;如果是密集的(),则且。风车问题似乎是NP完全的。A=n/Sai=n/niρ=i=1cni/n=1Paiid(i,j)aiAρ=1d(i,j)=ais(P)=0

  • 两个置换和是走火入魔,如果是紊乱的 ; 也就是说,每个索引。PQPQPiQii[n]

    例如,假设。S=(1222)={1,1,2,2}

    • {1,2,1,2}和不错乱{1,1,2,2}
    • {1,2,1,2}和排列混乱{2,1,2,1}

探索性分析

我对和的多集族感兴趣。特别是让。n=20ni=4i4D=(1424344352617181)

  • 这两个随机排列的概率和的被错乱是约3%。PQD

    可以如下计算,其中是第个Laguerre多项式: 参见此处的说明。Lkk

    |DD|=0dteti=1cLni(t)=0dtet(L4(t))3(L3(t))(L2(t))(L1(t))3=4.5×1011|SD|=n!i=1c1ni!=20!(4!)3(3!)(2!)(1!)3=1.5×1013p=|DD|/|SD|0.03
  • 的概率的随机排列的是是约0.01%,设置在大致任意的阈值。PDs(P)<25

    下面是的100,000个样本的经验概率图,其中是的随机排列。s(P)PD

    在中等样本大小下,。s(P)Gamma(α8,β18)

    Ps(P)cdf(s(P)){1,8,2,3,4,1,5,2,3,6,1,4,2,3,7,1,5,2,4,3}1191<105{8,2,3,4,1,6,5,2,3,4,1,7,1,2,3,5,4,1,2,3}140916<104{3,6,5,1,3,4,2,1,2,7,8,5,2,4,1,3,3,2,1,4}650972<10.05{3,1,3,4,8,2,2,1,1,5,3,3,2,6,4,4,2,1,7,5}12239136<10.45{4,1,1,4,5,5,1,3,3,7,1,2,2,4,3,3,8,2,2,6}16979189<10.80

两个随机置换有效(扩散和无序)的概率约为 。v(0.03)(0.0001)21010

低效的算法

常见的“快速”算法会生成一个随机的集合失序,它是基于拒绝的:

P ←random_permutation(D)
直到is_derangement(DP)
返回P

由于大约有可能的排列,因此大约需要次迭代。然而,基于拒绝的随机算法对于该问题将不是有效的,因为它将采用迭代的数量级。en!/e1/v1010

Sage使用的算法中,多集的随机排列“是通过从所有可能排列的列表中随机选择一个元素形成的。” 但这仍然是无效的,因为有有效的排列来枚举,此外,无论如何,都需要一种算法来做到这一点。v|SD|21016

进一步的问题

这个问题的复杂性是什么?可以将其简化为任何熟悉的范例,例如网络流,图形着色或线性编程吗?


关于你的“隔开”的定义,难道你不想为与是哨兵?也就是说,单个元素应位于中间,两个元素应将排列划分为三分之一,依此类推。d(i,j)n/(ni+1)0ijn+1P0=Pn+1=i
拉斐尔

如果代表邪恶的(小,但足够大),会发生什么?我们甚至还有弥散排列吗?我们当然不会改变寻找两个错位的!似乎没有元素可以出现超过次。S={1nk,2k}kn/2
拉斐尔

1
所有散布排列对中所有排列错乱排列对的比率是多少?同样,在所有成对排列的排列中,有多少个由两个离散排列组成?(如果任一比率都为“高”,我们可以将精力集中在过程的一半上,而另一半则被拒绝。)
拉斐尔

1
@Raphael(#3a)的百万的随机排列,这些561对漫那些有。的配对被。Ds(P)306118/(5612)=6118/1570803.9%
hftf

1
@Raphael(#3b)在 1000万个随机排列的排列对中,有306893对被重新排列。这些对中只有29个具有两个排列。这是一个直方图)。Ds(P)50
hftf

Answers:


3

一种方法:可以将其减少到以下问题:给定布尔公式,从所有令人满意的分配中随机选择一个分配。这个问题是NP难题,但是有一些标准算法可以从#SAT算法中借用生成近似均匀分布的方法。例如,一种技术是选择一个哈希函数,该哈希函数的范围具有精心选择的大小(大约与的满意赋值数量相同),从的范围内随机选择一个值。φ(x)xφ(x)xhφyh,然后使用SAT求解器找到对的满意分配。为了提高效率,您可以选择作为稀疏线性映射。φ(x)(h(x)=y)h

这可能是用大炮射击跳蚤,但是如果您没有其他可行的方法,可以尝试一下。


发现这很难遵循。是布尔值,是二进制字符串(二进制变量集)?所以最终方程式意味着...?φ(x)h(x)
vzn 2015年

0

这个问题在开始的一些扩展讨论/分析CS聊天进一步的背景,揭开了问题的复杂要求一些主观性,但没有发现任何直接的错误或疏忽。1个

这是一些经过测试/分析的代码,与基于SAT的其他解决方案相比,该代码相对“快速且肮脏”,但调试起来并不容易。其松散的概念基于本地伪/贪婪优化有点类似于例如,路线2-OPTTSP。基本思想是从适合某种约束的随机解决方案开始,然后在本地扰动它以寻找改进,贪婪地搜索改进并进行迭代,并在用尽所有局部改进时终止。设计标准是算法应尽可能有效/避免拒绝。

对于例如在SAGE [5]中使用的重排算法[4]已有一些研究,但是它们并不围绕多集。

简单的扰动只是元组中两个位置的“交换”。实施方式是红宝石。以下是一些参考行号的概述/注释。

qb2.rb(gist-github)

这里的方法是从两个错位的元组(#106)开始,然后局部/贪婪地提高色散(#107),并结合称为derangesperse(#97)的概念,以保持错位。请注意,在元组对中交换两个相同的位置可以保留排列错位并可以改善分散,这就是分散方法/策略的一部分。

derange子例程在数组(多集)上从左到右工作,并在数组中稍后与其中不与同一元素交换的元素交换(#10)。如果在最后一个位置没有进一步交换的情况下,两个元组仍处于混乱状态(#16),则该算法成功。

有3种不同的方法来排列初始元组。第二元组p2总是被拖曳。一个元组1(p1)可以按a.“最高幂一阶”(#128),b.随机排序(#127)c.和“最低幂一阶”(“最高幂最后一阶”)(#126)排序。

分散例程disperse更加复杂,但从概念上讲并不是那么困难。再次使用交换。与其尝试优化所有元素的分散性,不如尝试迭代地缓解当前最坏的情况。这个想法是找1 至少分散元素,从左到右。扰动是将x, y散布最少的对的左元素或右元素(索引)与其他元素互换,但在该对之间绝不交换任何东西(这将始终减小散度),并且跳过尝试与相同元素互换的尝试(select在#71中) 。m是该对的中点索引(#65)。

但是,使用每个对(#25,#44)中的“最左/最左”色散,对/对(#40)中两个元组的色散进行测量/优化。

该算法尝试交换“最远”元素1stsort_by / reverse#71)。

有两种不同的策略true, false可以决定是否要交换散布最少的对的左元素或右元素(#80),左元素用于交换位置到左/右元素到右侧,还是最远的左或右元素在交换对中的分散对中。

当算法无法再提高色散时(结束最差的色散位置的移动或增加整个元组对的最大色散(#85)),该算法即告完成(#91)。

会针对c3种方法(#116)和c= 1000 derangesperses(#97)上超过= 1000排列的不合格品,输出统计数据,查看2个分散算法以计算出拒绝对中的排列错序对(#19,#106)。后者跟踪总平均色散(保证有序后)。运行示例如下

c       0.661000
b       0.824000
a       0.927000
[2.484, 2, 4]
[2.668, 2, 4]

这表明该a-true算法可提供最佳结果,不排斥率约为92%,平均最差分散距离约为2.6,并且在1000次试验中保证至少2次,即在所有相同元素对之间至少存在1个不等插入元素。它发现了多达3个不相等中间元素的解决方案。

排列算法是线性时间预排斥,并且分散算法(在排列不规则的输入上运行)似乎可能约为。O(nlogn)

1问题是找到满足所谓“风水” [1]或“ nice”随机排序的“ quizbowl”包排列方式,其中“ nice”有些主观而尚未“正式”量化;问题的作者根据对quizbowl社区和“风水专家”的研究,将其分析/缩小为混乱/分散的标准。[2] 关于“风水法则”有不同的想法。一些关于算法的“已发表”研究已经完成,但它出现在早期阶段。[3]

[1] 小包风水 / QBWiki

[2] Quizbowl小包和风水 / Lifshitz

[3] 问题放置,HSQuizbowl资源中心论坛

[4] 产生随机排列/ Martinez,Panholzer,Prodinger

[5] 鼠尾草重排算法(python)/ McAndrew


fyi进一步想,在排列程序中有一个小故障,而且它并不总是排列混乱的。交换头寸可能会增加而不交换任何东西。有一个简单的修复程序可以正确测试成功。
vzn 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.