| |||||||||||
| |||||||||||
|
Branching strategies Description Branching schemes for the
enumeration of decision variables (discrete or continuous), disjunctive constraints, or tasks can be configured to use
built-in or user-defined variable / constraint / task and value selection heuristics.
Source Files By clicking on a file name, a preview is opened at the bottom of this page. groupserializer.mos
(!****************************************************************
CP example problems
===================
file groupserializer.mos
````````````````````````
Resource-constrained project planning problem (construction of
a house) modeled with task and resource objects.
- Defining a group serializer branching strategy -
*** This model cannot be run with a Community Licence ***
(c) 2021 Artelys S.A. and Fair Isaac Corporation
rev. Apr. 2022
*****************************************************************!)
model "Groups serialization example"
uses "kalis"
declarations
Masonry, Carpentry, Roofing, Windows, Facade, Garden, Plumbing,
Ceiling, Painting, MovingIn : cptask ! Declaration of tasks
Taskset : set of cptask
money_available : cpresource ! Resource declaration
! Branching strategy
Strategy: cpbranching
TaskBranching: dynamic array(string) of set of cpbranching
TaskGroups: set of cpbsgroup
TaskTag: dynamic array(range) of string
end-declarations
forward public function select_task_group(glist: cpbsgroup): real
! 'money_available' is a cumulative resource with max. amount of 29$
set_resource_attributes(money_available,KALIS_DISCRETE_RESOURCE,29)
! Limit resource availability to 20$ in the time interval [0,14]
setcapacity(money_available, 0, 14, 20)
! Setting task name
Masonry.name := "Masonry"
Carpentry.name := "Carpentry"
Roofing.name := "Roofing"
Windows.name := "Windows"
Facade.name := "Facade"
Garden.name := "Garden"
Plumbing.name := "Plumbing"
Ceiling.name := "Ceiling"
Painting.name := "Painting"
MovingIn.name := "MovingIn"
! Setting the task durations and predecessor sets
set_task_attributes(Masonry , 7)
set_task_attributes(Carpentry, 3, {Masonry})
set_task_attributes(Roofing , 1, {Carpentry})
set_task_attributes(Windows , 1, {Roofing})
set_task_attributes(Facade , 2, {Roofing})
set_task_attributes(Garden , 1, {Roofing})
set_task_attributes(Plumbing , 8, {Masonry})
set_task_attributes(Ceiling , 3, {Masonry})
set_task_attributes(Painting , 2, {Ceiling})
set_task_attributes(MovingIn , 1, {Windows,Facade,Garden,Painting})
! Setting the resource consumptions
consumes(Masonry , 7, money_available)
consumes(Carpentry, 3, money_available)
consumes(Roofing , 1, money_available)
consumes(Windows , 1, money_available)
consumes(Facade , 2, money_available)
consumes(Garden , 1, money_available)
consumes(Plumbing , 8, money_available)
consumes(Ceiling , 3, money_available)
consumes(Painting , 2, money_available)
consumes(MovingIn , 1, money_available)
! Set of tasks to schedule
Taskset := {Masonry, Carpentry, Roofing, Windows, Facade, Garden,
Plumbing, Ceiling, Painting, MovingIn}
! Set the custom branching strategy using group_serializer:
! - the group serialization process will use the function
! "select_task_group" to look for the next group to set
! - this function will score each group and the group with the best score is
! selected next
! - the "KALIS_MAX_TO_MIN" value selection heuristic is used to choose values
! for the tasks duration variable
! - and the "KALIS_MIN_TO_MAX" value selection heuristic is applied for
! the start of the task
! - group serializer gives the user a high level of refinement within the
! definition of the search strategy
cnt_task := 1
forall(task in Taskset) do
TaskBranching(task.name) +=
{assign_var(KALIS_SMALLEST_DOMAIN, KALIS_MIN_TO_MAX, {getstart(task)})}
TaskBranching(task.name) +=
{assign_var(KALIS_SMALLEST_DOMAIN, KALIS_MAX_TO_MIN, {getduration(task)})}
TaskBranching(task.name) +=
{assign_var(KALIS_SMALLEST_DOMAIN, KALIS_MAX_TO_MIN,
{getconsumption(task, money_available)})}
TaskGroups += {bs_group(TaskBranching(task.name), cnt_task)}
TaskTag(cnt_task) := task.name
cnt_task += 1
end-do
Strategy := group_serializer(TaskGroups, "select_task_group")
cp_set_schedule_strategy(KALIS_INITIAL_SOLUTION, Strategy)
! Find the optimal schedule (minimizing the makespan)
if 0 <> cp_schedule(getmakespan) then
cp_show_sol
else
writeln("No solution found")
end-if
!-------------------------------------------------------------
! **** Function to select the next group to branch on
! Each group will be scored and the group with the best score will be picked
! as the next group
public function select_task_group(glist: cpbsgroup): real
! Retrieve task from tag
tag := gettag(glist)
! Initializing score value
returned := 0.0
! Build score value as a combination of 1/ max degree and 2/ smallest domain
forall(task in Taskset | TaskTag(tag) = task.name) do
returned += 100 * getsize(getduration(task))
returned -= getsize(getstart(task))
end-do
end-function
end-model
| |||||||||||
| © Copyright 2025 Fair Isaac Corporation. |