背景
私にはたくさんの学生、希望するプロジェクト、およびそれぞれのプロジェクトのスーパーバイザーがいます。私は一連のシミュレーションを実行して、学生が最終的にどのプロジェクトになるかを確認しています。これにより、フィードバックに必要な有用な統計を得ることができます。つまり、これは本質的に、Monte-Carlo
学生のリストをランダム化し、それを反復して、リストの最後に到達するまでプロジェクトを割り当てるシミュレーションです。その後、プロセスが再び繰り返されます。
1 つのセッション内で、プロジェクトの割り当てが成功する
たびに、次のことが行われることに注意してallocated
ください。これは 1 ずつ減少します
+ヒットが 0 になると、そのスーパーバイザーからのすべてのプロジェクトがなり、これはプロジェクトがquota
quota
blocked
allocated
コード
def resetData():
for student in students.itervalues():
student.allocated_project = None
for supervisor in supervisors.itervalues():
supervisor.quota = 0
for project in projects.itervalues():
project.allocated = False
project.blocked = False
の役割はresetData()
、データの特定のビットを「リセット」することです。たとえば、プロジェクトが正常に割り当てられるとproject.allocated
、そのプロジェクトは に反転されTrue
ます。これは 1 回の実行には役立ちますが、次の実行では割り当てを解除する必要があります。
上記では、情報が保存されている 3 つの辞書 (学生、プロジェクト、監督者用に 1 つずつ) を反復処理しています。
次のビットは、割り当てアルゴリズムの「モンテカルロ」シミュレーションです。
sesh_id = 1
for trial in range(50):
for id in randomiseStudents(1):
stud_id = id
student = students[id]
if not student.preferences:
# Ignoring the students who've not entered any preferences
for rank in ranks:
temp_proj = random.choice(list(student.preferences[rank]))
if not (temp_proj.allocated or temp_proj.blocked):
alloc_proj = student.allocated_proj_ref = temp_proj.proj_id
alloc_proj_rank = student.allocated_rank = rank
successActions(temp_proj)
temp_alloc = Allocated(sesh_id, stud_id, alloc_proj, alloc_proj_rank)
print temp_alloc # Explained
break
sesh_id += 1
resetData() # Refer to def resetData() above
生徒のrandomiseStudents(1)
順序をランダム化するだけです。
Allocated
次のように定義されたクラスです。
class Allocated(object):
def __init__(self, sesh_id, stud_id, alloc_proj, alloc_proj_rank):
self.sesh_id = sesh_id
self.stud_id = stud_id
self.alloc_proj = alloc_proj
self.alloc_proj_rank = alloc_proj_rank
def __repr__(self):
return str(self)
def __str__(self):
return "%s - Student: %s (Project: %s - Rank: %s)" %(self.sesh_id, self.stud_id, self.alloc_proj, self.alloc_proj_rank)
Output and problem
これを実行すると、次のような出力が得られます (切り捨てられます):
1 - Student: 7720 (Project: 1100241 - Rank: 1)
1 - Student: 7832 (Project: 1100339 - Rank: 1)
1 - Student: 7743 (Project: 1100359 - Rank: 1)
1 - Student: 7820 (Project: 1100261 - Rank: 2)
1 - Student: 7829 (Project: 1100270 - Rank: 1)
.
.
.
1 - Student: 7822 (Project: 1100280 - Rank: 1)
1 - Student: 7792 (Project: 1100141 - Rank: 7)
2 - Student: 7739 (Project: 1100267 - Rank: 1)
3 - Student: 7806 (Project: 1100272 - Rank: 1)
.
.
.
45 - Student: 7806 (Project: 1100272 - Rank: 1)
46 - Student: 7714 (Project: 1100317 - Rank: 1)
47 - Student: 7930 (Project: 1100343 - Rank: 1)
48 - Student: 7757 (Project: 1100358 - Rank: 1)
49 - Student: 7759 (Project: 1100269 - Rank: 1)
50 - Student: 7778 (Project: 1100301 - Rank: 1)
基本的に、最初の実行では完全に機能しますが、 n回目の実行 (この場合は 50)までの後続の実行では、学生とプロジェクトの割り当てペアが 1 つだけ返されます。
したがって、私が問題を抱えている主な問題は、特に最初の実行がスムーズに機能するため、この異常な動作の原因を突き止めることです.
前もって感謝します、
アズ