2323# n^2*x + n*x + h, der n er antall intervjuer, x er en konstant.
2424def 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
3730def 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