Skip to content

Commit e13018d

Browse files
committed
perf: more efficient constraints for ConferenceSchedulingConstraintProvider
1 parent a71105d commit e13018d

File tree

1 file changed

+19
-20
lines changed

1 file changed

+19
-20
lines changed

src/main/java/ai/timefold/solver/benchmarks/examples/conferencescheduling/score/ConferenceSchedulingConstraintProvider.java

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -282,10 +282,9 @@ Constraint themeTrackConflict(ConstraintFactory factory) {
282282

283283
Constraint themeTrackRoomStability(ConstraintFactory factory) {
284284
return factory.forEachUniquePair(Talk.class,
285-
equal(talk -> talk.getTimeslot().getStartDateTime().toLocalDate()))
285+
equal(talk -> talk.getTimeslot().getStartDateTime().toLocalDate()),
286+
filtering((talk1, talk2) -> !talk1.getRoom().equals(talk2.getRoom())))
286287
.expand((talk1, talk2) -> talk2.overlappingThemeTrackCount(talk1))
287-
.filter((talk1, talk2, overlappingTrackCount) -> overlappingTrackCount > 0
288-
&& !talk1.getRoom().equals(talk2.getRoom()))
289288
.penalize(HardSoftScore.ofSoft(10),
290289
(talk1, talk2, overlappingTrackCount) -> overlappingTrackCount * talk1.combinedDurationInMinutes(talk2))
291290
.asConstraint(THEME_TRACK_ROOM_STABILITY);
@@ -316,15 +315,17 @@ Constraint audienceTypeDiversity(ConstraintFactory factory) {
316315
Constraint audienceTypeThemeTrackConflict(ConstraintFactory factory) {
317316
return factory.forEachUniquePair(Talk.class,
318317
overlapping(t -> t.getTimeslot().getStartDateTime(), t -> t.getTimeslot().getEndDateTime()))
319-
.map((talk1, talk2) -> talk1,
320-
(talk1, talk2) -> talk2,
321-
Talk::overlappingThemeTrackCount,
322-
Talk::overlappingAudienceTypeCount)
323-
.filter((talk1, talk2, overlappingTrackCount, overlappingTypeCount) -> overlappingTrackCount > 0
324-
&& overlappingTypeCount > 0)
318+
.expand((talk1, talk2) -> {
319+
var overlappingThemeTrackCount = talk2.overlappingThemeTrackCount(talk1);
320+
if (overlappingThemeTrackCount == 0) {
321+
return 0;
322+
}
323+
var overlappingAudienceTypeCount = talk2.overlappingAudienceTypeCount(talk1);
324+
return overlappingAudienceTypeCount * overlappingThemeTrackCount;
325+
})
326+
.filter((talk1, talk2, overlap) -> overlap > 0)
325327
.penalize(HardSoftScore.ofSoft(1),
326-
(talk1, talk2, overlappingTrackCount, overlappingTypeCount) -> overlappingTrackCount
327-
* overlappingTypeCount * talk1.overlappingDurationInMinutes(talk2))
328+
(talk1, talk2, overlap) -> overlap * talk1.overlappingDurationInMinutes(talk2))
328329
.asConstraint(AUDIENCE_TYPE_THEME_TRACK_CONFLICT);
329330
}
330331

@@ -372,16 +373,14 @@ Constraint languageDiversity(ConstraintFactory factory) {
372373
Constraint sameDayTalks(ConstraintFactory factory) {
373374
return factory.forEachUniquePair(Talk.class)
374375
.filter((talk1, talk2) -> !talk1.getTimeslot().isOnSameDayAs(talk2.getTimeslot()))
375-
.map((talk1, talk2) -> talk1,
376-
(talk1, talk2) -> talk2,
377-
Talk::overlappingContentCount,
378-
Talk::overlappingThemeTrackCount)
379-
.filter((talk1, talk2, overlappingContentCount, overlappingThemeTrackCount) -> overlappingContentCount > 0
380-
|| overlappingThemeTrackCount > 0)
376+
.expand((talk1, talk2) -> {
377+
var overlappingContentCount = talk2.overlappingContentCount(talk1);
378+
var overlappingThemeTrackCount = talk2.overlappingThemeTrackCount(talk1);
379+
return overlappingContentCount + overlappingThemeTrackCount;
380+
})
381+
.filter((talk1, talk2, overlap) -> overlap > 0)
381382
.penalize(HardSoftScore.ofSoft(10),
382-
(talk1, talk2, overlappingContentCount,
383-
overlappingThemeTrackCount) -> (overlappingContentCount + overlappingThemeTrackCount)
384-
* talk1.combinedDurationInMinutes(talk2))
383+
(talk1, talk2, overlap) -> overlap * talk1.combinedDurationInMinutes(talk2))
385384
.asConstraint(SAME_DAY_TALKS);
386385
}
387386

0 commit comments

Comments
 (0)