1

私は非常に基本的な Python の知識を持つ 3D アニメーションのチューターであり、非常に有益なスクリプトになると思われるものをコーディングしようとして頭を壁にぶつけています。とても有難い。前もって感謝します。

これが私のシナリオです: 18 人の学生の私のクラスは、「グループ プロジェクト」モジュールに入ろうとしています。今年はクラスを半分に分けて、プロジェクトをより管理しやすくし、健全な競争を促進したいと考えています. 生徒たちはすでにアンケートに記入しており、それぞれに 0 から 5 までの数字を付けて、他のすべての生徒と一緒に作業することの好みに注釈を付けています。私の考えでは、これらのアンケートを使用して、好みに関して可能な限り最良の分割を数学的に計算できると考えています。 .

これで、ブラウザー ベースの Python エミュレーターである CodeSkulptor で非常に基本的な作業を開始しました。このプロトタイプ バージョンでは、A、B、C、D の 4 人のサンプル「生徒」から始めます。自分で作業できないため、これは簡単に任意の値にすることができます..)

ここに私の疑似コードがあります:

  1. すべての学生を含む空のセット「学生」を作成します。つまり、[A、B、C、D]

  2. 可能なすべての組み合わせで満たされる空のセット「組み合わせ」を作成します。つまり、 [((A,B),(C,D)),((A,C),(B,D)),(( A,D)(B,C))]

  3. 各生徒の選好情報を含むクラスを定義し、考えられるすべての組み合わせが決定されると、この情報を使用して、全体的に最高の「幸福度」/「士気」を持つ組み合わせが計算されます。

  4. すべての可能な組み合わせを循環し、組み合わせセットに追加されるリストのリストとしてそれらを返す関数を作成します。

  5. ( まだ追加されていません ) 設定された「組み合わせ」のすべての組み合わせを循環し、生徒のクラスに保存されている好みに基づいて全体的な「幸福度」を計算する関数を作成します。

  6. (まだ追加されていません) 幸福度が最も高い組み合わせを出力する関数を作成します。

この場合、次のように出力されます。

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!"

WIP を表示するのはちょっと恥ずかしいですが、ここにあります。

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 はいくつかのモジュール (math、random、time など) しかサポートしていないため、itertools を直接インポートすることはできません。実際の python を使用してみましたが、以前とはまったく異なる機能を果たしています。私は自分の研究で多くのことを学びました。たとえば、このようなものを計算すると、コンピューターが 24310 の異なる分割の可能性を通過するのに何年もかかる場合があります。別のオプションは、コードが一度に 100 個のランダムな分割の可能性を生成することです。ランスルーごとに最高の結果を追跡できました。全体として、試して理解するのは楽しいスクリプトでした。実際には少し楽しすぎます。できます' 実際の進歩を止めたとしても、物理的にそれから離れることはありません。ですから、誰かがここからどこへ行くべきかを教えてくれたり、教えてくれたりしたら、助けていただければ幸いです。

乾杯、

  • エリ
4

1 に答える 1

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)
于 2013-08-04T02:25:02.490 に答える