Я думаю, что в вашей модели отсутствует важное ограничение, согласно которому сумма длительностей разных частей задачи равна времени обработки задачи.Примерно так:
forall (t in Tasks) {
sum(p in sub_activities: p.task==t) lengthOf(a[p]) == t.pt;
}
Кроме того, учитывая, что целочисленное деление округляет результат вниз, вы можете пропустить некоторые подэтапы, поэтому я бы предпочел использовать что-то вроде:
{sub_task} sub_activities = {<t,i > | t in Tasks, i in 1..1+(t.pt div t.smin )};
Кроме того, размер охватывающих задач не может быть t.pt, но будет больше, если разрешено вытеснение, поэтому оно должно быть примерно таким:
dvar interval itvs[t in Tasks] size t.pt..H; // H being a large number
Наконец (но это только для ускорения разрешениянемного), вы можете переформулировать составное выражение в цели, используя интервалы охвата задачи, а не части (это будет включать меньше переменных):
minimize max(t in Tasks) endOf(itvs[t]);
Кроме того, если у вас есть максимальная продолжительность для частейнеобходимо предотвратить смежные две последовательные части (в противном случае, я полагаю, это будет считаться одной и той же частью), поэтому цепочка интервальных переменных для частей должна иметь минимальную задержку 1:
forall(p in sub_activities){
forall(s in sub_activities: s.task==p.task && s.p_no==p.p_no+1){
endBeforeStart(a[p],a[s],1);
presenceOf(a[s])=> presenceOf(a[p]);
}
}