Запуск моделирования распределения неоднократно ломается после первого запуска

StackOverflow https://stackoverflow.com/questions/2910240

  •  04-10-2019
  •  | 
  •  

Вопрос

Задний план
У меня есть куча студентов, их желаемых проектов и руководителей соответствующих проектов. Я запускаю аккумулятор моделирования, чтобы увидеть, какие проекты учащиеся в конечном итоге, что позволит мне получить полезную статистику, необходимую для отзывов. Итак, это по сути Monte-Carlo Моделирование, в котором я случайно проводлю список студентов, а затем итасив его, выделяя проекты, пока я не наступил в конец списка. Тогда процесс повторяется снова.

Обратите внимание, что в течение одного сеанса после каждого успешного выделения проекта происходит следующее:
+ проект установлен на allocated и не может быть передан другому ученику
+ руководитель имеет фиксированный quota студентов он может контролировать. Это уменьшается на 1
+ Один раз quota Хиты 0, все проекты от этого руководителя становятся 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. Отказ В то время как это полезно для одного прогона, для следующего запуска я должен быть освобожден.

Вышему, я итарируюсь с той Три словари - один для студентов, проектов и руководителей - где хранятся информация.

Следующим битом является симуляция «Монте-Карло» для алгоритма распределения.

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, возвращается только одна пара выделения студентов-проектов.

Таким образом, основной проблемой у меня проблемы с тем, что выяснить, что вызывает это аномальное поведение, особенно после того, как первый пробег работает гладко.

Заранее спасибо,

Аризона

Это было полезно?

Решение

Вы действительно собираетесь установить квоту над руководителем 0 в resetData()? Разве это не значит, что все их проекты теперь заблокированы?

Quath the Raven:

Наблюдатель имеет фиксированную квоту студентов, которые он может контролировать. Это уменьшается 1. После того, как квота попадает в 0, все проекты от этого руководителя заблокированы, и это имеет тот же эффект, что и выделенный проект.

Если это не так, вы должны проверить вывод randomiseStudents() Чтобы убедиться, что он возвращает полный список. Ведь, в конце концов, управляющий элемент для этой внутренней петли.


Обновление на основе комментариев:

Похоже, проблема было То, что вы устанавливали квоту над руководителем 0, что делает все свои проекты заблокированы.

Это чистые догадки на моей части, но вы, вероятно, получили один ученик в каждой итерации, потому что проверка всех руководителей произошла после распределения. В этом случае тот, который только что выделил, будет иметь квоту -1, и все остальные квоты будут 0, эффективно остановка все распределения после этого.

В идеале, вы хотите вернуть квоту руководителя к первоначальной стоимости в resetData(). Отказ Если бы это была фиксированная квота (то же самое для каждого руководителя), вы могли бы просто использовать:

for supervisor in supervisors.itervalues():
    supervisor.quota = 7 # for example

Если у каждого руководителя была другая квота, вам нужно будет хранить это вместе с другой информацией (во время инициализации, но не сбрасывающей) как, например, пример supervisor.start_quota. Отказ Тогда вы могли бы использовать:

for supervisor in supervisors.itervalues():
    supervisor.quota = supervisor.start_quota
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top