Creating and running a Red Hat Business Optimizer solver for employee rostering using Business Central
Abstract
Preface
As a business rules developer, you can test and interact with the Red Hat Business Optimizer functionality using the preconfigured employee-rostering sample project included in the Red Hat Process Automation Manager distribution.
The employee-rostering sample project can be built and deployed in Business Central. The project is designed to demonstrate how to create each of the Business Central assets required to solve the shift rostering planning problem and use Red Hat Business Optimizer to find the best possible solution. Use this document to deploy the preconfigured employee-rostering project in Business Central, or to create the project yourself using Business Central.
The employee-rostering sample project in Business Central does not include a data set.
Prerequisites
- Red Hat JBoss Enterprise Application Platform 7.1.0 installed. See Red Hat JBoss EAP 7.1.0 Installation Guide.
- Red Hat Process Automation Manager installed. For more information, see Planning a Red Hat Process Automation Manager installation.
-
Red Hat Process Automation Manager is running and you can log in to Business Central with the
adminrole. For more information, see Planning a Red Hat Process Automation Manager installation. - Red Hat Process Automation Manager is configured for Red Hat Business Optimizer.
- If you are modifying this example to optimize your own data, a data set is required in order to run an optimization task on the Decision Server after the modified project has been deployed from Business Central to the server.
Chapter 1. Deploy the employee rostering sample project in Business Central
Business Central includes a number of sample projects that you can use to get familiar with the product and its features. The employee rostering sample project has been designed and created to demonstrate the shift rostering use case for Red Hat Business Optimizer. Use the following procedure to deploy and run the employee rostering sample in Business Central.
Prerequisites
- Red Hat Process Automation Manager has been downloaded and installed. For installation options, see Planning a Red Hat Process Automation Manager installation.
-
You have started the decision server and logged in to Business Central with a user that has
adminpermissions. For more information about getting started, see Getting started with decision services.
Procedure
- In Business Central, click Menu → Design → Projects.
-
In the preconfigured
myteamspace, click Try Samples. - Select employee-rostering from the list of sample projects and click Ok in the upper-right corner to import the project.
- After the asset list has complied, click Build & Deploy to deploy the employee rostering example.
The rest of this document explains each of the project assets and their configuration.
Chapter 2. Set up the employee rostering sample project
The employee rostering sample project is a preconfigured project available in Business Central. You can learn about how to deploy this project in Chapter 1, Deploy the employee rostering sample project in Business Central.
This chapter describes how to set up the employee rostering example. You can use the workflow in this example to create a similar project of your own in Business Central.
Prerequisites
- Red Hat Process Automation Manager has been downloaded and installed.
-
You have deployed Business Central and logged in with a user that has the
adminrole.
Procedure
- Create a new project in Business Central by clicking Menu → Design → Projects → Add Project.
In the Add Project window, fill out the following fields:
-
Name:
employee-rostering - Description(optional): Employee rostering problem optimization using Business Optimizer. Assigns employees to shifts based on their skill.
Optionally, click Show Advanced Options to populate the
Group ID,Artifact ID, andVersioninformation.-
Group ID:
employeerostering -
Artifact ID:
employeerostering -
Version:
1.0.0-SNAPSHOT
-
Name:
- Click Add to add the project to the Business Central project repository.
Chapter 3. Problem facts and planning entities
Each of the domain classes in the employee rostering planning problem can be categorized as one of the following:
- A unrelated class: not used by any of the score constraints. From a planning standpoint, this data is obsolete.
-
A problem fact class: used by the score constraints, but does not change during planning (as long as the problem stays the same), for example,
ShiftandEmployee. All the properties of a problem fact class are problem properties. A planning entity class: used by the score constraints and changes during planning, for example,
ShiftAssignment. The properties that change during planning are planning variables. The other properties are problem properties.Ask yourself the following questions:
- What class changes during planning?
Which class has variables that I want the
Solverto change?That class is a planning entity.
A planning entity class needs to be annotated with the
@PlanningEntityannotation, or defined in Business Central using the Red Hat Business Optimizer dock in the domain designer.Each planning entity class has one or more planning variables, and should also have one or more defining properties.
Most use cases have only one planning entity class, and only one planning variable per planning entity class.
Chapter 4. Create the data model for the employee rostering project
Use this section to create the data objects required to run the employee rostering sample project in Business Central.
Prerequisite
You have completed the project set up described in Chapter 2, Set up the employee rostering sample project.
Procedure
- With your new project, either click Data Object in the project perspective, or click Add Asset → Data Object to create a new data object.
Name the first data object
Timeslot, and selectemployeerostering.employeerosteringas the Package.Click Ok.
-
In the Data Objects perspective, click +add field to add fields to the
Timeslotdata object. -
In the id field, type
endTime. -
Click the drop-down menu next to Type and select
LocalDateTime. - Click Create and continue to add another field.
-
Add another field with the id
startTimeand TypeLocalDateTime. - Click Create.
-
Click Save in the upper-right corner to save the
Timeslotdata object. - Click the x in the upper-right corner to close the Data Objects perspective and return to the Assets menu.
Using the previous steps, create the following data objects and their attributes:
Table 4.1. Skill
id Type nameStringTable 4.2. Employee
id Type nameStringskillsemployeerostering.employeerostering.Skill[List]Table 4.3. Shift
id Type requiredSkillemployeerostering.employeerostering.Skilltimeslotemployeerostering.employeerostering.TimeslotTable 4.4. DayOffRequest
id Type dateLocalDateemployeeemployeerostering.employeerostering.EmployeeTable 4.5. ShiftAssignment
id Type employeeemployeerostering.employeerostering.Employeeshiftemployeerostering.employeerostering.Shift
For more examples of creating data objects, see Getting started with decision services.
4.1. Create the employee roster planning entity
In order to solve the employee rostering planning problem, you must create a planning entity and a solver. The planning entity is defined in the domain designer using the attributes available in the Red Hat Business Optimizer dock.
Use the following procedure to define the ShiftAssignment data object as the planning entity for the employee rostering example.
Prerequisite
- You have created the relevant data objects and planning entity required to run the employee rostering example by completing the procedures in Chapter 4, Create the data model for the employee rostering project.
Procedure
-
From the project Assets menu, open the
ShiftAssignmentdata object. -
In the Data Objects perspective, open the Red Hat Business Optimizer dock by clicking the
on the right.
- Select Planning Entity.
-
Select
employeefrom the list of fields under theShiftAssignmentdata object. In the Red Hat Business Optimizer dock, select Planning Variable.
In the Value Range Id input field, type
employeeRange. This adds the@ValueRangeProviderannotation to the planning entity, which you can view by clicking theSourcetab in the designer.The value range of a planning variable is defined with the
@ValueRangeProviderannotation. A@ValueRangeProviderannotation always has a propertyid, which is referenced by the@PlanningVariablepropertyvalueRangeProviderRefs.- Close the dock and click Save to save the data object.
4.2. Create the employee roster planning solution
The employee roster problem relies on a defined planning solution. The planning solution is defined in the domain designer using the attributes available in the Red Hat Business Optimizer dock.
Prerequisite
- You have created the relevant data objects and planning entity required to run the employee rostering example by completing the procedures in Chapter 4, Create the data model for the employee rostering project and Section 4.1, “Create the employee roster planning entity”.
Procedure
-
Create a new data object with the identifier
EmployeeRoster. Create the following fields:
Table 4.6. EmployeeRoster
id Type dayOffRequestListemployeerostering.employeerostering.DayOffRequest[List]shiftAssignmentListemployeerostering.employeerostering.ShiftAssignment[List]shiftListemployeerostering.employeerostering.Shift[List]skillListemployeerostering.employeerostering.Skill[List]timeslotListemployeerostering.employeerostering.Timeslot[List]-
In the Data Objects perspective, open the Red Hat Business Optimizer dock by clicking the
on the right.
- Select Planing Solution.
-
Leave the default
Hard soft scoreas the Solution Score Type. This automatically generates ascorefield in theEmployeeRosterdata object with the solution score as the type. Add a new field with the following attributes:
id Type employeeListemployeerostering.employeerostering.Employee[List]With the
employeeListfield selected, open the Red Hat Business Optimizer dock and select the Planning Value Range Provider box.In the id field, type
employeeRange. Close the dock.- Click Save in the upper-right corner to save the asset.
Chapter 5. Employee rostering constraints
Employee rostering is a planning problem. All planning problems include constraints that must be satisfied in order to find an optimal solution.
The employee rostering sample project in Business Central includes the following hard and soft constraints:
- Hard constraint
- Employees are only assigned one shift per day.
- All shifts that require a particular employee skill are assigned an employee with that particular skill.
- Soft constraints
- All employees are assigned a shift.
- If an employee requests a day off, their shift can be reassigned to another employee.
Hard and soft constraints can be defined in Business Central using either the free-form DRL designer, or using guided rules.
5.1. DRL (Drools Rule Language) rules
DRL (Drools Rule Language) rules are business rules that you define directly in .drl text files. These DRL files are the source in which all other rule assets in Business Central are ultimately rendered. You can create and manage DRL files within the Business Central interface, or create them externally using Red Hat Developer Studio, Java objects, or Maven archetypes. A DRL file can contain one or more rules that define at minimum the rule conditions (when) and actions (then). The DRL designer in Business Central provides syntax highlighting for Java, DRL, and XML.
All data objects related to a DRL rule must be in the same project package as the DRL rule in Business Central. Assets in the same package are imported by default. Existing assets in other packages can be imported with the DRL rule.
5.2. Constraint definition for employee rostering using the DRL designer
You can create constraint definitions for the employee rostering example using the free-form DRL designer in Business Central.
Use this procedure to create a hard constraint where no employee can be assigned a shift that begins less than 10 hours after their previous shift ended.
Procedure
- Go to Menu → Design → Projects and click the project name.
- Click Add Asset → DRL file.
-
In the DRL file name field, type
ComplexScoreRules. -
Select the
employeerostering.employeerosteringpackage. - Click +Ok to create the DRL file.
In the Model tab of the DRL designer, define the
Employee10HourShiftSpacerule as a DRL file:package employeerostering.employeerostering; rule "Employee10HourShiftSpace" dialect "mvel" when $shiftAssignment : ShiftAssignment( $employee : employee != null, $shiftEndDateTime : shift.timeslot.endTime) ShiftAssignment( this != $shiftAssignment, $employee == employee, $shiftEndDateTime <= shift.timeslot.endTime, $shiftEndDateTime.until(shift.timeslot.startTime, java.time.temporal.ChronoUnit.HOURS) <10) then scoreHolder.addHardConstraintMatch(kcontext, -1); end- Click Save to save the DRL file.
For more information about creating DRL files, see Designing a decision service using DRL rules.
Chapter 6. Create rules for employee rostering using guided rules
You can create rules that define hard and soft constraints for employee rostering using the guided rules designer in Business Central.
6.1. Guided rules
Guided rules are business rules that you create in a UI-based guided rules designer in Business Central that leads you through the rule-creation process. The guided rules designer provides fields and options for acceptable input based on the data objects for the rule being defined. The guided rules that you define are compiled into Drools Rule Language (DRL) rules as with all other rule assets.
All data objects related to a guided rule must be in the same project package as the guided rule. Assets in the same package are imported by default. After you create the necessary data objects and the guided rule, you can use the Data Objects tab of the guided rules designer to verify that all required data objects are listed or to import other existing data objects by adding a New item.
6.2. Create a guided rule to balance employee shift numbers
The BalanceEmployeesShiftNumber guided rule creates a soft constraint that ensures shifts are assigned to employees in a way that is balanced as evenly as possible. It does this by creating a score penalty that increases when shift distribution is less even. The score formula, implemented by the rule, incentivizes the Solver to distribute shifts in a more balanced way.

