////
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
////

[[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"]
