There are two planning variables A and B in one planning entity C. And there are some relationships between A and B: relationship1: when A is in scope (A1 ... A10), B must be in scope (B1 ... B3). relationship2: when A is in scope (A11 ... A15), B must be in scope (B4).
And now we use value range providers in C:
class C{
@PlanningVariable private A a;
@ValueRangeProvider private List<A> aScope; //A1 ... A15
@PlanningVariable
private B b;
@ValueRangeProvider private List<B> bScope; // B1 ... B4
}
we use a hardConstraint constraintD to constrain the above relationships. But we found in Debug log: if there is a planning entity c, c.a == A1, c.b == B1: when timefold doing moving, it will try change c.a = A11, but c.b is still B1 so that it will break hard constraint D, so this move will not be accepted. Such and such, it will not try to change c from relationship1 to relationship2.
we try to use the unionMoveSelector, but it still not work on above scenario.
are there any suggestion about this problem?
The generic moves Timefold Solver offers are not aware of the fact that these two variables should be changed only together. Correct assignment is then unlikely.
In this situation, I would recommend implementing a custom move that contains the logic for correctly assigning both variables.
To achieve best results, the custom move should assign only values that don't break hard constraints.