2013-08-04 4 views
1

저는 매우 기본적인 파이썬 지식을 가진 3d 애니메이션 튜터입니다. 벽면에 머리를 부딪 치면서 내가 생각하기에 매우 유용한 스크립트가 될 수 있다고 생각합니다. 모두 올바른 방향으로의 간단한 요점을 포함하여 도움을 주시면 대단히 감사하겠습니다. 미리 감사드립니다.선호도에 따라 그룹을 반으로 나눕니다.

내 시나리오는 다음과 같습니다. 18 명의 학생들이 "그룹 프로젝트"모듈에 들어갑니다. 올해 저는 프로젝트를보다 잘 관리하고 건강한 경쟁을 장려하기 위해 반으로 나누고 싶습니다. 학생들은 이미 0에서 5 사이의 숫자를 부여하여 다른 모든 학생들과 일하는 것에 대한 선호도에 주석을 달았습니다. 제 아이디어는이 설문 조사를 이용하여 가능한 가장 좋은 점수를 수학적으로 계산할 수 있다는 것입니다 선호도.

이제 브라우저 기반의 Python 에뮬레이터 인 CodeSkulptor에서 매우 기본적인 시작을했습니다. 이 프로토 타입 버전에서는 A, B, C 및 D의 4 개 샘플 "students"로 시작합니다. 각 학생은 다른 학생의 의견을 제시하고 간단한 설명을 유지하기 위해 자신의 의견을 모두 0으로 설정하고,

  1. 하는 "학생"빈 세트를 작성 모든 학생들이 포함됩니다 : (당신이 자신과 함께 작동하지 수 없기 때문에이 그냥 간단하게, 모든 값이 될 수 있지만 ..) 여기에

    내 psuedocode입니다 , 즉 [A, B, C, D]

  2. 알로 채울 빈 세트 "조합"을 만듭니다. ((A, B), (C, D)), ((A, C), (B, D)), ((A, D) (B, C))]

  3. 학생별로 선호 정보를 포함하는 클래스를 정의 일단 모든 가능한 조합이 결정되고,이 정보가 .. 전반적인 최고의 "행복"/ "사기"와 조합을 계산하기 위해 사용한다

  4. 가능한 모든 조합을 순환하는 함수를 작성하여 조합 목록에 추가되는 목록의 목록으로 반환하십시오.

  5. (아직 추가되지 않음) 집합 "조합"의 모든 조합을 차례로 순환하고 학생 클래스에 저장된 기본 설정에 따라 전반적인 "행복"을 계산하는 함수를 만듭니다.

  6. (아직 추가되지 않음) 행복이 가장 높은 조합을 인쇄하는 함수를 만듭니다. .. 나는 WIP를 보여 종류의 당황

    print"A,B/C,D = 7" 
    
    print"A,C/B,D = 10" 
    
    print"A,D/B,C = 15" 
    
    print"Highest possible split is A,D/B,C with overall happiness of 15!" 
    

    하지만 여기있다 :이 경우

는 인쇄해야

http://www.codeskulptor.org/#user17_EEvOfHGg7AAZt1w_1.py

또는 사람들을 위해를 이 페이지에 머물러야합니다.

people = set([]) 
combinations = set([]) 

class person: 
    def __init__(self, name, A = 3, B = 3, C = 3, D = 3): 
     self.name = name 
     self.A = A 
     self.B = B 
     self.C = C 
     self.D = D 

    def get_name(self): 
     return self.name 

    def get_A(self): 
     return self.A 

    def get_B(self): 
     return self.B 

    def get_C(self): 
     return self.C 

    def get_D(self): 
     return self.D  

# make all the possible combinations 
#def combine(people): 
#combine any 2 given people into a new group 

def combinations(iterable, r): 
    # combinations('ABCD', 2) --> AB AC AD BC BD CD 
    # combinations(range(4), 3) --> 012 013 023 123 
    pool = tuple(iterable) 
    n = len(pool) 
    if r > n: 
     return 
    indices = range(r) 
    yield tuple(pool[i] for i in indices) 
    while True: 
     for i in reversed(range(r)): 
      if indices[i] != i + n - r: 
       break 
     else: 
      return 
     indices[i] += 1 
     for j in range(i+1, r): 
      indices[j] = indices[j-1] + 1 
     yield tuple(pool[i] for i in indices) 

####[A,B,C,D] 
people.add(person("A", 0, 1, 2, 4)) 
people.add(person("B", 3, 0, 3, 4)) 
people.add(person("C", 1, 5, 0, 2)) 
people.add(person("D", 3, 3, 2, 0)) 

combinations(people,2) 

조합 기능 - 실제로 itertools 문서 페이지에서 곧바로 해제되었지만 작동하는지 또는 그룹을 분할하는 가장 좋은 방법인지는 확실하지 않습니다. CodeSkulptor는 몇 가지 모듈 (수학, 무작위, 시간 등) 만 지원하므로 itertools를 직접 가져올 수 없습니다. 나는 실제 파이썬을 사용해 보았지만, 익숙한 것보다 다르게 작동한다. 나는 내 연구에서 컴퓨터를 24310 다른 분할 가능성을 통해 몇 년이 걸릴 수 있습니다 같은 많은 것을 배웠습니다. 또 다른 옵션은 단지 100 임의의 분할 가능성을 생성하는 것입니다 시간과 나는 각 runthrough를 통해 가장 높은 결과를 추적 할 수있었습니다. 전체적으로 재미있는 스크립트를 사용해 보았습니다. 실제로는 약간 재미있었습니다. 실제 진행을 멈췄지만 신체적으로 눈물을 흘릴 수는 없습니다. 제발, 누군가가 나에게 여기에서 어디로 가야 하는지를 암시하거나 보여줄 수 있다면 나는 도움을 매우 감사 할 것입니다.

