Я хочу заказать сотни подмножеств по 2-15 кортежей в каждом.Представьте, что один кортеж похож на кусок домино.Два числа по своей сути объединены в один кусок.Не существует определения, которое является первым и которое является вторым числом.Таким образом, часть может быть перевернута.
Найдите порядок фигур домино (кортежей), где большинство фигур (кортежей) находятся в цепочке.Условие для формирования цепочки такое же, как в домино: второе значение n-го кортежа == первое значение n + 1-го кортежа.
дополнительный комментарий: кортежи не обязательно образуютloop
Грубое принуждение, проверяя каждую комбинацию, получается сложно.Цепочка из 6 кортежей уже имеет 45360 возможностей (с переворотами)
#brute forcing it by trying every possibility
#one subset
MN=[(3,4), (4,5), (8,5), (17,3), (34,56), (4,34)]
n=len[MN]
#initializing some variables for counting, etc.
count=0 #count the possibilities
score_max=0
best_sequence=None
from itertools import permutations
#helper functions
def calculate_optimization_score(MN):
n=len(MN)
score=0
for i in range(n-1):
if MN[i][1]==MN[i+1][0]:
score=score+1
return score
def flip_MN(MN, bool_ls):
MN_new=list(MN) #to be safe, make a copy
for i,e in enumerate(MN_new):
if bool_ls[i]==True:
MN_new[i]=tuple(reversed(MN_new[i]))
return MN_new
for nb_flip_MN in range(n):
# make True False array with nb_flip_MN True-values
bool_ls=[]
for i in range(nb_flip_MN):
bool_ls.append(True)
for i in range(n-nb_flip_MN):
bool_ls.append(False)
perm = set(list(permutations(bool_ls))) # and all permutations of that
for i,e in enumerate(perm):
#make the sequence with the flipped MN according to perm
MN_with_flip=flip_MN(MN, e)
for j,sequence in enumerate(list(permutations(MN_with_flip))):
score=calculate_optimization_score(sequence)
count=count+1
if score>score_max:
score_max=score
best_sequence=sequence