猿问

Choco 求解器中的建模约束

我正在使用 choco 求解器来解决一些任务调度问题。


我有几个工作和可能的插槽(可以执行一个工作)。有一些限制,例如:


每个插槽只能有一个作业 (C.1)

作业需要一定的时间t,槽有一个可用的持续时间d。工作必须适合可用的持续时间:t<=d(C.2)

所以,基本上用一些基本/伪类表示:


class Job {

    int id;

    int time;

}


class Slot {

    int id;

    int duration;

}

目前,我可以为每个工作分配一个插槽,假设一个工作的 id 和一个插槽是连续编号的


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();

}

还是模型完全错误?!


也许有人有解决方案或想法?!


慕尼黑5688855
浏览 226回答 1
1回答
随时随地看视频慕课网APP

相关分类

Python
我要回答