Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@

package ai.timefold.solver.benchmarks.examples.conferencescheduling.app;

import java.io.File;

import ai.timefold.solver.benchmarks.examples.common.app.CommonApp;
import ai.timefold.solver.benchmarks.examples.conferencescheduling.domain.ConferenceSolution;
import ai.timefold.solver.benchmarks.examples.conferencescheduling.persistence.ConferenceSchedulingSolutionFileIO;
Expand All @@ -19,7 +17,6 @@ public class ConferenceSchedulingApp
public static void main(String[] args) {
var app = new ConferenceSchedulingApp();
var solution = app.solve("216talks-18timeslots-20rooms.json");
app.createSolutionFileIO().write(solution, new File("conferencescheduling-216-18-20.json"));
System.out.println("Done: " + solution);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
@JsonIdentityInfo(generator = JacksonUniqueIdGenerator.class)
public class ConferenceConstraintProperties extends AbstractPersistable {

public static final String ROOM_UNAVAILABLE_TIMESLOT = "Room unavailable timeslot";
public static final String ROOM_CONFLICT = "Room conflict";
public static final String SPEAKER_UNAVAILABLE_TIMESLOT = "Speaker unavailable timeslot";
public static final String SPEAKER_CONFLICT = "Speaker conflict";
Expand All @@ -18,31 +17,26 @@ public class ConferenceConstraintProperties extends AbstractPersistable {
public static final String CONSECUTIVE_TALKS_PAUSE = "Consecutive talks pause";
public static final String CROWD_CONTROL = "Crowd control";

public static final String SPEAKER_REQUIRED_TIMESLOT_TAGS = "Speaker required timeslot tags";
public static final String SPEAKER_PROHIBITED_TIMESLOT_TAGS = "Speaker prohibited timeslot tags";
public static final String TALK_REQUIRED_TIMESLOT_TAGS = "Talk required timeslot tags";
public static final String TALK_PROHIBITED_TIMESLOT_TAGS = "Talk prohibited timeslot tags";
public static final String SPEAKER_REQUIRED_ROOM_TAGS = "Speaker required room tags";
public static final String SPEAKER_PROHIBITED_ROOM_TAGS = "Speaker prohibited room tags";
public static final String TALK_REQUIRED_ROOM_TAGS = "Talk required room tags";
public static final String TALK_PROHIBITED_ROOM_TAGS = "Talk prohibited room tags";

public static final String THEME_TRACK_CONFLICT = "Theme track conflict";
public static final String THEME_TRACK_ROOM_STABILITY = "Theme track room stability";
public static final String THEME_TRACK_CONFLICT_SAME_DAY_TALKS = "Same day talks 'Theme track'";
public static final String SECTOR_CONFLICT = "Sector conflict";
public static final String AUDIENCE_TYPE_DIVERSITY = "Audience type diversity";
public static final String AUDIENCE_TYPE_THEME_TRACK_CONFLICT = "Audience type theme track conflict";
public static final String AUDIENCE_LEVEL_DIVERSITY = "Audience level diversity";
public static final String CONTENT_AUDIENCE_LEVEL_FLOW_VIOLATION = "Content audience level flow violation";
public static final String CONTENT_CONFLICT = "Content conflict";
public static final String CONTENT_CONFLICT_SAME_DAY_TALKS = "Same day talks 'Content'";
public static final String LANGUAGE_DIVERSITY = "Language diversity";
public static final String SAME_DAY_TALKS = "Same day talks";
public static final String POPULAR_TALKS = "Popular talks";

public static final String SPEAKER_PREFERRED_TIMESLOT_TAGS = "Speaker preferred timeslot tags";
public static final String SPEAKER_UNDESIRED_TIMESLOT_TAGS = "Speaker undesired timeslot tags";
public static final String TALK_PREFERRED_TIMESLOT_TAGS = "Talk preferred timeslot tags";
public static final String TALK_UNDESIRED_TIMESLOT_TAGS = "Talk undesired timeslot tags";
public static final String SPEAKER_PREFERRED_ROOM_TAGS = "Speaker preferred room tags";
public static final String SPEAKER_UNDESIRED_ROOM_TAGS = "Speaker undesired room tags";
public static final String TALK_PREFERRED_ROOM_TAGS = "Talk preferred room tags";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@

package ai.timefold.solver.benchmarks.examples.conferencescheduling.domain;

import java.util.SequencedSet;
import java.util.Set;

import ai.timefold.solver.benchmarks.examples.common.domain.AbstractPersistable;
Expand All @@ -13,7 +14,7 @@ public class Speaker extends AbstractPersistable {

private String name;

private Set<Timeslot> unavailableTimeslotSet;
private SequencedSet<Timeslot> unavailableTimeslotSet;
private Set<String> preferredTimeslotTagSet;
private Set<String> undesiredTimeslotTagSet;
private Set<String> requiredRoomTagSet;
Expand Down Expand Up @@ -45,11 +46,11 @@ public void setName(String name) {
this.name = name;
}

public Set<Timeslot> getUnavailableTimeslotSet() {
public SequencedSet<Timeslot> getUnavailableTimeslotSet() {
return unavailableTimeslotSet;
}

public void setUnavailableTimeslotSet(Set<Timeslot> unavailableTimeslotSet) {
public void setUnavailableTimeslotSet(SequencedSet<Timeslot> unavailableTimeslotSet) {
this.unavailableTimeslotSet = unavailableTimeslotSet;
}

Expand Down Expand Up @@ -105,7 +106,7 @@ public void setUndesiredRoomTagSet(Set<String> undesiredRoomTagSet) {
// With methods
// ************************************************************************

public Speaker withUnavailableTimeslotSet(Set<Timeslot> unavailableTimeslotTest) {
public Speaker withUnavailableTimeslotSet(SequencedSet<Timeslot> unavailableTimeslotTest) {
this.unavailableTimeslotSet = unavailableTimeslotTest;
return this;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package ai.timefold.solver.benchmarks.examples.conferencescheduling.domain;

import java.util.List;
import java.util.SequencedSet;
import java.util.Set;

import ai.timefold.solver.benchmarks.examples.common.domain.AbstractPersistable;
Expand All @@ -21,18 +22,18 @@ public class Talk extends AbstractPersistable {
private String title;
private TalkType talkType;
private List<Speaker> speakerList;
private Set<String> themeTrackTagSet;
private Set<String> sectorTagSet;
private Set<String> audienceTypeSet;
private SequencedSet<String> themeTrackTagSet;
private SequencedSet<String> sectorTagSet;
private SequencedSet<String> audienceTypeSet;
private int audienceLevel;
private Set<String> contentTagSet;
private SequencedSet<String> contentTagSet;
private String language;
private Set<String> requiredRoomTagSet;
private Set<String> preferredRoomTagSet;
private Set<String> prohibitedRoomTagSet;
private Set<String> undesiredRoomTagSet;
private Set<String> mutuallyExclusiveTalksTagSet;
private Set<Talk> prerequisiteTalkSet;
private SequencedSet<String> requiredRoomTagSet;
private SequencedSet<String> preferredRoomTagSet;
private SequencedSet<String> prohibitedRoomTagSet;
private SequencedSet<String> undesiredRoomTagSet;
private SequencedSet<String> mutuallyExclusiveTalksTagSet;
private SequencedSet<Talk> prerequisiteTalkSet;
private int favoriteCount;
private int crowdControlRisk;

Expand Down Expand Up @@ -226,10 +227,6 @@ public Integer getDurationInMinutes() {
return timeslot == null ? null : timeslot.getDurationInMinutes();
}

public boolean overlapsTime(Talk other) {
return timeslot != null && other.getTimeslot() != null && timeslot.overlapsTime(other.getTimeslot());
}

public int overlappingDurationInMinutes(Talk other) {
if (timeslot == null) {
return 0;
Expand Down Expand Up @@ -301,27 +298,27 @@ public List<Speaker> getSpeakerList() {
return speakerList;
}

public Set<String> getThemeTrackTagSet() {
public SequencedSet<String> getThemeTrackTagSet() {
return themeTrackTagSet;
}

public void setThemeTrackTagSet(Set<String> themeTrackTagSet) {
public void setThemeTrackTagSet(SequencedSet<String> themeTrackTagSet) {
this.themeTrackTagSet = themeTrackTagSet;
}

public Set<String> getSectorTagSet() {
public SequencedSet<String> getSectorTagSet() {
return sectorTagSet;
}

public void setSectorTagSet(Set<String> sectorTagSet) {
public void setSectorTagSet(SequencedSet<String> sectorTagSet) {
this.sectorTagSet = sectorTagSet;
}

public Set<String> getAudienceTypeSet() {
public SequencedSet<String> getAudienceTypeSet() {
return audienceTypeSet;
}

public void setAudienceTypeSet(Set<String> audienceTypeSet) {
public void setAudienceTypeSet(SequencedSet<String> audienceTypeSet) {
this.audienceTypeSet = audienceTypeSet;
}

Expand All @@ -333,11 +330,11 @@ public void setAudienceLevel(int audienceLevel) {
this.audienceLevel = audienceLevel;
}

public Set<String> getContentTagSet() {
public SequencedSet<String> getContentTagSet() {
return contentTagSet;
}

public void setContentTagSet(Set<String> contentTagSet) {
public void setContentTagSet(SequencedSet<String> contentTagSet) {
this.contentTagSet = contentTagSet;
}

Expand All @@ -349,35 +346,35 @@ public void setSpeakerList(List<Speaker> speakerList) {
this.speakerList = speakerList;
}

public Set<String> getRequiredRoomTagSet() {
public SequencedSet<String> getRequiredRoomTagSet() {
return requiredRoomTagSet;
}

public void setRequiredRoomTagSet(Set<String> requiredRoomTagSet) {
public void setRequiredRoomTagSet(SequencedSet<String> requiredRoomTagSet) {
this.requiredRoomTagSet = requiredRoomTagSet;
}

public Set<String> getPreferredRoomTagSet() {
public SequencedSet<String> getPreferredRoomTagSet() {
return preferredRoomTagSet;
}

public void setPreferredRoomTagSet(Set<String> preferredRoomTagSet) {
public void setPreferredRoomTagSet(SequencedSet<String> preferredRoomTagSet) {
this.preferredRoomTagSet = preferredRoomTagSet;
}

public Set<String> getProhibitedRoomTagSet() {
public SequencedSet<String> getProhibitedRoomTagSet() {
return prohibitedRoomTagSet;
}

public void setProhibitedRoomTagSet(Set<String> prohibitedRoomTagSet) {
public void setProhibitedRoomTagSet(SequencedSet<String> prohibitedRoomTagSet) {
this.prohibitedRoomTagSet = prohibitedRoomTagSet;
}

public Set<String> getUndesiredRoomTagSet() {
public SequencedSet<String> getUndesiredRoomTagSet() {
return undesiredRoomTagSet;
}

public void setUndesiredRoomTagSet(Set<String> undesiredRoomTagSet) {
public void setUndesiredRoomTagSet(SequencedSet<String> undesiredRoomTagSet) {
this.undesiredRoomTagSet = undesiredRoomTagSet;
}

Expand Down Expand Up @@ -405,19 +402,19 @@ public void setRoom(Room room) {
this.room = room;
}

public Set<String> getMutuallyExclusiveTalksTagSet() {
public SequencedSet<String> getMutuallyExclusiveTalksTagSet() {
return mutuallyExclusiveTalksTagSet;
}

public void setMutuallyExclusiveTalksTagSet(Set<String> mutuallyExclusiveTalksTagSet) {
public void setMutuallyExclusiveTalksTagSet(SequencedSet<String> mutuallyExclusiveTalksTagSet) {
this.mutuallyExclusiveTalksTagSet = mutuallyExclusiveTalksTagSet;
}

public Set<Talk> getPrerequisiteTalkSet() {
public SequencedSet<Talk> getPrerequisiteTalkSet() {
return prerequisiteTalkSet;
}

public void setPrerequisiteTalkSet(Set<Talk> prerequisiteTalkSet) {
public void setPrerequisiteTalkSet(SequencedSet<Talk> prerequisiteTalkSet) {
this.prerequisiteTalkSet = prerequisiteTalkSet;
}

Expand Down Expand Up @@ -451,17 +448,17 @@ public Talk withSpeakerList(List<Speaker> speakerList) {
return this;
}

public Talk withThemeTrackTagSet(Set<String> themeTrackTagSet) {
public Talk withThemeTrackTagSet(SequencedSet<String> themeTrackTagSet) {
this.themeTrackTagSet = themeTrackTagSet;
return this;
}

public Talk withSectorTagSet(Set<String> sectorTagSet) {
public Talk withSectorTagSet(SequencedSet<String> sectorTagSet) {
this.sectorTagSet = sectorTagSet;
return this;
}

public Talk withAudienceTypeSet(Set<String> audienceTypeSet) {
public Talk withAudienceTypeSet(SequencedSet<String> audienceTypeSet) {
this.audienceTypeSet = audienceTypeSet;
return this;
}
Expand All @@ -471,7 +468,7 @@ public Talk withAudienceLevel(int audienceLevel) {
return this;
}

public Talk withContentTagSet(Set<String> contentTagSet) {
public Talk withContentTagSet(SequencedSet<String> contentTagSet) {
this.contentTagSet = contentTagSet;
return this;
}
Expand All @@ -481,32 +478,32 @@ public Talk withLanguage(String language) {
return this;
}

public Talk withRequiredRoomTagSet(Set<String> requiredRoomTagSet) {
public Talk withRequiredRoomTagSet(SequencedSet<String> requiredRoomTagSet) {
this.requiredRoomTagSet = requiredRoomTagSet;
return this;
}

public Talk withPreferredRoomTagSet(Set<String> preferredRoomTagSet) {
public Talk withPreferredRoomTagSet(SequencedSet<String> preferredRoomTagSet) {
this.preferredRoomTagSet = preferredRoomTagSet;
return this;
}

public Talk withProhibitedRoomTagSet(Set<String> prohibitedRoomTagSet) {
public Talk withProhibitedRoomTagSet(SequencedSet<String> prohibitedRoomTagSet) {
this.prohibitedRoomTagSet = prohibitedRoomTagSet;
return this;
}

public Talk withUndesiredRoomTagSet(Set<String> undesiredRoomTagSet) {
public Talk withUndesiredRoomTagSet(SequencedSet<String> undesiredRoomTagSet) {
this.undesiredRoomTagSet = undesiredRoomTagSet;
return this;
}

public Talk withMutuallyExclusiveTalksTagSet(Set<String> mutuallyExclusiveTalksTagSet) {
public Talk withMutuallyExclusiveTalksTagSet(SequencedSet<String> mutuallyExclusiveTalksTagSet) {
this.mutuallyExclusiveTalksTagSet = mutuallyExclusiveTalksTagSet;
return this;
}

public Talk withPrerequisiteTalksCodesSet(Set<Talk> prerequisiteTalksCodesSet) {
public Talk withPrerequisiteTalksCodesSet(SequencedSet<Talk> prerequisiteTalksCodesSet) {
this.prerequisiteTalkSet = prerequisiteTalksCodesSet;
return this;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Random;
import java.util.SequencedSet;
import java.util.Set;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -333,7 +334,7 @@ private void createSpeakerList(ConferenceSolution solution, int speakerListSize)
for (var i = 0; i < speakerListSize; i++) {
var speaker = new Speaker(i);
speaker.setName(speakerNameGenerator.generateNextValue());
Set<Timeslot> unavailableTimeslotSet;
SequencedSet<Timeslot> unavailableTimeslotSet;
var preferredTimeslotTagSet = new LinkedHashSet<String>();
var undesiredTimeslotTagSet = new LinkedHashSet<String>();
var timeslotList = solution.getTimeslotList();
Expand Down Expand Up @@ -411,7 +412,8 @@ private void createTalkList(ConferenceSolution solution, int talkListSize) {
if (random.nextDouble() < 0.20) {
sectorTagSet.add(sectorTagOptions.get(random.nextInt(sectorTagOptions.size())));
}
talk.setAudienceTypeSet(Collections.singleton(audienceTypeOptions.get(random.nextInt(audienceTypeOptions.size()))));
talk.setAudienceTypeSet(new LinkedHashSet<>(
Collections.singleton(audienceTypeOptions.get(random.nextInt(audienceTypeOptions.size())))));
talk.setAudienceLevel(1 + random.nextInt(3));
var contentTagSet = new LinkedHashSet<String>();
for (var contentTagOption : contentTagOptions) {
Expand Down
Loading
Loading