건배,

  • 엘리
  • 완료
+0

는 당신이 실제로 (9 그룹과의) 절반의 클래스를 분할하고, 또는 당신을 나누고 있습니까? 두 그룹으로 나누세요? – user2357112

+0

반쪽 (9 개 두 그룹) 이것은 두 번째 단락에서 언급되었습니다. - ((A,), (B, C, D))는 유효하지 않습니다. –

+0

itertools라는 내장 모듈을 살펴 보는 것이 좋습니다. 나는 당신이 [itertools.combinations] (http://docs.python.org/2/library/itertools.html#itertools.combinations)를 매우 유용하게 찾을 수 있다고 생각한다. – charmoniumQ

답변

1

from itertools import combinations 
import numpy as np 
import string 

    def get_maxhappiness(results): 
     max_happiness = max(results) 
     index = results.index(max_happiness) 

     #Printing the result! (There may be more than one best result, but this will only show 1) 
     print "Optimal Groups: Point value of",max_happiness,"\n",groups[index],"\n", anti_groups[index] 
     results[index] = 0 
     return results 

def calculateHappiness(points,group): 
    happiness = 0 
    for i in range(len(group)): 
     person_prefs = points[group[i]] 
     others = group[i:] + group[:i] 
     for other in others: 
      happiness += person_prefs[other] 
    return happiness 



if __name__ == "__main__": 
    people = string.letters[26:44] 
    groups = list(combinations(people,9)) 
    anti_groups = [tuple(set(people).difference(set(x))) for x in groups] 

    #Making fake results 
    survey_results = dict() 
    for person in people: 
     results = dict(zip(people,np.random.randint(0,10,size=(len(people))))) 
     results[person] = 0 
     survey_results[person] = results 

    #Printing Survey Results 
    for name,values in survey_results.items(): 
     print "Student:", name, "has preferences:", values 

    #Calculating happiness for every group 
    results = [] 
    for i in range(len(groups)): 
     results.append(calculateHappiness(survey_results,groups[i])+calculateHappiness(survey_results,anti_groups[i])) 
    #Finding the largest happiness value 
    top_n = 5 
    while top_n > 0: 
     results = get_maxhappiness(results) 
     top_n -= 1 

수익률 :

... 

Student: N has preferences: {'A': 5, 'C': 5, 'B': 0, 'E': 0, 'D': 3, 'G': 6, 'F' 
: 8, 'I': 8, 'H': 3, 'K': 1, 'J': 4, 'M': 4, 'L': 9, 'O': 0, 'N': 0, 'Q': 3, 'P' 
: 2, 'R': 2} 
Student: Q has preferences: {'A': 9, 'C': 0, 'B': 3, 'E': 4, 'D': 3, 'G': 2, 'F' 
: 2, 'I': 7, 'H': 5, 'K': 2, 'J': 3, 'M': 0, 'L': 9, 'O': 2, 'N': 5, 'Q': 0, 'P' 
: 2, 'R': 0} 
Student: P has preferences: {'A': 2, 'C': 3, 'B': 0, 'E': 9, 'D': 3, 'G': 6, 'F' 
: 7, 'I': 1, 'H': 7, 'K': 9, 'J': 7, 'M': 4, 'L': 8, 'O': 2, 'N': 6, 'Q': 5, 'P' 
: 0, 'R': 7} 
Student: R has preferences: {'A': 5, 'C': 3, 'B': 7, 'E': 1, 'D': 5, 'G': 6, 'F' 
: 1, 'I': 6, 'H': 9, 'K': 9, 'J': 3, 'M': 6, 'L': 8, 'O': 8, 'N': 5, 'Q': 1, 'P' 
: 3, 'R': 0} 
Optimal Groups: Point value of 709 
('A', 'B', 'F', 'G', 'J', 'K', 'O', 'Q', 'R') 
('C', 'E', 'D', 'I', 'H', 'M', 'L', 'N', 'P') 
(x4) 
+0

니스, 이것은 매우 효율적인 시작입니다. 나는 클래스를 정의하는 것에 대해 사전을 사용하는 것에 대해 궁금해했다. 그것이 다른 사람들이 어떻게 할 것인지를 아는 것이 좋습니다. 그래서 이것은 4 단계까지 나를 길게 만든다. 나는 적절한 파이썬 (코드 컷터가 아닌)에 접근 할 때 나중에 "가능한 조합"단계로 과거를 밀어 넣으 려 시도 할 것이다. –

+0

그래서, 나는 내 포스트의 코드를 생각한다. 지금은 효과가 있습니다 만, 사람들이 정확하지 않게 시험해 볼 것을 환영합니다. – sihrc

+0

와우! 감사합니다. D : 저는 Python 2.7.5를 관리 권한이없는 제 작업 컴퓨터에서 실행할 수 있었지만 불행히도 numpy로 패키지되지 않았습니다. 지금 설치하는 중입니다. –

관련 문제