Я играю с chocosolver, чтобы решить некоторые проблемы планирования задач.
У меня есть несколько заданий и возможных слотов (где задание может быть выполнено). Есть некоторые ограничения, такие как:
- В каждом слоте может быть только одно задание (C.1)
- Для задания требуется определенное время
t
, а слот имеет доступную продолжительностьd
. Работа должна соответствовать доступной продолжительности:t<=d
(C.2)
Итак, в основном выражено некоторыми базовыми/псевдоклассами:
class Job {
int id;
int time;
}
class Slot {
int id;
int duration;
}
В настоящее время я могу выделить слот для каждого задания, предполагая, что идентификатор задания и слот последовательно пронумерованы
int jobCount = 5; // 5 jobs with ids from 0 to 4
int slotCount= 20; // 20 jobs with ids from 0 to 19
Model model = new Model("Example");
IntVar[] jobs = model.intVarArray("Job", jobCount, 0, slotCount, false);
// all jobs must have different slots (C.1)
model.allDifferent(jobs).post();
// solving - details omitted, because I think it is not relevant...
Solution solution = model.getSolver().findSolution();
// assign the jobs to the slots like (pseudo-code):
// foreach i in jobs.length do
// job = getJobForId(i);
// getSlotForId(jobs[i]).setJob(job);
Это работает, как и ожидалось. Но теперь я хочу смоделировать и другие ограничения. Но я зацикливаюсь на том, как совместить задание/слот со временем/длительностью, потому что время и продолжительность являются зависимой переменной.
На первом этапе я смоделировал две дополнительные переменные для времени и длительности:
int[] slotDurations = {10, 20, 10, 40, ..., 20} // 20 durations (d)
IntVar[] durations = model.intVarArray("Time", slotCount, slotDurations);
int[] jobTimes = {5, 16, 30, 2, 17} // 5 times (t)
IntVar[] times = model.intVarArray("Time", jobCount , jobTimes);
Теперь мне нужно выразить ограничение, согласно которому время должно соответствовать длительности (C.2).
Можно ли определить подобное ограничение (не работающий/действительный псевдокод):
for(int i=0;i<jobCount;i++){
times[i].le(durations[jobs[i]]).post();
}
или модель совсем не та?!
Может у кого есть решение или идея?!