Что-то вроде игры в домино (настольная игра) с кортежами - как оптимизировать? - PullRequest
0 голосов
/ 27 июня 2019

Я хочу заказать сотни подмножеств по 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...