创建一个序列,每个序列中的两个满足特定距离标准

时间:2019-06-14 21:03:59

标签: python algorithm list sequence permutation

给定一系列不同的项目Sa,我们希望创建一个序列Sb(由Sa中的相同项目组成,但顺序不同),使得序列S = Sa + Sb(序列Sb紧接在序列Sa之后) )满足以下属性:

  • 在S中两次出现的项目I之间的距离(位置数)至少为所有项目I的某个数T。
  • 如果项I和J在Sa中的N个位置内,则I和J不在Sb中的N个位置内。

我已经能够非常简单地用Python编写第一个规定。但是,第二个是我奋斗的地方。本质上,我只是想要这两件事:

  • 我希望第二个序列的项与第一个序列中的项相距“足够远”。
  • 我不希望第一个序列的邻居也成为第二个序列的邻居(N表示项目被视为邻居的距离)。

这是我到目前为止所拥有的:

import random

clips = list(range(10)) # arbitrary items
choice_pool = clips[:]
Sa = clips[:]
random.shuffle(Sa)
Sb = []
count = len(Sa)

threshold = 0.5*len(clips) # the minimum distance the item has to be away from itself in the concatenated sequence
while len(Sb) != len(Sa):
    jj = random.randint(0, len(choice_pool) - 1)
    # we want clip a1 to be at least threshold away from clip b1
    if count - Sa.index(choice_pool[jj]) >= threshold:
        Sb.append(choice_pool[jj])
        del choice_pool[jj]
        count += 1

print("Sa:", Sa)
print("Sb:", Sb)
print("S :", Sa + Sb)

在始终保证存在这样的顺序(不会以无限循环结束)的同时,您对如何实现第二条规定有任何建议吗?谢谢。

1 个答案:

答案 0 :(得分:0)

我会从等式中排除随机性的可能性。对于随机性,您永远无法保证自己不会陷入无限循环。该算法有更好的改进,但这是基础。

import itertools as it

def filter_criteria(sequence):
    #put your filters here return True if you find a sequence that works
    pass 

for sb_try in it.permutations(sa, len(sa)):
   if filter_criteria(sa+sb_try):
       return sb_try

return "no permutation matches"