group_serializer
For example, the task_serializer branching scheme is a particular kind of group serializer heuristic tailored for task based search tree exploration. In this case a group corresponds to a task and the list of branching schemes is the following :
- start time variable
- duration variable
function group_serializer(groups: set of cpbsgroup, groupSelector: function or string) : cpbranching
function group_serializer(groups: set of cpbsgroup, groupSelector: function or string, probe: integer) : cpbranching
|
groups
|
the set of branching scheme groups
|
|
groupselector
|
the group selection heuristic
|
|
probe
|
the probe level
|
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
© 2001-2025 Fair Isaac Corporation. All rights reserved. This documentation is the property of Fair Isaac Corporation (“FICO”). Receipt or possession of this documentation does not convey rights to disclose, reproduce, make derivative works, use, or allow others to use it except solely for internal evaluation purposes to determine whether to purchase a license to the software described in this documentation, or as otherwise set forth in a written software license agreement between you and FICO (or a FICO affiliate). Use of this documentation and the software described in it must conform strictly to the foregoing permitted uses, and no other use is permitted.
