/* Simple PERT model in Picat. From Pascal van Hentenryck "Scheduling and Packing In the Constraint Language cc(FD)", page 7f http://citeseer.ist.psu.edu/300151.html Model created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import cp. main => go. go => MaxTime = 30, times(Times), N = length(Times), dependencies(Dependencies), % decision variable Start = new_list(N), Start :: 0..MaxTime, % constraints foreach([D1,D2] in Dependencies) Start[D1] #>= Start[D2] + Times[D2] end, SEnd = Start[N], % to minimize SumTimes #= sum(Start), % search solve([$min(SEnd)], Start), % output writeln(sEnd=SEnd), writeln(start_times=Start), writeln(sum_times=SumTimes), nl. % Times for each action % a b c d e f g h j k Send times(Times) => Times = [7, 3, 1, 8, 1, 1, 1, 3, 2, 1, 1]. % Dependencies % Note: There is no Si dependencies(Dependencies) => Dependencies = [[2,1], % Sb >= Sa + 7 [4,1], % Sd >= Sa + 7 [3,2], % Sc >= Sb + 3 [5,3], % Se >= Sc + 1 [5,4], % Se >= Sd + 8 [7,3], % Sg >= Sc + 1 [7,4], % Sg >= Sd + 8 [6,4], % Sf >= Sd + 8 [6,3], % Sf >= Sc + 1 [8,6], % Sh >= Sf + 1 [9,8], % Sj >= Sh + 3 [10,7], % Sk >= Sg + 1 [10,5], % Sk >= Se + 1 [10,9], % Sk >= Sj + 2 [11,10] % Send >= Sk + 1 ].