discrete_optimization.workforce.scheduling.transformations package

Submodules

discrete_optimization.workforce.scheduling.transformations.to_fjsp module

Transformation from Workforce Scheduling to Flexible Job Shop (FJSP).

Teams are mapped to machines, tasks to operations.

class discrete_optimization.workforce.scheduling.transformations.to_fjsp.WorkforceSchedulingToFjspTransformation[source]

Bases: ProblemTransformation[AllocSchedulingProblem, AllocSchedulingSolution, FJobShopProblem, AnyShopSolution]

Transform Workforce Scheduling to Flexible Job Shop.

Mapping: - Tasks → Operations (each task becomes a single-operation job) - Teams → Machines - Available teams for task → Eligible machines for operation - Team calendars → Machine availability - Precedence → Job/operation precedence

This transformation is LOSSY: - Jobs are artificially created (one per task) - Some workforce-specific constraints lost - Cumulative resources ignored

back_transform_solution(solution: AnyShopSolution, source_problem: AllocSchedulingProblem) AllocSchedulingSolution[source]

Transform FJSP solution back to Workforce Scheduling.

Parameters:
  • solution – FJobShopSolution

  • source_problem – Original AllocSchedulingProblem

Returns:

Equivalent AllocSchedulingSolution

forward_transform_solution(solution: AllocSchedulingSolution, target_problem: FJobShopProblem) AnyShopSolution | None[source]

Transform Workforce Scheduling solution to FJSP (for warmstart).

Parameters:
  • solution – AllocSchedulingSolution

  • target_problem – Target FJobShopProblem

Returns:

Equivalent FJobShopSolution

get_forward_metadata() TransformationMetadata[source]

Metadata for forward problem transformation (WorkforceScheduling → FJSP).

This direction is LOSSY.

transform_problem(source_problem: AllocSchedulingProblem) FJobShopProblem[source]

Transform Workforce Scheduling to FJSP.

Parameters:

source_problem – AllocSchedulingProblem instance

Returns:

Equivalent FJobShopProblem

discrete_optimization.workforce.scheduling.transformations.to_multiskill module

Transformation from Workforce Scheduling to Multiskill RCPSP.

This provides an alternative to the standard RCPSP transformation, mapping teams directly to employees (workers) in multiskill RCPSP.

class discrete_optimization.workforce.scheduling.transformations.to_multiskill.WorkforceSchedulingToMultiskillTransformation[source]

Bases: ProblemTransformation[AllocSchedulingProblem, AllocSchedulingSolution, MultiskillRcpspProblem, MultiskillRcpspSolution]

Transform Workforce Scheduling to Multiskill RCPSP.

Mapping: - Tasks → Tasks - Teams → Employees/Workers (dict indexed by team name) - Team availability → Employee calendars - Task duration → Task duration - Precedence → Task successors - Available teams for activity → Skills (ONE skill per unique eligibility pattern)

Skill Mapping Strategy: Each unique set of eligible teams gets ONE skill. All teams in that set possess that skill. When a task requires that skill, ANY employee (team) with the skill can perform it. This correctly models “task needs one team from eligible set”.

Example: - Task A can be done by Team1 OR Team2 → Skill_A - Task B can be done by Team1 OR Team2 → Skill_A (same eligibility) - Task C can be done by Team3 → Skill_C - Team1 and Team2 have Skill_A; Team3 has Skill_C

This transformation is LOSSY: - Same_allocation constraints are approximated - Cumulative resource consumption may be lost

back_transform_solution(solution: MultiskillRcpspSolution, source_problem: AllocSchedulingProblem) AllocSchedulingSolution[source]

Transform Multiskill RCPSP solution back to Workforce Scheduling.

Parameters:
  • solution – MultiskillRcpspSolution

  • source_problem – Original AllocSchedulingProblem

Returns:

Equivalent AllocSchedulingSolution

forward_transform_solution(solution: AllocSchedulingSolution, target_problem: MultiskillRcpspProblem) MultiskillRcpspSolution | None[source]

Transform Workforce Scheduling solution to Multiskill RCPSP (for warmstart).

Parameters:
  • solution – AllocSchedulingSolution

  • target_problem – Target MultiskillRcpspProblem

Returns:

Equivalent MultiskillRcpspSolution

get_forward_metadata() TransformationMetadata[source]

Metadata for forward problem transformation (WorkforceScheduling → MultiskillRCPSP).

