Миницинк: конструкция массива - PullRequest
1 голос
/ 09 ноября 2019

Я хотел бы выполнить некоторые операции с массивом. Этот массив взят из переменной, поэтому он не является статической проблемой

Минимальный пример неполон

%Definitions
enum TypeOfShift = {l,m1,m,t,n,im,it,ino,o};  %Types of shifts
array[TypeOfShift] of float: StartTypeOfShift=[10, 6.75, 7.5, 14.75, 22, 6.5, 13.75, 21, 10]; %Starting hour. The time for l is just to put something convenient
array[TypeOfShift] of float: DurationTypeOfShift=[0, 7.25, 7.25, 7.25, 9.5, 8.25, 8.25, 10.5, 6]; %Duration of shifts (hours)
enum Staff={AA};
array[int] of int: DaysInRoster=[28, 29, 30, 31, 1, 2, 3, 4, 5,6,7,8,9,10,11,12,13,14,15,16,17,18]; %Dias a los que corresponde el turnero

int: NumberWorkers = card(Staff); 
int: NumDaysInRoster=length(DaysInRoster);

array[Staff, 1..NumDaysInRoster] of TypeOfShift: RosterCalculated = [|t, t, t, n, l, l, l, m, m1, m, t, m, l, l, m, m, l, m, t, m, l, l|];
array[Staff, 1..NumDaysInRoster] of 0..1: WorkingDays = array2d(Staff, 1..NumDaysInRoster,[(if RosterCalculated[i,d]==l then 0 else 1 endif) | i in Staff, d in 1..NumDaysInRoster]);

% Variables
array[Staff, 1..NumDaysInRoster-1] of var float: RosterCalculatedRests = array2d(Staff, 1..NumDaysInRoster-1,[(24*(d)+StartTypeOfShift[RosterCalculated[i,d+1]]) - (24*(d-1)+StartTypeOfShift[RosterCalculated[i,d]] + DurationTypeOfShift[RosterCalculated[i,d]]) | i in Staff, d in 1..NumDaysInRoster-1]);
array[Staff, 1..NumDaysInRoster-1] of var float: RosterCalculatedRests2 = array2d(Staff, 1..NumDaysInRoster-1, [if (RosterCalculated[i,d] == l) \/ (RosterCalculated[i,d+1] == l) then (RosterCalculatedRests[i,d]) else 0 endif | i in Staff, d in 1..NumDaysInRoster-1]);                                   

solve satisfy;

output[if (d==1) then "\n"++"O3;\(i) " ++ ";" ++ show(WorkingDays[i,d]) ++ ";" else show(WorkingDays[i,d]) ++ ";" endif | i in Staff, d in 1..NumDaysInRoster]++["\n"];
output[if (d==1) then "\n"++"O3;\(i) " ++ ";" ++ show(RosterCalculated[i,d]) ++ ";" else show(RosterCalculated[i,d]) ++ ";" endif | i in Staff, d in 1..NumDaysInRoster]++["\n"];
output[if (d==1) then "\n"++"O3;\(i) " ++ ";" ++ show(RosterCalculatedRests[i,d]) ++ ";" else show(RosterCalculatedRests[i,d]) ++ ";" endif | i in Staff, d in 1..NumDaysInRoster-1]++["\n"];
%output[if (d==1) then "\n"++"O3;\(i) " ++ ";" ++ show(RosterCalculatedRests2[i,d]) ++ ";" else show(RosterCalculatedRests2[i,d]) ++ ";" endif | i in Staff, d in 1..NumDaysInRoster-1]++["\n"];

Выходные данные - первые три строки.

enter image description here

В четвертой строке добавляется группа значений под нулями + первый ненулевой слева (пример 72 = 2,5 + 24 + 24 ++21,5). Пятая строка проста, просто удалите числа, рассчитанные под 48. Шестая: посчитайте 1 с перед каждым из оставшихся чисел: 4 до 72, 5 до 64,75.

Есть идеи, как этого добиться? Заранее спасибо

...