Я пытаюсь смоделировать вероятностную систему.Система, с которой я работаю, включает три элемента - назовите их «X», «Y» и «Z».Эти элементы образуют строки в определенном типе чередующегося шаблона, где X должен чередоваться с Y или Z (т. Е. Соединения XX, YY, ZZ, YZ и ZY запрещены).Я хотел бы переставить списки всех возможных последовательностей для различных длин строк.
Моя первоначальная попытка состояла в том, чтобы сгенерировать все возможные перестановки этих трех символов и отфильтровать любые запрещенные шаблоны.К сожалению, перестановки очень плохо масштабируются для длинных последовательностей.Я решил эту проблему, генерируя каждую последовательность, по одному символу за раз, и проверяя условия, которые я излагал при создании последовательности.Это предотвращает генерацию непродуктивных последовательностей очень рано и резко уменьшает количество генерируемых перестановок.Проблема в том, что я не очень много программист, и мне пришлось жестко закодировать несколько вложенных циклов for, чтобы достичь этой цели.Код ниже показан для длины строки 5.
Length = 5
Units = ['X','Y','Z']
Sequences = []
#aij is the j'th character in the sequence
for i1 in range(len(Units)):
ai1 = n[i1]
for i2 in range(len(Units)):
ai2 = Units[i2]
#If the two most recent sequential units are identical OR (Y and Z) OR (Z and Y), pass
if ai2 == ai1 or ai2==Units[1] and ai1==Units[2] or ai2==Units[2] and ai1==Units[1]:
pass
else:
#repeat for the other characters in the sequence until the final character is reached
for i3 in range(len(Units)):
ai3 = Units[i3]
if ai3 == ai2 or ai3==Units[1] and ai2==Units[2] or ai3==Units[2] and ai2==Units[1]:
pass
else:
for i4 in range(len(Units)):
ai4 = Units[i4]
if ai4 == ai3 or ai4==Units[1] and ai3==Units[2] or ai4==Units[2] and ai3==Units[1]:
pass
else:
for i5 in range(len(Units)):
ai5 = Units[i5]
if ai5 == ai4 or ai5==Units[1] and ai4==Units[2] or ai5==Units[2] and ai4==Units[1]:
pass
else:
#Append the valid sequence to my list of Sequences
a = ai1 + ai2 + ai3 + ai4 + ai5
Sequences.append(a)
print(Sequences)
Вывод:
['XYXYX', 'XYXZX', 'XZXYX', 'XZXZX', 'YXYXY', 'YXYXZ', 'YXZXY', 'YXZXZ', 'ZXYXY', 'ZXYXZ', 'ZXZXY', 'ZXZXZ']
Мой вопрос: как я могу обобщить этот тип алгоритма для функциичто просто принимает входной "Длина" (т.е. количество символов в строке) и генерирует все мои шаблоны последовательности в списке?