[Python] Put n persons in x 2-Beds-Room and y 3-Beds-Room based on preferences

Discussão em 'Python' iniciado por Stack, Maio 10, 2025.

  1. Stack

    Stack Membro Participativo

    I have troubles solving the following Problem for a class-trip:

    There are 54 students who have to be divided into 14 3-bed rooms and 6 2-bed rooms. Each person has one or more favorites with whom he/she would like to share a room.

    preferences = {'studen1': [studnet2, student3], 'student2': [student3, student 1], ...}

    I was able to calculate every possible triple match (in a group of 3 students everyone likes each other back) and normal match (in a group of 2 students everyone likes each other back)

    I thought about maybe trying to calculate every possible combinations of students (or at least the preverences) and try to get the best result by providing points based on how good the rooms are: good 3-person room: 6 points good 2 room: 4 points average 3-person room: 5 points average 3-bed room: 4 points medium bad 3 room: 3 points bad 3er room: 2 points very bad 3-bed room: 1 point medium 2 room: 1 point

    Now I am sorta overwhelmed an don't know how to approach the problem without having the need of using a super-computer ;)

    I am sorry for my very bad code ;) this is my code after calculating the normal and triple matches:

    students_with_room = []
    real_rooms = []

    exit_loop = False

    real_rooms = {'2A': [], '2B': [], '2C': [], '2D': [], '2E': [], '2F': [],'3A': [], '3B': [], '3C': [], '3D': [], '3E': [], '3F': [], '3G': [], '3H': [], '3I': [], '3J': [], '3K': [], '3L': [], '3M': [], '3N': [],}
    for student in students:
    if student not in students_with_room:
    if triple_matches[student] == None:
    for room in real_rooms:
    if real_rooms[room] == [] and '2' in room:
    if len(matches[student]) != 0:
    for i in range(len(matches[student])):
    if len(set([matches[student], student]).intersection(students_with_room)) == 0:
    real_rooms[room] = [matches[student], student]
    students_with_room = students_with_room + [matches[student]]
    students_with_room = students_with_room + [student]
    exit_loop = True
    break
    else:
    pass


    else:
    pass
    if exit_loop == True:
    break
    if real_rooms[room] == [] and '3' in room:
    pass
    exit_loop = False
    else:
    for room in real_rooms:
    if student not in students_with_room:
    if real_rooms[room] == [] and '3' in room:
    real_rooms[room] = [triple_matches[student][0], triple_matches[student][1], student]
    students_with_room = students_with_room + triple_matches[student]
    students_with_room = students_with_room + [student]
    else:
    pass

    for triple_match in triple_matches:
    already_done = False
    if triple_matches[student] == None:
    pass

    else:
    if student in students_with_room:
    already_done = True
    if not already_done:
    students_with_room.append(triple_matches[student][0])
    real_rooms

    Continue reading...

Compartilhe esta Página