我正在使用 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 4int slotCount= 20; // 20 jobs with ids from 0 to 19Model 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();}還是模型完全錯誤?!也許有人有解決方案或想法?!
Choco 求解器中的建模約束
慕尼黑5688855
2021-08-06 09:57:56