У меня трудно получить все классные комнаты, которые будут назначены в класс для проблемы с заданием комнаты. Я использую сетку, рассчитанную на основе классовой емкости и комнатной емкости (значения 0-1). В частности, он оставляет много классов, не назначенными, даже когда есть комната, в которой они могут разместить их (особенно комнаты, в которых содержится 110, поскольку самая высокая классовая мощность составляет 90). Я пробовал наказывать незнашиваемые занятия, но каждый раз получаю одинаковую оценку максимизации, поэтому что -то очень сломано. Любая справка оценена!
sinf id < /th>
term < /th>
Код субъекта < / th>
номер каталога < /th>
cource < /th>
раздел #< /th>
тип секции < /th>
title /tophy < /th>
шаблон встречи < /th>
Встречи < /th>
Инструктор < /th>
комната < /th>
Inst. Метод < /th>
credit hrs < /th>
режим класса < /th>
Максимальная регистрация < /th>
RM CAP запрос < /th>
встречает < /th>
< /tr>
< /thead>
12345 < /td>
Fall 2024 < /td>
ali < /td>
777 < /td> ali 777 < /td>
1 < /td>
лекция < /td>
< /td>
M 6 PM-9PM < /td>
M 6 PM-9PM < /td>
В ожидании < /td>
Общая комната назначения < /td>
лично < /td>
3 < /td>
Graded (a-e, i) < /td>
< td> 900 < /td>
900 < /td>
< /td>
< /tr>
< td> 16264 < /td>
Fall 2024 < /td>
mgt < /td>
3030 < /td>
Mgt 3030 < /td>
5 < /td>
лекция < /td>
< /td>
tth 10:45 AM-12:05PM < /td>
TTH 10:45 AM-12:05 PM < /td>
06018334 < /td>
Общее Комната назначения
лично
3
Graded (a-e, i)
80 < /td>
80 < /td>
< /td>
< /tr>
new < /td>
Fall 2024 < /td>
fin < /td>
2020 < /td>
FIN 2020 < /td>
5 < /td>
лекция < /td>
< /td>
TD> MW 9:10 AM-10:30 < /td>
MW 9:10 AM-10:30 < /td>
В ожидании < /td>
< TD> Общая комната назначения
лично
3
Graded (a-e, i)
90 < /td>
90 < /td>
< /td>
< /tr>
16576 < /td>
Fall 2024 < /td>
acc < /td>
2100 < /td>
acc 2100 < /td>
1 < /td>
лекция < /td>
< /td>
TTH 10:45 AM-12:05 PM
TTH 10:45 AM-12:05 PM
В ожидании
Общая комната назначения < /td>
лично < /td>
3 < /td>
Graded (a-e, i) < /td>
250 < /td>
250 < /td>
< /td>
< /tr>
new < /td>
Fall 2024 < /td>
fin < /td>
2120 < /td>
fin 2120 < /td>
1 < /td>
лекция < /td>
< /td >
M 6 PM-9PM < /td>
M 6 PM-9PM < /td>
06063522 < /td>
Общая комната назначения
лично
3
Graded (a-e, i) 40 < /td>
40 < /td>
< /td>
< /tr>
7464 < /td>
Fall 2024 < /td>
mkt < /td>
4840 < /td>
MKT 4840 < /td>
1 < /td>
лекция < /td>
< /td>
TTH 9:10 AM-10:30 < /TD>
TTH 9:10 AM-10:30 < /td>
00253981 < /td>
Общая комната назначения
лично
3
Graded (a-e, i)
60 < /td>
60 < /td>
< /td>
< /tr>
< tr>
9888 < /td>
Fall 2024 < /td>
econ < /td>
2011 < /td >
econ 2011 < /td>
1 < /td>
лекция < /td>
< /td> MW 9:10 AM-10:30 < /td>
MW 9:10 AM-10:30 < /td>
06031544 < /td> < Br /> Общая комната назначения < /td>
лично < /td>
3 < /td>
Graded (a-e, i )
40
40
16582 < /td>
Fall 2024 < /td>
acc < /td>
2100
acc 2100
5
лекция
tth 9:10 утра 10:30 < /td>
tth 9:10 утра 10:30 < /td>
В ожидании < / td>
Общая комната назначения < /td>
лично < /td>
3 < /td>
Graded ( A-e, i)
80
80
new < /td>
Fall 2024 < /td>
os < /td>
< td> 3440 < /td>
OS 3440 < /td>
13 < /td>
лекция < /td>
< /td>
w 6 pm-9pm < /td>
w 6 pm-9pm < /td>
ожидая < /td>
Общая комната назначения < /td>
лично < /td>
3 < /td>
Graded (a-e, i) < /td>
(a-e, i) < /td>
90 < /td>
90 < /td>
< /td>
< /tr>
11975 < /td>
Fall 2024 < /td>
mgt < /td>
3810 < / / td>
Mgt 3810 < /td>
7 < /td>
лекция < /td>
< /td>
W 9:10 AM-10:30 < /td>
W 9:10 AM-10:30 < /td>
00332929 < /td>
Общая комната назначения < /td>
hybrid < /td>
3 < /td>
Graded (a-e, i )
32
32
< /tbody>
< /table> < /div>
комнаты и емкости < /h1>
bld c 105 62
bld c 106 56
bld c 107 56
bld c 108 42
bld c 203 56
bld c 204 22
bld c 206 32
bld c 207 32 bld c 208 42
bld c 210 48
bld c 211 30
bld c 212 56
bld c 301 40
bld c 302 30
Bld c 303 25
bld c 304 40
bld c 305 56
bld c 435 8
bld r 105 40
bld r 110 36
bld R 115 102
Bld R 125 10
bld r 205 80
bld r 210 80
bld r 212 6
bld r 214 6
bld r 215 102
bld r 216 6
bld r 218 6
bld r 220 6
bld r 222 6
bld r 224 6
bld r 226 6 bld r 228 6
bld r 230 6
bld r 232 6
bld r 250 12
bld b 110 110
bld b 1100a 80
Bld B 1110 268
Bld B 1170 80
Bld B 1180 80
Bld B 130 80
Bld B 160 110
Bld B 161 8
Bld B 163 8
Bld B 165 8
Bld B 167 8
Bld B 169 8
Bld B 170 110
Bld B 171 8
Bld B 173 8
bld b 175 8
bld b 177 8
bld b 180 110
bld b 181 14
bld b 183 8
bld b 2100a 20 bld b 3106 62
bld b 3112 1
bld b 3130 30
bld b 3153 50
bld b 3157 10
bld b 3160 62
Bld B 3170 90
Bld B 3180 80
Bld B 5100d 50
Bld B 5122 4
Bld B 5123 6
Bld B 5125 6
bld B 5127 6
Bld B 5130 83
Bld B 5134 4
Bld B 5140 50
Bld B 5155 8
Bld B 5160 80
Bld B 5160a 40
bld b 5160b 40
bld b 5161 8
bld b 5163 8
bld b 5165 8
bld b 5167 8
bld b 5169 8 bld b 5170 80
bld b 5175 15
bld b 5180 80
bld b 7112 20
bld b 7122 12
bld b 7170 60
Bld B 7175 12
Bld B 7177 10
Bld B 7180 60
Bld B 8159 7
Bld B Ballroom 120 < /p>
# Mount Google Drive
from google.colab import drive
drive.mount('/content/drive')
#/content/drive/My Drive/Work Projects/Projects/Scheduling/Ali Chaos/CLSS_FA25_sample.xlsx'
# Define the paths to the files
this_year_input_file_path = '/content/drive/My Drive/WorkProjects/StackOverflowHelp/ClassSchedule_sample.xlsx'
capacity_file_path = '/content/drive/My Drive/WorkProjects/StackOverflowHelp/RoomCapacities.xlsx'
# Load the input Excel files into pandas DataFrames
print("Loading data from Excel files...")
this_year_df = pd.read_excel(this_year_input_file_path)
capacity_df = pd.read_excel(capacity_file_path)
# Process data
print("Processing this year's data...")
this_year_df = this_year_df[~this_year_df['Room'].isin(["No Meeting Pattern", "ONLINE", "CANVAS"])]
this_year_df['Class'] = this_year_df['Course'] + ' - ' + this_year_df['Section #'].astype(str).str.zfill(3)
# Split 'Meeting Pattern' into 'Days' and 'Times'
def split_meeting_pattern(meeting_pattern):
if pd.isna(meeting_pattern):
return pd.Series([None, None])
try:
parts = meeting_pattern.split(' ', 1)
if len(parts) == 2:
days, time_range = parts
start_time, end_time = time_range.split('-')
# Fix start time if minutes are missing
if start_time[-2:] in ['am', 'pm'] and ':' not in start_time:
start_time = start_time[:-2] + ':00' + start_time[-2:]
# Fix end time if minutes are missing
if end_time[-2:] in ['am', 'pm'] and ':' not in end_time:
end_time = end_time[:-2] + ':00' + end_time[-2:]
time_range = start_time + '-' + end_time # Recombine
return pd.Series([days, time_range])
else:
days, time_range = parts[0], None
return pd.Series([days, time_range])
except Exception as e:
print(f"Error splitting meeting pattern '{meeting_pattern}': {e}")
return pd.Series([None, None])
print("Splitting meeting patterns...")
this_year_df[['Days', 'Times']] = this_year_df['Meeting Pattern'].apply(split_meeting_pattern)
this_year_df_filtered = this_year_df[['Class', 'Days', 'Times', 'Meetings', 'Instructor', 'Room', 'Rm Cap Request']]
# Save DataFrames to Excel files
print("Saving DataFrames to Excel files...")
output_folder = '/content/drive/My Drive/WorkProjects/StackOverflowHelp/Output/'
this_year_output_file = output_folder + 'this_year_df_filtered.xlsx'
capacity_output_file = output_folder + 'capacity_df.xlsx'
# Create the output folder if it does not exist
if not os.path.exists(output_folder):
os.makedirs(output_folder)
this_year_df_filtered.to_excel(this_year_output_file, index=False)
capacity_df.to_excel(capacity_output_file, index=False)
print("Files saved:")
print(f"This year DataFrame: {this_year_output_file}")
print(f"Capacity DataFrame: {capacity_output_file}")
# Check DataFrame shapes and content
print("Checking DataFrame shapes and content...")
print(f"this_year_df shape: {this_year_df.shape}")
print(f"this_year_df_filtered shape: {this_year_df_filtered.shape}")
print(f"capacity_df shape: {capacity_df.shape}")
print(this_year_df_filtered.head())
print(capacity_df.head())
< /code>
Создание сетки оценки < /h3>
#Score Grid based on only Capacity Match
import pandas as pd
import re
# Initialize the grid with zeros and default scores
print("Initializing the grid...")
classes = this_year_df_filtered['Class'].tolist()
rooms = capacity_df['Room'].astype(str)
grid = pd.DataFrame(0, index=classes, columns=rooms)
print(grid)
# Room capacities
room_capacity = dict(zip(capacity_df['Room'].astype(str), capacity_df['Capacity']))
for c in classes:
if not this_year_df_filtered[this_year_df_filtered['Class'] == c].empty:
max_enrollment = this_year_df_filtered[this_year_df_filtered['Class'] == c].iloc[0]['Rm Cap Request'] #max class enrollment
for r in rooms:
if room_capacity[r] >= max_enrollment: # Room can accommodate the class
utilization = max_enrollment / room_capacity[r]
grid.at[c, r] = utilization
else: # Room cannot accommodate the class
grid.at[c, r] = 0
# Save the match score grid to an Excel file
grid_output_file = output_folder + 'match_score_grid.xlsx'
grid.to_excel(grid_output_file)
print(f"Match Score Grid has been saved to {grid_output_file}")
< /code>
#time преобразовать функцию < /p>
def time_to_minutes(time_str):
if time_str is None:
return None
time_str = time_str.strip().lower()
if time_str[-2:] not in ['am', 'pm']:
time_str += 'am'
period = time_str[-2:]
# Handle potential multiple colons by splitting only on the first one
time_parts = time_str[:-2].split(':', 1) # Split only once
if len(time_parts) == 2:
# If minutes are missing, consider it 0
try:
hours, minutes = map(int, time_parts)
except ValueError:
hours = int(time_parts[0])
minutes = 0 # Consider minutes to be 0
else:
hours = int(time_parts[0])
minutes = 0
if period == 'pm' and hours != 12:
hours += 12
if period == 'am' and hours == 12:
hours = 0
return hours * 60 + minutes
# Function to check for time overlap
def time_overlap(time1, time2):
if time1 is None or time2 is None:
return False
days1, hours1 = time1
days2, hours2 = time2
if not set(days1).isdisjoint(days2):
start1, end1 = map(time_to_minutes, hours1.split('-'))
start2, end2 = map(time_to_minutes, hours2.split('-'))
return not (end1
Подробнее здесь: https://stackoverflow.com/questions/793 ... preventing