JBoss.orgCommunity Documentation
Drools Planner User Guide
- 1. Planner introduction
 - 1.1. What is Drools Planner?
 - 1.2. What is a planning problem?
 - 1.2.1. A planning problem is NP-complete
 - 1.2.2. A planning problem has (hard and soft) constraints
 - 1.2.3. A planning problem has a huge search space
 
- 1.3. Status of Drools Planner
 - 1.4. Download and run the examples
 - 1.4.1. Get the release zip and run the examples
 - 1.4.2. Run the examples in an IDE (IntelliJ, Eclipse, NetBeans)
 - 1.4.3. Use Drools Planner with maven, gradle, ivy, buildr or ANT
 - 1.4.4. Build Drools Planner from source
 
- 1.5. Questions, issues and blog
 
- 2. Quick start
 - 2.1. Cloud balancing tutorial
 - 2.1.1. Problem statement
 - 2.1.2. Domain model diagram
 - 2.1.3. Main method
 - 2.1.4. Solver configuration
 - 2.1.5. Domain model implementation
 - 2.1.6. Score configuration
 - 2.1.7. Beyond this tutorial
 
- 3. Use cases and examples
 - 3.1. Introduction
 - 3.2. Toy examples
 - 3.2.1. N queens
 - 3.2.2. Cloud balancing
 - 3.2.3. Traveling salesman (TSP - Traveling salesman problem)
 - 3.2.4. Manners 2009
 
- 3.3. Real examples
 - 3.3.1. Course timetabling (ITC 2007 track 3 - Curriculum course scheduling)
 - 3.3.2. Machine reassignment (Google ROADEF 2012)
 - 3.3.3. Vehicle routing
 - 3.3.4. Hospital bed planning (PAS - Patient admission scheduling)
 
- 3.4. Difficult examples
 - 3.4.1. Exam timetabling (ITC 2007 track 1 - Examination)
 - 3.4.2. Employee rostering (INRC 2010 - Nurse rostering)
 - 3.4.3. Sport scheduling (TTP - Traveling tournament problem)
 
- 4. Planner configuration
 - 4.1. Overview
 - 4.2. Solver configuration
 - 4.2.1. Solver configuration by XML file
 - 4.2.2. Solver configuration by Java API
 
- 4.3. Model your planning problem
 - 4.3.1. Is this class a problem fact or planning entity?
 - 4.3.2. Problem fact
 - 4.3.3. Planning entity and planning variables
 - 4.3.4. Planning value and planning value ranges
 - 4.3.5. Planning problem and planning solution
 
- 4.4. Use the Solver
 - 4.4.1. The Solver interface
 - 4.4.2. Solving a problem
 - 4.4.3. Environment mode: Are there bugs in my code?
 - 4.4.4. Logging level: What is the Solver doing?
 
- 5. Score calculation
 - 5.1. Score terminology
 - 5.1.1. What is a score?
 - 5.1.2. Positive and negative constraints
 - 5.1.3. Score constraint weighting
 - 5.1.4. Score level
 - 5.1.5. Pareto scoring (AKA multi-objective optimization scoring)
 - 5.1.6. The Score interface
 
- 5.2. Choose a Score definition
 - 5.2.1. SimpleScore
 - 5.2.2. HardAndSoftScore (recommended)
 - 5.2.3. Implementing a custom Score
 
- 5.3. Calculate the Score
 - 5.3.1. Score calculation types
 - 5.3.2. Simple Java score calculation
 - 5.3.3. Incremental Java score calculation
 - 5.3.4. Drools score calculation
 - 5.3.5. Detecting invalid scores
 