This direction is LOSSY but provides access to multiskill RCPSP solvers.

transform_problem(source_problem: AllocSchedulingProblem) MultiskillRcpspProblem[source]

Transform Workforce Scheduling to Multiskill RCPSP.

Parameters:

source_problem – AllocSchedulingProblem instance

Returns:

Equivalent MultiskillRcpspProblem

discrete_optimization.workforce.scheduling.transformations.to_rcpsp module

Transformation from Workforce Scheduling to RCPSP.

class discrete_optimization.workforce.scheduling.transformations.to_rcpsp.WorkforceSchedulingToRcpspTransformation(build_calendar: bool = True, add_window_time_constraint: bool = True, add_additional_constraint: bool = True)[source]

Bases: ProblemTransformation[AllocSchedulingProblem, AllocSchedulingSolution, RcpspProblem, RcpspSolution]

Transform Workforce Scheduling to RCPSP (Resource-Constrained Project Scheduling).

Mapping: - Tasks → RCPSP tasks - Teams → Modes for each task - Team availability calendars → Resource calendars - Task duration → Task duration in each mode - Precedence constraints → RCPSP successors - Time windows → Start/end time windows

This transformation is EXACT: - All workforce scheduling constraints are preserved in RCPSP formulation - Team assignment becomes mode selection in RCPSP

back_transform_solution(solution: RcpspSolution, source_problem: AllocSchedulingProblem) AllocSchedulingSolution[source]

Transform RCPSP solution back to Workforce Scheduling solution.

Parameters:
  • solution – RCPSP solution

  • source_problem – Original AllocSchedulingProblem

Returns:

Equivalent AllocSchedulingSolution

forward_transform_solution(solution: AllocSchedulingSolution, target_problem: RcpspProblem) RcpspSolution | None[source]

Transform Workforce Scheduling solution to RCPSP solution (for warmstart).

Parameters:
  • solution – AllocSchedulingSolution

  • target_problem – Target RCPSP problem

Returns:

Equivalent RCPSP solution for warmstart

get_forward_metadata() TransformationMetadata[source]

Metadata for forward problem transformation (WorkforceScheduling → RCPSP).

This direction is EXACT: all workforce constraints map to RCPSP constraints.

transform_problem(source_problem: AllocSchedulingProblem) RcpspProblem[source]

Transform Workforce Scheduling to RCPSP.

Parameters:

source_problem – AllocSchedulingProblem instance

Returns:

Equivalent RCPSP problem

Module contents

Transformations from Workforce Scheduling to other problems.

class discrete_optimization.workforce.scheduling.transformations.WorkforceSchedulingToFjspTransformation[source]

Bases: ProblemTransformation[AllocSchedulingProblem, AllocSchedulingSolution, FJobShopProblem, AnyShopSolution]

Transform Workforce Scheduling to Flexible Job Shop.

Mapping: - Tasks → Operations (each task becomes a single-operation job) - Teams → Machines - Available teams for task → Eligible machines for operation - Team calendars → Machine availability - Precedence → Job/operation precedence

This transformation is LOSSY: - Jobs are artificially created (one per task) - Some workforce-specific constraints lost - Cumulative resources ignored

back_transform_solution(solution: AnyShopSolution, source_problem: AllocSchedulingProblem) AllocSchedulingSolution[source]

Transform FJSP solution back to Workforce Scheduling.

Parameters:
  • solution – FJobShopSolution

  • source_problem – Original AllocSchedulingProblem

Returns:

Equivalent AllocSchedulingSolution

forward_transform_solution(solution: AllocSchedulingSolution, target_problem: FJobShopProblem) AnyShopSolution | None[source]

Transform Workforce Scheduling solution to FJSP (for warmstart).

Parameters:
  • solution – AllocSchedulingSolution

  • target_problem – Target FJobShopProblem

Returns:

Equivalent FJobShopSolution

get_forward_metadata() TransformationMetadata[source]

Metadata for forward problem transformation (WorkforceScheduling → FJSP).

This direction is LOSSY.

transform_problem(source_problem: AllocSchedulingProblem) FJobShopProblem[source]

Transform Workforce Scheduling to FJSP.

Parameters:

source_problem – AllocSchedulingProblem instance

Returns:

Equivalent FJobShopProblem

