:- dynamic job/4, task/3. :- compile("j10t50_17.pl"). :- use_module(library(fd)). allocate_jobs(N, Sol) :- job(1, Deadline, ReleaseTime, _), task(14, Duration, Resource), StartTime :: ReleaseTime..(Deadline - Duration), Flag = 0, allocate_all(0,N,[StartTime],AllStartVars,[start(1,14,Resource, StartTime)], Sol, StartTime, Flag), labeling(AllStartVars). allocate_all(N, N, AllStartVars, AllStartVars, Sol, Sol, StartTime, Flag). allocate_all(I, N, IntStartVars, AllStartVars, IntSol, Sol, StartTime, Flag) :- I < N, job(I, Deadline, ReleaseTime, TaskList), allocate_one(TaskList, I, ReleaseTime, Deadline, StartVars, IntSol, NewIntSol,StartTime, Flag), append(IntStartVars, StartVars, NewIntStartVars), I1 is I + 1, allocate_all(I1, N, NewIntStartVars, AllStartVars, NewIntSol, Sol, StartTime, Flag). allocate_one([], _, _, _, [], IntSol, IntSol,StartTime, Flag). allocate_one([TaskName | RestTasks], JobName, ReleaseTime, Deadline, OLdStart, IntSol, Sol, StartTime14, Flag) :- ((TaskName = 14,memberchk(start(1, 14, Resource, _), IntSol)) -> JobName = 1,TaskName =14,RestStart = OLdStart,StartTime=StartTime14 ; task(TaskName, Duration, Resource), StartTime :: ReleaseTime..(Deadline - Duration), OLdStart = [StartTime | RestStart] ), constrain_task(start(JobName, TaskName, Resource, StartTime), IntSol, StartTime14, Flag), ( TaskName = 14 -> NewIntSol = IntSol ; append(IntSol, [start(JobName, TaskName, Resource, StartTime)], NewIntSol) ), allocate_one(RestTasks, JobName, ReleaseTime, Deadline, RestStart, NewIntSol, Sol,StartTime14, Flag). constrain_task(start(JobName, TaskName, Resource, StartTime), [], StartTime14, Flag). constrain_task(start(J1,T1,R,S1), [start(J2,T2,R,S2)|RestJobs], StartTime14, Flag) :- T1 =\= T2, not_overlap(T1,S1,T2,S2), set_precedence(start(J1,T1,R,S1),start(J2,T2,R,S2)), ( Flag = 0 -> true ; S1 #<= StartTime14 ), constrain_task(start(J1,T1,R,S1), RestJobs,StartTime14, Flag). constrain_task(start(J1,T1,R1,S1), [start(J2,T2,R2,S2)|RestJobs],StartTime14, Flag) :- T1 =\= T2, R1 =\= R2, set_precedence(start(J1,T1,R1,S1),start(J2,T2,R2,S2)), ( Flag = 0 -> true ; S1 #<= StartTime14), constrain_task(start(J1,T1,R1,S1), RestJobs,StartTime14, Flag). constrain_task(start(J1,T1,R1,S1), [start(J2,T2,R2,S2)|RestJobs],StartTime14, Flag) :- T1 = T2, constrain_task(start(J1,T1,R1,S1), RestJobs,StartTime14, Flag). state_other_constr(StartTime, 0) :- StartTime #< 21. state_other_constr(StartTime, 1) :- StartTime #>= 21. state_constr(StartTime, []). state_constr(StartTime, [start(J1,T1,R1,S1) |Rest]):- ( T1 =\= 04 -> StartTime #> S1 ; true), state_constr(StartTime, Rest). not_overlap(T1,S1,T2,S2) :- task(T1,D1,_), S1 #<= S2, S2 #>= (S1 + D1). not_overlap(T1,S1,T2,S2) :- task(T2,D2,_), S2 #<= S1, S1 #>= (S2 + D2). set_precedence(start(J,T1,_,S1),start(J,T2,_,S2)) :- T1 =:= (T2 + 1),!, task(T2,D2,_), S1 #>= (S2 + D2). set_precedence(start(J1,T1,_,S1),start(J2,T2,_,S2)).