Procedure
- Go to Menu → Design → Projects and click the project name.
- Click Add Asset → Guided Rule.
-
Enter
BalanceEmployeesShiftNumberas the Guided Rule name and select theemployeerostering.employeerosteringPackage. - Click Ok to create the rule asset.
-
Add a WHEN condition by clicking the
in the WHEN field.
-
Select
Employeein the Add a condition to the rule window. Click +Ok. -
Click on the
Employeecondition to modify the constraints and add the variable name$employee. Add the WHEN condition
From Accumulate.-
Above the
From Accumulatecondition, click click to add pattern and selectNumberas the fact type from the drop-down list. -
Add the variable name
$shiftCountto theNumbercondition. -
Below the
From Accumulatecondition, click click to add pattern and select theShiftAssignmentfact type from the drop-down list. -
Add the variable name
$shiftAssignmentto theShiftAssignmentfact type. -
Click on the
ShiftAssignmentcondition again and from the Add a restriction on a field drop-down list, selectemployee. -
Select
equal tofrom the drop-down list next to theemployeeconstraint. -
Click the
icon next to the drop-down button to add a variable, and click Bound variable in the Field value window.
-
Select
$employeefrom the drop-down list. -
In the Function box type
count($shiftAssignment).
-
Above the
-
Add the THEN condition by clicking the
in the THEN field.
Select
Modify Soft Scorein the Add a new action window. Click +Ok.-
Type the following expression into the box:
-($shiftCount.intValue()*$shiftCount.intValue())
-
Type the following expression into the box:
- Click Validate in the upper-right corner to check all rule conditions are valid. If the rule validation fails, address any problems described in the error message, review all components in the rule, and try again to validate the rule until the rule passes.
- Click Save to save the rule.
For more information about creating guided rules, see Designing a decision service using guided rules.
6.3. Create a guided rule for no more than one shift per day
The OneEmployeeShiftPerDay guided rule creates a hard constraint that employees are not assigned more than one shift per day. In the employee rostering example, this constraint is created using the guided rule designer.