- 5.4. Score calculation performance tricks
 - 5.4.1. Overview
 - 5.4.2. Average calculation count per second
 - 5.4.3. Incremental score calculation (with delta's)
 - 5.4.4. Caching
 - 5.4.5. Unused constraint
 - 5.4.6. Build-in hard constraint
 - 5.4.7. Other performance tricks
 - 5.4.8. Score trap
 - 5.4.9. stepLimit benchmark
 
- 5.5. Reusing the score calculation outside the Solver
 
- 6. Optimization algorithms
 - 6.1. The size of real world problems
 - 6.2. The secret sauce of Drools Planner
 - 6.3. Optimization algorithms overview
 - 6.4. Which optimization algorithms should I use?
 - 6.5. SolverPhase
 - 6.6. Scope overview
 - 6.7. Termination
 - 6.7.1. TimeMillisSpendTermination
 - 6.7.2. ScoreAttainedTermination
 - 6.7.3. StepCountTermination
 - 6.7.4. UnimprovedStepCountTermination
 - 6.7.5. Combining multiple Terminations
 - 6.7.6. Asynchronous termination from another thread
 
- 6.8. SolverEventListener
 - 6.9. Custom SolverPhase
 
- 7. Move and neighborhood selection
 - 7.1. Move and neighborhood introduction
 - 7.1.1. What is a Move?
 - 7.1.2. What is a MoveSelector?
 - 7.1.3. Subselecting of entities, values and other moves
 
- 7.2. General Selector features
 - 7.2.1. CacheType: Create moves in advance or Just In Time
 - 7.2.2. SelectionOrder: original, random or shuffled selection
 - 7.2.3. Recommended combinations of CacheType and SelectionOrder
 - 7.2.4. Filtered selection
 - 7.2.5. Sorted selection
 - 7.2.6. Probability selection
 
- 7.3. Generic MoveSelectors
 - 7.3.1. changeMoveSelector
 - 7.3.2. swapMoveSelector
 - 7.3.3. pillarSwapMoveSelector
 - 7.3.4. subChainChangeMoveSelector
 - 7.3.5. subChainSwapMoveSelector
 
- 7.4. Combining multiple MoveSelectors
 - 7.4.1. unionMoveSelector
 - 7.4.2. cartesianProductMoveSelector
 
- 7.5. EntitySelector
 - 7.5.1. TODO
 
- 7.6. ValueSelector
 - 7.6.1. TODO
 
- 7.7. Custom moves
 - 7.7.1. Which move types might be missing in my implementation?
 - 7.7.2. Custom moves introduction
 - 7.7.3. The interface Move
 - 7.7.4. MoveListFactory: the easy way to generate custom moves
 - 7.7.5. MoveIteratorFactory: generate custom moves just in time
 - 7.7.6. Move generation through DRL
 
- 8. Construction heuristics
 - 8.1. Overview
 - 8.2. First Fit
 - 8.2.1. Algorithm description
 - 8.2.2. Configuration
 
- 8.3. First Fit Decreasing
 - 8.3.1. Algorithm description
 - 8.3.2. Configuration
 
- 8.4. Best Fit
 - 8.4.1. Algorithm description
 - 8.4.2. Configuration
 
- 8.5. Best Fit Decreasing
 - 8.5.1. Algorithm description
 - 8.5.2. Configuration
 
- 8.6. Cheapest insertion
 - 8.6.1. Algorithm description
 - 8.6.2. Configuration
 
- 9. Local search
 - 9.1. Overview
 - 9.2. Hill climbing (simple local search)
 - 9.2.1. Algorithm description
 
- 9.3. Tabu search
 - 9.3.1. Algorithm description
 
- 9.4. Simulated annealing
 - 9.4.1. Algorithm description
 
- 9.5. Late acceptance
 - 9.5.1. Algorithm description
 
- 9.6. About neighborhoods, moves and steps
 - 9.6.1. Move generation tips
 - 9.6.2. A step
 - 9.6.3. Getting stuck in local optima
 
- 9.7. Deciding the next step
 - 9.7.1. Acceptor
 - 9.7.2. Forager
 
- 9.8. Using a custom Termination, MoveSelector, EntitySelector, ValueSelector or Acceptor
 
- 10. Evolutionary algorithms
 - 10.1. Overview
 - 10.2. Evolutionary Strategies
 - 10.3. Genetic algorithms
 
- 11. Exact methods
 - 11.1. Overview
 - 11.2. Brute Force
 - 11.2.1. Algorithm description
 - 11.2.2. Configuration
 
- 11.3. Depth-first search
 - 11.3.1. Algorithm description
 - 11.3.2. Configuration
 
- 12. Benchmarking and tweaking
 - 12.1. Finding the best Solver configuration
 - 12.2. Doing a benchmark
 - 12.2.1. Adding the extra dependency
 - 12.2.2. Building and running a PlannerBenchmark
 - 12.2.3. ProblemIO: input and output of Solution files
 - 12.2.4. Writing the output solution of the benchmark runs
 - 12.2.5. Warming up the HotSpot compiler
 
- 12.3. Benchmark report
 - 12.3.1. HTML report
 - 12.3.2. Summary statistics
 - 12.3.3. Statistic per data set (graph and CSV)
 - 12.3.4. Ranking the Solvers
 
- 12.4. Advanced benchmarking
 - 12.4.1. Benchmarking performance tricks
 - 12.4.2. Template based benchmarking and matrix benchmarking
 
- 13. Repeated planning
 - 13.1. Introduction to repeated planning
 - 13.2. Backup planning
 - 13.3. Continuous planning (windowed planning)
 - 13.3.1. Immovable planning entities
 
- 13.4. Real-time planning (event based planning)