2016-09-16 4 views
-3

컴퓨터 프로그래밍을 처음 사용합니다.목록에서 고유 한 반복되지 않는 쌍 조합을 생성하는 방법

가능한 모든 팀이 구성 될 때까지 짝수 번호의 선수 목록 (최대 32 명)으로부터 반복되는 2 인 팀을 만들고 싶습니다.

예를 들어 6 명의 선수 (itru f)는 itertools.combinations 15 개의 별개 팀으로 생성 할 수 있습니다. 그런 다음 수작업으로 종이에 수동으로 3 개의 고유 한 팀 (예 : [a ','b '], [c', 'd'], [ 'e', ​​'f'] ], 그리고 마찬가지로 ac, bf, de, ae, bc, df, af, bd, ce 및 ad는 be, cf). 그러나 나는 이것을하기 위해 파이썬 3.5에서 프로그램 (여러가지 시도)을 쓸 수 없었다. 반복 횟수가 5 회 이하이면 반복이 발생하고 가능한 팀이 전혀 생성되지 않습니다.

검색을 수행했지만 특정 솔루션에 어떤 솔루션이 적용되는지 충분히 구분할 수 없습니다.

+1

"X-Y"문제 상태를 확인해 봅시다. 최종 목적은 무엇입니까? 2N 플레이어를 위해 전체 라운드 로빈 페어링을 설정하려고합니까? 이는 약간 다른 문제이지만 알려진 해결책이 있습니다. 설명이 암시하는 것처럼 덜 규칙적인 방식으로 알고리즘을 처리해야하는 경우 약간 더 어려운 문제가 있습니다. – Prune

+0

시도가 효과가 없더라도 공유하십시오. 그것은 바로 Stack Overflow가하는 것입니다. –

답변

0

일부 완벽한 라운드 로빈 페어링을 수행 한 다음 "라운드 로빈 토너먼트 일정"으로 솔루션을 찾아보십시오. Wikipedia에서 잘 설명 된 오랫동안 알려진 솔루션을 사용할 수 있습니다.

목록과 같이 두 행에서 선수, 각 행의 그들 중 절반 :

A B C 
D E F 

먼저 페어링이, AD BE되어, 참조 다음, 손톱 장소에서, 그리고 반지로 다른 사람을 고려 평평하게 ... ...

A B C 
    D F 
    E 

회전 링을 시계 방향으로 한 위치

A D B 
    E C 
    F 

을 한 행에 세 이하 다시 :

A D B 
E F C 

두 번째 라운드 쌍은 AE, DF, BC입니다. 총 5 회 회전하십시오. 마지막 하나는 원래 쌍을 복구합니다.

+0

응답 해 주셔서 감사합니다.내가 성취하려고하는 전형적인 시나리오와 함께 코드를 제출하고 싶습니다. 텍스트 편집기 (Wingware 101)에서 코드를 복사하여 붙여 넣기하여 붙여 넣기하여 답변과 함께 음영 처리 된 상자에 표시되도록 할 수 있습니까? 나는 backticks, Ctrl-K 등에 대한 조언을 이해하지 못합니다. – user5339671

+0

그런 식으로 편집 할 수 있어야합니다. 수정 창에서 맨 위에있는 아이콘 위로 마우스를 가져갑니다. 작은 도움 상자는 그들이하는 일을 알려줍니다. – Prune

0

다음은 내가 성취하고자하는 전형적인 시나리오입니다. 약 26 명의 선수 명단 주 1 : 18/26가 나타납니다. 나는 9 팀을 구성한다 주 2 : 22의 26가 나타난다. 11 팀을 구성하지만 1 주일부터 반복하지 않습니다. 3 주차 : 10/26가 표시됩니다. 나는 5 팀을 구성하지만 1 주나 2 주 등은 반복하지 않는다.

12 명까지 (12 초 소요)의 과거 __amams 필터가 적용되지 않았지만 다음과 같은 작품은 참을 수가 없다. , 나는 약 24 명의 선수를 기대한다. 프로그램이 첫 번째 유효한 팀을 선택한 다음 종료합니다. 추가적인 past__teams 필터가 적용되어 - 프로그램의 전체적인 점 - 더 오래 실행되어야합니다. 이 문제에 대한 또 다른 접근법이나 속도를 상당히 높이는 방법이 있습니까?

from itertools import combinations, chain 
import pickle, random 
'''the'past__teams.py' file was previously created as follows: 
output = open('past__teams.pkl', 'wb') 
pickle.dump(past__teams, output) 
output.close()''' 
players = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] 
random.shuffle(players) 
#load the past__teams file into the program 
pkl_file = open('past__teams.pkl', 'rb') 
past__teams = pickle.load(pkl_file) 
pkl_file.close() 

all_pair_combinations= [] 
tonights_teams = [] 
for c in combinations(players, 2): 
    c = list(c) 
    all_pair_combinations.append(c) 

def dupe_test(L): 
    if len(L) != len(set(L)): 
     return True 
    return False 
y = 0 
for t in combinations(all_pair_combinations, int(len(players)/2)): 
    t = list(t) 
    tt =list(chain(*t)) 
    y = y +1 
    if dupe_test(tt) == False: 
     tonights_teams =t 
     break 
print() 
print ("Tonights_teams: ",y,tonights_teams)