Procedure
- Go to Menu → Design → Projects and click the project name.
- Click Add Asset → Guided Rule.
-
Enter
OneEmployeeShiftPerDayas the Guided Rule name and select theemployeerostering.employeerosteringPackage. - Click Ok to create the rule asset.
-
Add a WHEN condition by clicking the
in the WHEN field.
- Select Free form DRL from the Add a condition to the rule window.
In the free form DRL box, type the following condition:
$shiftAssignment : ShiftAssignment( employee != null ) ShiftAssignment( this != $shiftAssignment , employee == $shiftAssignment.employee , shift.timeslot.startTime.toLocalDate() == $shiftAssignment.shift.timeslot.startTime.toLocalDate() )
This condition states that a shift cannot be assigned to an employee that already has another shift assignment on the same day.
-
Add the THEN condition by clicking the
in the THEN field.
- Select Add free form DRL from the Add a new action window.
In the free form DRL box, type the following condition:
scoreHolder.addHardConstraintMatch(kcontext, -1);
- Click Validate in the upper-right corner to check all rule conditions are valid. If the rule validation fails, address any problems described in the error message, review all components in the rule, and try again to validate the rule until the rule passes.
- Click Save to save the rule.
For more information about creating guided rules, see Designing a decision service using guided rules.
6.4. Create a guided rule to match skills to shift requirements
The ShiftReqiredSkillsAreMet guided rule creates a hard constraint that ensures all shifts are assigned an employee with the correct set of skills. In the employee rostering example, this constraint is created using the guided rule designer.

