| |||||||||

Personnel planning problem Description Personnel planning problem: 'all_different', 'implies', 'occurrence', and 'distribute' constraints; branching strategy for variables. Further explanation of this example:
'Xpress Kalis User Guide', Section 3.7 distribute: Personnel planning
Source Files persplan.mos (!**************************************************************** CP example problems =================== file persplan.mos ````````````````` Personnel planning problem. A movie theatre director has to decide in which location each of his 8 employees should be posted. Each of the four locations has a given personnel requirement. (c) 2008 Artelys S.A. and Fair Isaac Corporation *****************************************************************!) model "Personnel Planning (CP)" uses "kalis" forward procedure print_solution declarations PERS = {"David","Andrew","Leslie","Jason","Oliver","Michael", "Jane","Marilyn"} ! Set of personnel LOC = 1..4 ! Set of locations LOCNAMES = {"Ticketoffice", "Theater1", "Theater2", "Cloakroom"} ! Names of locations LOCNUM: array(LOCNAMES) of integer ! Numbers assoc. with loc.s REQ: array(LOC) of integer ! No. of pers. req. per loc. place: array(PERS) of cpvar ! Workplace assigned to each peson end-declarations ! Initialize data LOCNUM("Ticketoffice"):= 1; LOCNUM("Theater1"):= 2 LOCNUM("Theater2"):= 3; LOCNUM("Cloakroom"):= 4 REQ:: (1..4)[3, 2, 2, 1] ! Each variable has a lower bound of 1 (Ticketoffice) and an upper bound ! of 4 (Cloakroom) forall(p in PERS) do setname(place(p),"workplace["+p+"]") setdomain(place(p), LOC) end-do ! "Leslie must be at the second entrance of the theater" place("Leslie") = LOCNUM("Theater2") ! "Michael must be at the first entrance of the theater" place("Michael") = LOCNUM("Theater1") ! "David, Michael and Jason cannot work with each other" all_different({place("David"), place("Michael"), place("Jason")}) ! "If Oliver is selling tickets, Marylin must be with him" implies(place("Oliver")=LOCNUM("Ticketoffice"), place("Marilyn")=LOCNUM("Ticketoffice")) ! Creation of a resource constraint of for every location ! forall(d in LOC) occurrence(LOCNUM(d), place) = REQ(d) ! Formulation of resource constraints using global cardinality constraint distribute(place, LOC, REQ) ! Setting parameters of the enumeration cp_set_branching(assign_var(KALIS_SMALLEST_MIN, KALIS_MAX_TO_MIN, place)) ! Solve the problem if not(cp_find_next_sol) then writeln("Problem is infeasible") exit(1) end-if ! Solution output nbSolutions:= 1 print_solution ! Search for other solutions while (cp_find_next_sol) do nbSolutions += 1 print_solution end-do ! **** Solution printout **** procedure print_solution declarations LOCIDX: array(LOC) of string end-declarations forall(l in LOCNAMES) LOCIDX(LOCNUM(l)):=l writeln("\nSolution number ", nbSolutions) forall(p in PERS) writeln(" Working place of ", p, ": ", LOCIDX(getsol(place(p)))) end-procedure end-model | |||||||||

Copyright 2017 Fair Isaac Corporation. |