如何生成随机的唯一数字,其中相邻数字在指定范围内?

时间:2018-10-15 01:56:16

标签: algorithm random language-agnostic unique genetic-algorithm

因此,假设我要生成一个a[]n(不包括)之间的0个随机整数的数组n(不重复)。但是我也想确保abs(a[i]-a[i+1]) < maxRange。应该允许环绕,这样

abs(a[i]-(a[i+1]+a.length)) < maxRange || abs((a[i]+a.length)-a[i+1]) || abs(a[i]-a[i+1]) < maxRange.

始终为真。例如,如果n=6maxRange =2,则数组a={1,3,2,4,0,5}是有效的,因为3-1 = 2, 3-2 = 1, 4-2 = 2, (0+n)-4 = 2, and (0+n)-5 = 1

但是a={0,3,2,4,1,5}无效,因为3-0=3 and 4-1=3

差异abs(a[i]-(a[i+1]+a.length))的分布应该是均匀的,并且应在1maxRange的范围内

我觉得必须已经有一个算法可以执行此操作,但是我似乎无法通过谷歌搜索找到它(也许我使用的术语不正确)。我能想到的唯一方法是对所有可能的排列进行暴力搜索,并检查是否满足标准以确定有效排列,然后随机选择其中之一。但是,对于更长的阵列,这可能在计算上变得非常昂贵。也许最好将其视为非重复的随机游走或其他形式。但是我不确定如何实现它。有任何想法吗?语言不可知的解决方案会很棒。

为了给我一些额外的信息,我想用它来用遗传算法和琐碎的地理或背景进行比赛选择。因此,例如,个人a [0]和a [1]将参加比赛(根据适合度选择获胜者),而失败者将被交叉/替换。然后是a [2]和a [3]等。我想要这样做的原因是,我可以一口气评估所有个人,然后一口气进行交叉阶段,然后重复这些阶段直到完成。我想要这样做的原因是,这样我就可以保证每个人每一代都经过评估,这与典型的稳态遗传算法不同。

1 个答案:

答案 0 :(得分:0)

这是在答案中发布的评论,因为它很大以适合评论。这不是答案,因为它仅给出了前进的方向,而不是最终的解决方案。

当我阅读标题时,对我来说很明显,您对此的思考方式可能是阻止您看到答案的障碍。在标题中,您使用了random一词,但在描述问题的方式中,您使用了walk一词。

  

也许最好将其视为非重复的随机游走或其他事物。

Philippe Olivier在评论中指出

  

少于20行代码的简单约束编程模型可以通过随机变量/值选择启发式方法非常有效地解决此问题。

我也认为解决此问题的方向是使用您所提到的行走方式和Philippe所指出的约束条件,但要将其置于早已熟知的Hamiltonian pathalgorithms)内。

当您注意到tournament selection时,您实际上描述了一些约束,即这些值是整数,它们的数目是固定的,它们是顺序的。

在标题中,当您提到within a specified range时,您实际上描述了其他约束,即任何两个节点之间都存在最大距离,并且访问这些节点形成一个循环。

真正有趣的是,在体育比赛中您也使用tournament一词,但是如果您在图论(tournament)的背景下查找该词,您会发现很多与您寻找的信息有关的信息。

另一种方法可能会在Gray code上有所变化。