[[conferenceScheduling]]
= Conference scheduling
:imagesdir: ../..


[[conferenceSchedulingProblemDescription]]
== Problem description

Assign each conference talk to a timeslot and a room, after the talks have been accepted.

image::use-cases-and-examples/conference-scheduling/conferenceSchedulingMilestonesTimeline.png[align="center"]

Timeslots can overlap. It reads/writes to/from an `*.xlsx` file that can be edited with LibreOffice or Excel.

image::use-cases-and-examples/conference-scheduling/conferenceSchedulingProblem.png[align="center"]

Built-in hard constraints:

* Talk type of timeslot: The type of a talk must match the timeslot's talk type.
* Room unavailable timeslots: A talk's room must be available during the talk's timeslot.

Hard constraints (unless configured otherwise):

* Room conflict: Two talks can't use the same room during overlapping timeslots.
* Speaker unavailable timeslots: Every talk's speaker must be available during the talk's timeslot.
* Speaker conflict: Two talks can't share a speaker during overlapping timeslots.
* Talk prerequisite talks: A talk must be scheduled after all its prerequisite talks.
* Talk mutually-exclusive-talks tags: Talks that share such tags must not be scheduled in overlapping timeslots.
* Consecutive talks pause: A speaker who has more than one talk must have a break between them.
* Generic purpose timeslot and room tags
** Speaker required timeslot tags: If a speaker has a required timeslot tag, then all his/her talks must be assigned to a timeslot with that tag.
** Speaker prohibited timeslot tags: If a speaker has a prohibited timeslot tag, then all his/her talks cannot be assigned to a timeslot with that tag.
** Talk required timeslot tags: If a talk has a required timeslot tag, then it must be assigned to a timeslot with that tag.
** Talk prohibited timeslot tags: If a talk has a prohibited timeslot tag, then it cannot be assigned to a timeslot with that tag.
** Speaker required room tags: If a speaker has a required room tag, then all his/her talks must be assigned to a room with that tag.
** Speaker prohibited room tags: If a speaker has a prohibited room tag, then all his/her talks cannot be assigned to a room with that tag.
** Talk required room tags: If a talk has a required room tag, then it must be assigned to a room with that tag.
** Talk prohibited room tags: If a talk has a prohibited room tag, then it cannot be assigned to a room with that tag.

Medium constraints (unless configured otherwise):

* Published timeslot: A published talk must not be scheduled at a different timeslot than currently published.
If a hard constraint's input data changes after publishing (such as speaker unavailability), then this medium constraint will be
minimally broken to attain a new feasible solution.

Soft constraints (unless configured otherwise):

* Published room: Minimize the number of talks scheduled in different rooms than published ones.
* Theme track conflict: Minimize the number of talks that share a same theme tag during overlapping timeslots.
* Theme track room stability: Talks with common theme track tag should be scheduled in the same room throughout the day.
* Sector conflict: Minimize the number of talks that share a same sector tag during overlapping timeslots.
* Content audience level flow violation: For every content tag, schedule the introductory talks before the advanced talks.
* Audience level diversity: For every timeslot, maximize the number of talks with a different audience level.
* Language diversity: For every timeslot, maximize the number of talks with a different language.
* Same day talks: All talks that share a theme track tag or content tag should be scheduled in the minimum number of days
(ideally in the same day).
* Popular talks: Talks with higher `favoriteCount` should be scheduled in larger rooms.
* Crowd control: Talks with higher `crowdControlRisk` should be scheduled in pairs at the same timeslot
 to avoid having most participants going to the same room.
* Generic purpose timeslot and room tags
** Speaker preferred timeslot tag: If a speaker has a preferred timeslot tag, then all his/her talks should be assigned to a timeslot with that tag.
** Speaker undesired timeslot tag: If a speaker has an undesired timeslot tag, then all his/her talks should not be assigned to a timeslot with that tag.
** Talk preferred timeslot tag: If a talk has a preferred timeslot tag, then it should be assigned to a timeslot with that tag.
** Talk undesired timeslot tag: If a talk has an undesired timeslot tag, then it should not be assigned to a timeslot with that tag.
** Speaker preferred room tag: If a speaker has a preferred room tag, then all his/her talks should be assigned to a room with that tag.
** Speaker undesired room tag: If a speaker has an undesired room tag, then all his/her talks should not be assigned to a room with that tag.
** Talk preferred room tag: If a talk has a preferred room tag, then it should be assigned to a room with that tag.
** Talk undesired room tag: If a talk has an undesired room tag, then it should not be assigned to a room with that tag.

Every constraint can be configured to use a different score level (hard/medium/soft) or a different score weight.

image::use-cases-and-examples/conference-scheduling/conferenceSchedulingConstraints.png[align="center"]


[[conferenceSchedulingValueProposition]]
== Value proposition

image::use-cases-and-examples/conference-scheduling/conferenceSchedulingValueProposition.png[align="center"]


[[conferenceSchedulingProblemSize]]
== Problem size

[source,options="nowrap"]
----
18talks-6timeslots-5rooms    has  18 talks,  6 timeslots and  5 rooms with a search space of  10^26.
36talks-12timeslots-5rooms   has  36 talks, 12 timeslots and  5 rooms with a search space of  10^64.
72talks-12timeslots-10rooms  has  72 talks, 12 timeslots and 10 rooms with a search space of 10^149.
108talks-18timeslots-10rooms has 108 talks, 18 timeslots and 10 rooms with a search space of 10^243.
216talks-18timeslots-20rooms has 216 talks, 18 timeslots and 20 rooms with a search space of 10^552.
----


[[conferenceSchedulingArchitecture]]
== Architecture

image::use-cases-and-examples/conference-scheduling/conferenceSchedulingArchitecture.png[align="center"]


[[conferenceSchedulingDomainModel]]
== Domain model

image::use-cases-and-examples/conference-scheduling/conferenceSchedulingClassDiagram.png[align="center"]


[[conferenceSchedulingSearchSpace]]
== Search space

image::use-cases-and-examples/conference-scheduling/conferenceSchedulingOptimalIsImperfect.png[align="center"]

image::use-cases-and-examples/conference-scheduling/conferenceSchedulingSearchSpace.png[align="center"]
