Thank you very much for your suggestion!
It's my misunderstanding of Cumulative.
Actually my real question has a huge scale for Bins and Tasks, so I want to use Cumulative model instead of traditional Binpack model, which requires double FOR circle.
The modified demo code is shown below, it seems worked. Does this meet your suggestion?
from ortools.sat.python import cp_model
binCapacity = [100,100,100,100,100]
binUsed = [90,80,70,60,50] #binRest = [10,20,30,40,50]
taskDemand = [10,10,10,10,10,10,10,10,10,10]
numBins = len(binCapacity)
numTasks = len(taskDemand)
taskToBin = [int] * numTasks
taskToBinEnd = [int] * numTasks
taskInterval = [int] * numTasks
binInterval = [int] * numNodes
Intervals = []
model = cp_model.CpModel()
for i in range(numTasks):
taskToBin[i] = model.NewIntVar(0, numNodes - 1, "taskToBin")
taskToBinEnd[i] = model.NewIntVar(1, numNodes, "taskToBinEnd")
taskInterval[i] = model.NewIntervalVar(taskToBin[i], 1, taskToBinEnd[i], "taskIntervals")
Intervals.append(taskInterval[i])
for j in range(numBins):
binInterval[j] = model.NewIntervalVar(taskToBin[j], 1, taskToBinEnd[j], "nodeIntervals")
Intervals.append(binInterval[j])
model.AddCumulative(Intervals, taskDemand + binUsed, 100)
# Solve model.
solver = cp_model.CpSolver()
solver.parameters.log_search_progress = True
solver.Solve(model)
for i in range(numTasks):
print(solver.Value(taskToBin[i]))
Thanks again.