class discrete_optimization.workforce.scheduling.transformations.WorkforceSchedulingToMultiskillTransformation[source]

Bases: ProblemTransformation[AllocSchedulingProblem, AllocSchedulingSolution, MultiskillRcpspProblem, MultiskillRcpspSolution]

Transform Workforce Scheduling to Multiskill RCPSP.

Mapping: - Tasks → Tasks - Teams → Employees/Workers (dict indexed by team name) - Team availability → Employee calendars - Task duration → Task duration - Precedence → Task successors - Available teams for activity → Skills (ONE skill per unique eligibility pattern)

Skill Mapping Strategy: Each unique set of eligible teams gets ONE skill. All teams in that set possess that skill. When a task requires that skill, ANY employee (team) with the skill can perform it. This correctly models “task needs one team from eligible set”.

Example: - Task A can be done by Team1 OR Team2 → Skill_A - Task B can be done by Team1 OR Team2 → Skill_A (same eligibility) - Task C can be done by Team3 → Skill_C - Team1 and Team2 have Skill_A; Team3 has Skill_C

This transformation is LOSSY: - Same_allocation constraints are approximated - Cumulative resource consumption may be lost

back_transform_solution(solution: MultiskillRcpspSolution, source_problem: AllocSchedulingProblem) AllocSchedulingSolution[source]

Transform Multiskill RCPSP solution back to Workforce Scheduling.

Parameters:
  • solution – MultiskillRcpspSolution

  • source_problem – Original AllocSchedulingProblem

Returns:

Equivalent AllocSchedulingSolution

forward_transform_solution(solution: AllocSchedulingSolution, target_problem: MultiskillRcpspProblem) MultiskillRcpspSolution | None[source]

Transform Workforce Scheduling solution to Multiskill RCPSP (for warmstart).

Parameters:
  • solution – AllocSchedulingSolution

  • target_problem – Target MultiskillRcpspProblem

Returns:

Equivalent MultiskillRcpspSolution

get_forward_metadata() TransformationMetadata[source]

Metadata for forward problem transformation (WorkforceScheduling → MultiskillRCPSP).

This direction is LOSSY but provides access to multiskill RCPSP solvers.

transform_problem(source_problem: AllocSchedulingProblem) MultiskillRcpspProblem[source]

Transform Workforce Scheduling to Multiskill RCPSP.

Parameters:

source_problem – AllocSchedulingProblem instance

Returns:

Equivalent MultiskillRcpspProblem

class discrete_optimization.workforce.scheduling.transformations.WorkforceSchedulingToRcpspTransformation(build_calendar: bool = True, add_window_time_constraint: bool = True, add_additional_constraint: bool = True)[source]

Bases: ProblemTransformation[AllocSchedulingProblem, AllocSchedulingSolution, RcpspProblem, RcpspSolution]

Transform Workforce Scheduling to RCPSP (Resource-Constrained Project Scheduling).

Mapping: - Tasks → RCPSP tasks - Teams → Modes for each task - Team availability calendars → Resource calendars - Task duration → Task duration in each mode - Precedence constraints → RCPSP successors - Time windows → Start/end time windows

This transformation is EXACT: - All workforce scheduling constraints are preserved in RCPSP formulation - Team assignment becomes mode selection in RCPSP

back_transform_solution(solution: RcpspSolution, source_problem: AllocSchedulingProblem) AllocSchedulingSolution[source]

Transform RCPSP solution back to Workforce Scheduling solution.

Parameters:
  • solution – RCPSP solution

  • source_problem – Original AllocSchedulingProblem

Returns:

Equivalent AllocSchedulingSolution

forward_transform_solution(solution: AllocSchedulingSolution, target_problem: RcpspProblem) RcpspSolution | None[source]

Transform Workforce Scheduling solution to RCPSP solution (for warmstart).

Parameters:
  • solution – AllocSchedulingSolution

  • target_problem – Target RCPSP problem

Returns:

Equivalent RCPSP solution for warmstart

get_forward_metadata() TransformationMetadata[source]

Metadata for forward problem transformation (WorkforceScheduling → RCPSP).

This direction is EXACT: all workforce constraints map to RCPSP constraints.

transform_problem(source_problem: AllocSchedulingProblem) RcpspProblem[source]

Transform Workforce Scheduling to RCPSP.

Parameters:

source_problem – AllocSchedulingProblem instance

Returns:

Equivalent RCPSP problem