You can use overlap_length
docplex.cp.modeler.overlap_length(interval, interval2, absentValue=None)
Returns the length of the overlap of two interval variables.
and count true constraints
from docplex.mp.model import Model
# Data
Buses=[
(40,500),
(30,400),
(35,450),
(20,300)
]
nbKids=300
# Indexes
busSize=0;
busCost=1;
for b in Buses:
print("buses with ",b[busSize]," seats cost ",b[busCost])
print()
mdl = Model(name='buses')
#decision variables
mdl.nbBus=mdl.integer_var_dict(Buses,name="nbBus")
# Constraint
mdl.add_constraint(mdl.sum(mdl.nbBus[b]*b[busSize] for b in Buses) >= nbKids, 'kids')
# Objective
mdl.minimize(sum(mdl.nbBus[b]*b[busCost] for b in Buses))
mdl.solve()
# Display solution
for b in Buses:
print(mdl.nbBus[b].solution_value," buses with ",b[busSize]," seats");
#Add a constraint
# Number of sizes where we have 1 or 2 buses should be at least 3
mdl.add(mdl.sum(mdl.logical_and(1<=mdl.nbBus[b],mdl.nbBus[b]<=2) for b in Buses) >=3)
mdl.solve()
print()
print("Number of sizes where we have 1 or 2 buses should be at least 3")
print()
# Display solution
for b in Buses:
print(mdl.nbBus[b].solution_value," buses with ",b[busSize]," seats");
in OPL I would write
using CP;
int N=4;
int n=2;
dvar interval itvs;
dvar interval arr[1..N];
subject to
{
(sum(i in 1..N) (1<=overlapLength(itvs,arr[i])))>=n;
}
and the same can be done with all APIs