Skip to content

Commit 532826e

Browse files
committed
refactor: streamline secondary objective weight calculation in match_meetings
1 parent a3795d7 commit 532826e

1 file changed

Lines changed: 6 additions & 12 deletions

File tree

src/mip_matching/match_meetings.py

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,9 @@
2323
# n^2*x + n*x + h, der n er antall intervjuer, x er en konstant.
2424
def calculate_secondary_objective_weights(num_interviews: int) -> dict[str, float]:
2525
# Vekten for clustering øker kvadratisk med antall intervjuer, for å prioritere det mer når det er mange intervjuer.
26-
clustering_weight = 1/(num_interviews ** 2)
27-
28-
# Vekten for spredning over perioden øker lineært med antall intervjuer, for å sikre at det fortsatt har en betydelig effekt.
29-
firstDay_weight = 1 / num_interviews
30-
31-
return {
32-
"clustering": clustering_weight,
33-
"first_day": firstDay_weight
34-
}
26+
weights = ["clustering", "first_day"]
3527

28+
return {weight_name: 1/(num_interviews**(i+1)) for i, weight_name in enumerate(weights)}
3629

3730
def match_meetings(applicants: set[Applicant], committees: set[Committee]) -> MeetingMatch:
3831
"""Matches meetings and returns a MeetingMatch-object"""
@@ -92,7 +85,7 @@ def match_meetings(applicants: set[Applicant], committees: set[Committee]) -> Me
9285

9386
# Legger til sekundærmål om at man ønsker å sentrere intervjuer rundt CLUSTERING_TIME_BASELINE
9487
# og at man foretrekker intervjuer senere i søknadsperioden
95-
secondary_penalties: list[list[mip.Var]] = [[], []] # List for clustering, list for first_day
88+
secondary_penalties: list[list[mip.Var]] = [[] for _ in range(len(SECONDARY_OBJECTIVE_WEIGHTS))] # List for clustering, list for first_day
9689

9790
# Finn den tidligste og seneste datoen blant alle intervjuer for å normalisere
9891
all_dates = [interval.start for (_, _, interval, _) in m.keys()]
@@ -117,11 +110,12 @@ def match_meetings(applicants: set[Applicant], committees: set[Committee]) -> Me
117110
if interval.start.date() == min_date.date():
118111
secondary_penalties[1].append(
119112
SECONDARY_OBJECTIVE_WEIGHTS["first_day"] * variable) # type: ignore
120-
113+
114+
secondary_penalties_sum = [mip.xsum(penalties) for penalties in secondary_penalties]
121115
# Setter mål til å være maksimering av antall møter
122116
# med sekundærmål om å samle intervjuene og foretrekke senere datoer
123117
model.objective = mip.maximize(
124-
mip.xsum(m.values()) - mip.xsum(mip.xsum(penalties) for penalties in secondary_penalties))
118+
mip.xsum(m.values()) - mip.xsum(mip.xsum(secondary_penalties)))
125119

126120
# Kjør optimeringen
127121
solver_status = model.optimize()

0 commit comments

Comments
 (0)