Dear Renaud,
Thank you for your support. I hope it will be easy to fix it.
I wanted to continue the investigation and I've written the model using docplex (Python API). It was surprised me - the solution was correct. Maybe it can help you to investigate the reason of the solver behaviour when the model is written on OPL.
Here is my code:
import docplex.cp.model as cp_model
changes = [[0, 0, 20], [0, 0, 0], [0, 0, 0]]
mdl = cp_model.CpoModel("NoOverlap, transition matrix, isDirect=1")
a = mdl.interval_var(name="a", size=5)
b = mdl.interval_var(name="b", size=5)
c = mdl.interval_var(name="c", size=5)
seq = mdl.sequence_var(name="seq", vars=[a, b, c], types=[0, 1, 2])
mdl.add(mdl.minimize(mdl.end_of(c)))
mdl.add(mdl.no_overlap(seq, changes, True))
mdl.add(mdl.start_before_start(a, b))
mdl.add(mdl.start_before_start(b, c))
msol = mdl.solve(trace_log=False)
if msol is not None and msol.is_solution():
print("{}".format(msol.get_var_solution(a)))
print("{}".format(msol.get_var_solution(b)))
print("{}".format(msol.get_var_solution(c)))
Regards,
------------------------------
Rustam Salikhov
------------------------------
Original Message:
Sent: Thu June 02, 2022 10:23 AM
From: Renaud Dumeur
Subject: CP Optimizer: wrong solution when use noOverlap constraint, transition matrix and isDirect=1
Dear Rustam,
It really looks like a bug happening when a single transition time is specified.
I've added an extra interval and a transition time of 1 to it, and with isDirect=true, we have a correct solution:
using CP;tuple changes_type{ int id1; int id2; int value; };{changes_type} changes = { <1, 3, 20>, <3,4,1> };//{changes_type} changes = { <1, 3, 20> };dvar interval a size 5;dvar interval b size 5;dvar interval c size 5;dvar interval d size 5;dvar sequence seq in append(a, b, c, d) types append(1, 2, 3, 4);minimize endOf(c);subject to {noOverlap(seq, changes, true);startBeforeStart(a, b);startBeforeStart(b, c);startBeforeStart(c, d); } execute { writeln("a", a); writeln("b", b); writeln("c", c); writeln("d", d); }
but note that a zero duration transition from c to d would trigger the bug again.
Thank you for notifying us.
Cheers,
------------------------------
Renaud Dumeur
Original Message:
Sent: Thu June 02, 2022 06:43 AM
From: Rustam Salikhov
Subject: CP Optimizer: wrong solution when use noOverlap constraint, transition matrix and isDirect=1
Hi everyone,
I have found the situation when function noOverlap with flag isDirect=1 works incorrect. The solution should be a=[0, 5), b=[5, 10), c=[10, 15). But the model gives a=[0, 5), b=[5, 10), c=[25, 30) - as if I use isDirect=0.
It is a bug or maybe I'm doing smth wrong?
Model:
using CP;
tuple changes_type{ int id1; int id2; int value; };
{changes_type} changes = { <1, 3, 20> };
dvar interval a size 5;
dvar interval b size 5;
dvar interval c size 5;
dvar sequence seq in append(a, b, c) types append(1, 2, 3);
minimize endOf(c);
subject to {
noOverlap(seq, changes, true);
startBeforeStart(a, b);
startBeforeStart(b, c);
}
CPLEX version: 20.1.0.0
------------------------------
Rustam Salikhov
------------------------------