因此,假设我要生成一个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=6
和maxRange =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))
的分布应该是均匀的,并且应在1
至maxRange
的范围内
我觉得必须已经有一个算法可以执行此操作,但是我似乎无法通过谷歌搜索找到它(也许我使用的术语不正确)。我能想到的唯一方法是对所有可能的排列进行暴力搜索,并检查是否满足标准以确定有效排列,然后随机选择其中之一。但是,对于更长的阵列,这可能在计算上变得非常昂贵。也许最好将其视为非重复的随机游走或其他形式。但是我不确定如何实现它。有任何想法吗?语言不可知的解决方案会很棒。
为了给我一些额外的信息,我想用它来用遗传算法和琐碎的地理或背景进行比赛选择。因此,例如,个人a [0]和a [1]将参加比赛(根据适合度选择获胜者),而失败者将被交叉/替换。然后是a [2]和a [3]等。我想要这样做的原因是,我可以一口气评估所有个人,然后一口气进行交叉阶段,然后重复这些阶段直到完成。我想要这样做的原因是,这样我就可以保证每个人每一代都经过评估,这与典型的稳态遗传算法不同。
答案 0 :(得分:0)
这是在答案中发布的评论,因为它很大以适合评论。这不是答案,因为它仅给出了前进的方向,而不是最终的解决方案。
当我阅读标题时,对我来说很明显,您对此的思考方式可能是阻止您看到答案的障碍。在标题中,您使用了random
一词,但在描述问题的方式中,您使用了walk
一词。
也许最好将其视为非重复的随机游走或其他事物。
Philippe Olivier在评论中指出
少于20行代码的简单约束编程模型可以通过随机变量/值选择启发式方法非常有效地解决此问题。
我也认为解决此问题的方向是使用您所提到的行走方式和Philippe所指出的约束条件,但要将其置于早已熟知的Hamiltonian path(algorithms)内。
当您注意到tournament selection
时,您实际上描述了一些约束,即这些值是整数,它们的数目是固定的,它们是顺序的。
在标题中,当您提到within a specified range
时,您实际上描述了其他约束,即任何两个节点之间都存在最大距离,并且访问这些节点形成一个循环。
真正有趣的是,在体育比赛中您也使用tournament
一词,但是如果您在图论(tournament)的背景下查找该词,您会发现很多与您寻找的信息有关的信息。
另一种方法可能会在Gray code上有所变化。