Procedure
- Go to Menu → Design → Projects and click the project name.
- Click Add Asset → Guided Rule.
-
Enter
ShiftReqiredSkillsAreMetas the Guided Rule name and select theemployeerostering.employeerosteringPackage. - Click Ok to create the rule asset.
-
Add a WHEN condition by clicking the
in the WHEN field.
-
Select
ShiftAssignmentin the Add a condition to the rule window. Click +Ok. -
Click on the
ShiftAssignmentcondition, and selectemployeefrom the Add a restriction on a field drop-down list. -
In the designer, click the drop-down list next to
employeeand selectis not null. Click on the
ShiftAssignmentcondition, and click Expression editor.-
In the designer, click
[not bound]to open the Expression editor, and bind the expression to the variable$requiredSkill. Click Set. -
In the designer, next to
$requiredSkill, selectshiftfrom the first drop-down list, thenrequiredSkillfrom the next drop-down list.
-
In the designer, click
Click on the
ShiftAssignmentcondition, and click Expression editor.-
In the designer, next to
[not bound], selectemployeefrom the first drop-down list, thenskillsfrom the next drop-down list. -
Leave the next drop-down list as
Choose. -
In the next drop-down box, change
please choosetoexcludes. -
Click the
icon next to excludes, and in the Field value window, click the New formula button. -
Type
$requiredSkillinto the formula box.
-
In the designer, next to
-
Add the THEN condition by clicking the
in the THEN field.
-
Select
Modify Hard Scorein the Add a new action window. Click +Ok. -
Type
-1into the score actions box. - Click Validate in the upper-right corner to check all rule conditions are valid. If the rule validation fails, address any problems described in the error message, review all components in the rule, and try again to validate the rule until the rule passes.
- Click Save to save the rule.
For more information about creating guided rules, see Designing a decision service using guided rules.
6.5. Create a guided rule to manage day off requests
The DayOffRequest guided rule creates a soft constraint that allows a shift to be reassigned to another employee in the event the employee who was originally assigned the shift is no longer able to work that day. In the employee rostering example, this constraint is created using the guided rule designer.

Procedure
- Go to Menu → Design → Projects and click the project name.
- Click Add Asset → Guided Rule.
-
Enter
DayOffRequestas the Guided Rule name and select theemployeerostering.employeerosteringPackage. - Click Ok to create the rule asset.
-
Add a WHEN condition by clicking the
in the WHEN field.
- Select Free form DRL from the Add a condition to the rule window.
In the free form DRL box, type the following condition:
$dayOffRequest : DayOffRequest( ) ShiftAssignment( employee == $dayOffRequest.employee , shift.timeslot.startTime.toLocalDate() == $dayOffRequest.date )
This condition states if a shift is assigned to an employee who has made a day off request, the employee can be unassigned the shift on that day.
-
Add the THEN condition by clicking the
in the THEN field.
- Select Add free form DRL from the Add a new action window.
In the free form DRL box, type the following condition:
scoreHolder.addSoftConstraintMatch(kcontext, -100);
- Click Validate in the upper-right corner to check all rule conditions are valid. If the rule validation fails, address any problems described in the error message, review all components in the rule, and try again to validate the rule until the rule passes.
- Click Save to save the rule.
For more information about creating guided rules, see Designing a decision service using guided rules.
Chapter 7. Configure the Solver for employee rostering
You can create and edit Solver configurations in Business Central. The Solver configuration designer creates a solver configuration that can be run after the project is deployed.
Prerequisite
Red Hat Process Automation Manager has been downloaded and installed. You have created and configured all of the relevant assets for the employee rostering example.
Procedure
- In Business Central, click Menu → Projects, and click on your project to open it.
- In the Assets perspective, click Add Asset → Solver configuration
In the Create new Solver configuration window, type the name
EmployeeRosteringSolverConfigfor your Solver and click Ok.This opens the Solver configuration designer.
In the Score Director Factory configuration section, define a knowledge base that contains scoring rule definitions. The employee rostering sample project uses
defaultKieBase.-
Select one of the knowledge sessions defined within the knowledge base. The employee rostering sample project uses
defaultKieSession.
-
Select one of the knowledge sessions defined within the knowledge base. The employee rostering sample project uses
- Click Validate in the upper-right corner to check the Score Director Factory configuration is correct. If validation fails, address any problems described in the error message, and try again to validate until the configuration passes.
- Click Save to save the Solver configuration.
7.1. Configure Solver termination for the employee rostering project
You can configure the Solver to terminate after a specified amount of time. By default, the planning engine is given an unlimited time period to solve a problem instance.
The employee rostering sample project is set up to run for 30 seconds.
Prerequisite
You have created all relevant assets for the employee rostering project and created the EmployeeRosteringSolverConfig solver configuration in Business Central as described in Chapter 7, Configure the Solver for employee rostering.
Procedure
-
Open the
EmployeeRosteringSolverConfigfrom the Assets perspective. This will open the Solver configuration designer. - In the Termination section, click Add to create new termination element within the selected logical group.
-
Select the
Time spenttermination type from the drop-down list. This is added as an input field in the termination configuration. - Use the arrows next to the time elements to adjust the amount of time spent to 30 seconds.
- Click Validate in the upper-right corner to check the Score Director Factory configuration is correct. If validation fails, address any problems described in the error message, and try again to validate until the configuration passes.
- Click Save to save the Solver configuration.
For more information about configuring a Solver or Solver termination, see Red Hat Process Automation Manager Red Hat Business Optimizer Guide.
7.2. Register the Solver using the REST API
Once the solver configuration is created and the project is deployed to the decision server, you can create a Solver and submit planning problems. This can be done by accessing the project KIE container’s capabilities through the decision server’s remote APIs. You can create a Solver from the solver configuration file, then submit a planning problem to it and request the best solution at any time.
Each Solver is capable of optimizing one planning problem at a time.
Prerequisites
- The employee rostering project has been set up and deployed according to the previous chapters in this document.
- The Solver has been configured as instructed in Chapter 7, Configure the Solver for employee rostering and Section 7.1, “Configure Solver termination for the employee rostering project”.
- You have successfully built and deployed the employee rostering project. For more information about deploying the employee rostering sample project in the workbench, see Chapter 1, Deploy the employee rostering sample project in Business Central.
Procedure
Create a HTTP request using the following header:
authorization: admin:admin X-KIE-ContentType: xstream content-type: application/xml
Register the Solver using the following request:
- PUT
-
http://localhost:8080/kie-server/services/rest/server/containers/employeerostering_1.0.0-SNAPSHOT/solvers/EmployeeRosteringSolver - Request body
<solver-instance> <solver-config-file>employeerostering/employeerostering/EmployeeRosteringSolverConfig.solver.xml</solver-config-file> </solver-instance>
Submit a request to the Solver:
- POST
-
http://localhost:8080/kie-server/services/rest/server/containers/employeerostering_1.0.0-SNAPSHOT/solvers/EmployeeRosteringSolver/state/solving - Request body
<employeerostering.employeerostering.EmployeeRoster> <employeeList> <employeerostering.employeerostering.Employee> <name>John</name> <skills> <employeerostering.employeerostering.Skill> <name>reading</name> </employeerostering.employeerostering.Skill> </skills> </employeerostering.employeerostering.Employee> <employeerostering.employeerostering.Employee> <name>Mary</name> <skills> <employeerostering.employeerostering.Skill> <name>writing</name> </employeerostering.employeerostering.Skill> </skills> </employeerostering.employeerostering.Employee> <employeerostering.employeerostering.Employee> <name>Petr</name> <skills> <employeerostering.employeerostering.Skill> <name>speaking</name> </employeerostering.employeerostering.Skill> </skills> </employeerostering.employeerostering.Employee> </employeeList> <shiftList> <employeerostering.employeerostering.Shift> <timeslot> <startTime>2017-01-01T00:00:00</startTime> <endTime>2017-01-01T01:00:00</endTime> </timeslot> <requiredSkill reference="../../../employeeList/employeerostering.employeerostering.Employee/skills/employeerostering.employeerostering.Skill"/> </employeerostering.employeerostering.Shift> <employeerostering.employeerostering.Shift> <timeslot reference="../../employeerostering.employeerostering.Shift/timeslot"/> <requiredSkill reference="../../../employeeList/employeerostering.employeerostering.Employee[3]/skills/employeerostering.employeerostering.Skill"/> </employeerostering.employeerostering.Shift> <employeerostering.employeerostering.Shift> <timeslot reference="../../employeerostering.employeerostering.Shift/timeslot"/> <requiredSkill reference="../../../employeeList/employeerostering.employeerostering.Employee[2]/skills/employeerostering.employeerostering.Skill"/> </employeerostering.employeerostering.Shift> </shiftList> <skillList> <employeerostering.employeerostering.Skill reference="../../employeeList/employeerostering.employeerostering.Employee/skills/employeerostering.employeerostering.Skill"/> <employeerostering.employeerostering.Skill reference="../../employeeList/employeerostering.employeerostering.Employee[3]/skills/employeerostering.employeerostering.Skill"/> <employeerostering.employeerostering.Skill reference="../../employeeList/employeerostering.employeerostering.Employee[2]/skills/employeerostering.employeerostering.Skill"/> </skillList> <timeslotList> <employeerostering.employeerostering.Timeslot reference="../../shiftList/employeerostering.employeerostering.Shift/timeslot"/> </timeslotList> <dayOffRequestList/> <shiftAssignmentList/> </employeerostering.employeerostering.EmployeeRoster>
Request the best solution to the planning problem:
- GET
Example response
<solver-instance> <container-id>employee-rostering</container-id> <solver-id>solver1</solver-id> <solver-config-file>employeerostering/employeerostering/EmployeeRosteringSolverConfig.solver.xml</solver-config-file> <status>NOT_SOLVING</status> <score scoreClass="org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore">0hard/0soft</score> <best-solution class="employeerostering.employeerostering.EmployeeRoster"> <employeeList> <employeerostering.employeerostering.Employee> <name>John</name> <skills> <employeerostering.employeerostering.Skill> <name>reading</name> </employeerostering.employeerostering.Skill> </skills> </employeerostering.employeerostering.Employee> <employeerostering.employeerostering.Employee> <name>Mary</name> <skills> <employeerostering.employeerostering.Skill> <name>writing</name> </employeerostering.employeerostering.Skill> </skills> </employeerostering.employeerostering.Employee> <employeerostering.employeerostering.Employee> <name>Petr</name> <skills> <employeerostering.employeerostering.Skill> <name>speaking</name> </employeerostering.employeerostering.Skill> </skills> </employeerostering.employeerostering.Employee> </employeeList> <shiftList> <employeerostering.employeerostering.Shift> <timeslot> <startTime>2017-01-01T00:00:00</startTime> <endTime>2017-01-01T01:00:00</endTime> </timeslot> <requiredSkill reference="../../../employeeList/employeerostering.employeerostering.Employee/skills/employeerostering.employeerostering.Skill"/> </employeerostering.employeerostering.Shift> <employeerostering.employeerostering.Shift> <timeslot reference="../../employeerostering.employeerostering.Shift/timeslot"/> <requiredSkill reference="../../../employeeList/employeerostering.employeerostering.Employee[3]/skills/employeerostering.employeerostering.Skill"/> </employeerostering.employeerostering.Shift> <employeerostering.employeerostering.Shift> <timeslot reference="../../employeerostering.employeerostering.Shift/timeslot"/> <requiredSkill reference="../../../employeeList/employeerostering.employeerostering.Employee[2]/skills/employeerostering.employeerostering.Skill"/> </employeerostering.employeerostering.Shift> </shiftList> <skillList> <employeerostering.employeerostering.Skill reference="../../employeeList/employeerostering.employeerostering.Employee/skills/employeerostering.employeerostering.Skill"/> <employeerostering.employeerostering.Skill reference="../../employeeList/employeerostering.employeerostering.Employee[3]/skills/employeerostering.employeerostering.Skill"/> <employeerostering.employeerostering.Skill reference="../../employeeList/employeerostering.employeerostering.Employee[2]/skills/employeerostering.employeerostering.Skill"/> </skillList> <timeslotList> <employeerostering.employeerostering.Timeslot reference="../../shiftList/employeerostering.employeerostering.Shift/timeslot"/> </timeslotList> <dayOffRequestList/> <shiftAssignmentList/> <score>0hard/0soft</score> </best-solution> </solver-instance>
Appendix A. Versioning information
Documentation last updated on: Monday, October 1, 2018.
